an atproto based link aggregator
at main 45 lines 1.5 kB view raw
1/** 2 * Formatting utilities 3 */ 4 5/** 6 * Format a date as a relative time string. 7 * @param dateString - ISO date string 8 * @param compact - If true, use compact format ("2d" vs "2 days ago") 9 */ 10export function formatTimeAgo(dateString: string, compact = false): string { 11 const date = new Date(dateString); 12 const now = new Date(); 13 const diffMs = now.getTime() - date.getTime(); 14 const diffMins = Math.floor(diffMs / 60000); 15 const diffHours = Math.floor(diffMs / 3600000); 16 const diffDays = Math.floor(diffMs / 86400000); 17 18 if (compact) { 19 if (diffMins < 1) return 'now'; 20 if (diffMins < 60) return `${diffMins}m`; 21 if (diffHours < 24) return `${diffHours}h`; 22 if (diffDays < 7) return `${diffDays}d`; 23 if (diffDays < 365) 24 return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' }); 25 return date.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' }); 26 } 27 28 if (diffMins < 1) return 'just now'; 29 if (diffMins < 60) return `${diffMins} minute${diffMins === 1 ? '' : 's'} ago`; 30 if (diffHours < 24) return `${diffHours} hour${diffHours === 1 ? '' : 's'} ago`; 31 if (diffDays === 1) return 'yesterday'; 32 if (diffDays < 30) return `${diffDays} day${diffDays === 1 ? '' : 's'} ago`; 33 return date.toLocaleDateString(); 34} 35 36/** 37 * Extract the domain from a URL, removing "www." prefix 38 */ 39export function getDomain(url: string): string { 40 try { 41 return new URL(url).hostname.replace(/^www\./, ''); 42 } catch { 43 return url; 44 } 45}