an atproto based link aggregator
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}