| |
| |
| |
| |
| |
| |
| import { format, isToday, isYesterday, isThisYear, parseISO } from 'date-fns'; |
|
|
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export function formatRelativeTime(dateStr: string): string { |
| const date = parseISO(dateStr); |
| const now = new Date(); |
| const diffMs = now.getTime() - date.getTime(); |
| const diffSec = Math.floor(diffMs / 1000); |
| const absDiffSec = Math.abs(diffSec); |
|
|
| |
| if (diffSec < 0) { |
| if (absDiffSec < 60) return 'in a moment'; |
| if (absDiffSec < 3600) { |
| const mins = Math.floor(absDiffSec / 60); |
| return `in ${mins} min`; |
| } |
| if (absDiffSec < 86400) { |
| const hrs = Math.floor(absDiffSec / 3600); |
| return `in ${hrs} hr${hrs > 1 ? 's' : ''}`; |
| } |
| return formatDate(dateStr); |
| } |
|
|
| |
| if (diffSec < 60) return 'just now'; |
|
|
| const diffMin = Math.floor(diffSec / 60); |
| if (diffMin < 60) return `${diffMin} min ago`; |
|
|
| const diffHr = Math.floor(diffMin / 60); |
| if (diffHr < 24) return `${diffHr} hr${diffHr > 1 ? 's' : ''} ago`; |
|
|
| if (isYesterday(date)) return 'Yesterday'; |
|
|
| const diffDays = Math.floor(diffHr / 24); |
| if (diffDays < 7) return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`; |
|
|
| |
| if (isThisYear(date)) return format(date, 'MMM d'); |
| return format(date, 'MMM d, yyyy'); |
| } |
|
|
| |
|
|
| |
| |
| |
| export function formatDate(dateStr: string): string { |
| const date = parseISO(dateStr); |
| return format(date, 'MMM d, yyyy'); |
| } |
|
|
| |
| |
| |
| export function formatDateTime(dateStr: string): string { |
| const date = parseISO(dateStr); |
| if (isThisYear(date)) { |
| return format(date, 'MMM d \'at\' h:mm a'); |
| } |
| return format(date, 'MMM d, yyyy \'at\' h:mm a'); |
| } |
|
|
| |
|
|
| |
| |
| |
| export function formatTime(dateStr: string): string { |
| const date = parseISO(dateStr); |
| return format(date, 'h:mm a'); |
| } |
|
|
| |
| |
| |
| export function formatTimeWithSeconds(dateStr: string): string { |
| const date = parseISO(dateStr); |
| return format(date, 'h:mm:ss a'); |
| } |
|
|
| |
|
|
| |
| |
| |
| export function formatDayLabel(dateStr: string): string { |
| const date = parseISO(dateStr); |
| if (isToday(date)) return 'Today'; |
| if (isYesterday(date)) return 'Yesterday'; |
| if (isThisYear(date)) return format(date, 'EEEE, MMM d'); |
| return format(date, 'EEEE, MMM d, yyyy'); |
| } |
|
|
| |
| |
| |
| export function formatChatTimestamp(dateStr: string): string { |
| const date = parseISO(dateStr); |
| if (isToday(date)) return format(date, 'HH:mm'); |
| if (isYesterday(date)) return 'Yesterday'; |
| if (isThisYear(date)) return format(date, 'd MMM'); |
| return format(date, 'd MMM yyyy'); |
| } |
|
|
| |
| |
| |
| |
| export function formatDuration(minutes: number): string { |
| if (minutes < 1) return '< 1 min'; |
| const hrs = Math.floor(minutes / 60); |
| const mins = Math.round(minutes % 60); |
| if (hrs === 0) return `${mins} min`; |
| if (mins === 0) return `${hrs} hr`; |
| return `${hrs} hr ${mins} min`; |
| } |
|
|