import { clsx, type ClassValue } from 'clsx'; import { twMerge } from 'tailwind-merge'; import { type Timestamp } from '@/lib/types'; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } export const ccn = ({ context, className, on = '', off = '', }: { context: boolean; className: string; on: string; off: string; }) => { return twMerge(className, context ? on : off); }; const toDate = (ts: Timestamp): Date | null => { if (ts instanceof Date) return isNaN(ts.getTime()) ? null : ts; if (typeof ts === 'number') { // Heuristic: treat small numbers as seconds const ms = ts < 1_000_000_000_000 ? ts * 1000 : ts; const d = new Date(ms); return isNaN(d.getTime()) ? null : d; } // string: try numeric first, then ISO/date string const asNum = Number(ts); const d = Number.isFinite(asNum) && asNum !== 0 ? toDate(asNum) : new Date(ts); return d && !isNaN(d.getTime()) ? d : null; }; export const formatTime = (timestamp: Timestamp, locale = 'en-US'): string => { const date = toDate(timestamp); if (!date) return '--:--'; return date.toLocaleTimeString(locale, { hour: 'numeric', minute: 'numeric', }); }; export const formatDate = (timestamp: Timestamp, locale = 'en-US'): string => { const date = toDate(timestamp); if (!date) return '--/--'; return date.toLocaleDateString(locale, { month: 'long', day: 'numeric', }); };