38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
import dayjs from "dayjs";
|
|
import type { UnitTypeShort } from "dayjs";
|
|
import isBetween from "dayjs/plugin/isBetween";
|
|
|
|
dayjs.extend(isBetween);
|
|
|
|
const validUnits = ["h", "d", "w", "M", "y"] as UnitTypeShort[];
|
|
|
|
export function formatDuration(milliseconds: number) {
|
|
const totalSeconds = Math.floor(milliseconds / 1000);
|
|
const hours = Math.floor(totalSeconds / 3600);
|
|
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
const seconds = totalSeconds % 60;
|
|
if (hours > 0) {
|
|
return `${hours}:${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}`;
|
|
}
|
|
return `${minutes}:${String(seconds).padStart(2, "0")}`;
|
|
}
|
|
|
|
export const isDateWithin = (date: Date, relativeDate: string): boolean => {
|
|
if (relativeDate.length < 2) {
|
|
throw new Error("Relative date must be at least 2 characters long");
|
|
}
|
|
|
|
const amount = parseInt(relativeDate.slice(0, -1), 10);
|
|
if (isNaN(amount) || amount <= 0) {
|
|
throw new Error("Relative date must be a number greater than 0");
|
|
}
|
|
|
|
const unit = relativeDate.slice(-1) as dayjs.UnitTypeShort;
|
|
if (!validUnits.includes(unit)) {
|
|
throw new Error("Invalid relative time unit");
|
|
}
|
|
|
|
const startDate = dayjs().subtract(amount, unit);
|
|
return dayjs(date).isBetween(startDate, dayjs(), null, "[]");
|
|
};
|