44 lines
1.4 KiB
TypeScript
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');
|
|
}
|