36 lines
1.1 KiB
TypeScript
36 lines
1.1 KiB
TypeScript
export function formatDuration(ms: number | null | undefined): string {
|
|
if (!ms || ms <= 0) return "--:--";
|
|
const total = Math.floor(ms / 1000);
|
|
const m = Math.floor(total / 60);
|
|
const s = total % 60;
|
|
return `${m}:${s.toString().padStart(2, "0")}`;
|
|
}
|
|
|
|
export function formatTime(seconds: number): string {
|
|
if (!Number.isFinite(seconds) || seconds < 0) seconds = 0;
|
|
const total = Math.floor(seconds);
|
|
const m = Math.floor(total / 60);
|
|
const s = total % 60;
|
|
return `${m}:${s.toString().padStart(2, "0")}`;
|
|
}
|
|
|
|
export function formatDate(value: string | null | undefined): string {
|
|
if (!value) return "";
|
|
const d = new Date(value);
|
|
if (Number.isNaN(d.getTime())) return value;
|
|
return d.toLocaleDateString("ru-RU", { year: "numeric", month: "long", day: "numeric" });
|
|
}
|
|
|
|
export function initials(name: string | null | undefined): string {
|
|
if (!name) return "?";
|
|
return name
|
|
.split(/\s+/)
|
|
.slice(0, 2)
|
|
.map((p) => p[0]?.toUpperCase() ?? "")
|
|
.join("");
|
|
}
|
|
|
|
export function cx(...parts: (string | false | null | undefined)[]): string {
|
|
return parts.filter(Boolean).join(" ");
|
|
}
|