Files
casadoc-app/src/lib/format.ts
T
2026-08-26 23:01:07 +03:00

44 lines
1.4 KiB
TypeScript

import { currentLocale, t } from '@/i18n';
export function formatBytes(bytes?: number | null): string {
if (!bytes || bytes <= 0) return '—';
const mb = bytes / (1024 * 1024);
if (mb >= 1) return `${mb.toFixed(1)} MB`;
const kb = bytes / 1024;
return `${Math.max(1, Math.round(kb))} KB`;
}
/** Locale-aware short date, e.g. "12 Jun 2026" / "12 giu 2026". */
export function formatDate(iso?: string | null): string {
if (!iso) return '—';
const d = new Date(iso);
if (Number.isNaN(d.getTime())) return iso;
try {
return d.toLocaleDateString(currentLocale(), {
day: '2-digit',
month: 'short',
year: 'numeric',
});
} catch {
return d.toISOString().slice(0, 10);
}
}
/** Whole days from now until `iso` (negative = past). */
export function daysUntil(iso?: string | null): number | null {
if (!iso) return null;
const d = new Date(iso);
if (Number.isNaN(d.getTime())) return null;
return Math.ceil((d.getTime() - Date.now()) / 86_400_000);
}
/** Short human expiry label, e.g. "24 days", "Expired", "Valid". */
export function expiryLabel(status?: string | null, expiryDate?: string | null): string {
if (status === 'expired') return t('expiry.expired');
if (status === 'expiring') {
const days = daysUntil(expiryDate);
return days != null && days >= 0 ? t('expiry.days', { count: days }) : t('expiry.expiring');
}
return t('expiry.valid');
}