type RelativeTimeInput = string | number | Date | null | undefined; const relativeTimeFormatter = new Intl.RelativeTimeFormat("en", { numeric: "auto" }); const parseRelativeTime = (value: RelativeTimeInput) => { if (value === null || value === undefined) { return null; } const date = value instanceof Date ? value : new Date(value); const timestamp = date.getTime(); if (Number.isNaN(timestamp)) { return null; } return timestamp; }; export const formatRelativeTime = (value: RelativeTimeInput) => { const timestamp = parseRelativeTime(value); if (timestamp === null) { return null; } const diffSeconds = Math.round((timestamp - Date.now()) / 1000); const absSeconds = Math.abs(diffSeconds); if (absSeconds < 60) { return relativeTimeFormatter.format(diffSeconds, "second"); } const diffMinutes = Math.round(diffSeconds / 60); if (Math.abs(diffMinutes) < 60) { return relativeTimeFormatter.format(diffMinutes, "minute"); } const diffHours = Math.round(diffMinutes / 60); if (Math.abs(diffHours) < 24) { return relativeTimeFormatter.format(diffHours, "hour"); } const diffDays = Math.round(diffHours / 24); if (Math.abs(diffDays) < 30) { return relativeTimeFormatter.format(diffDays, "day"); } const diffMonths = Math.round(diffDays / 30); if (Math.abs(diffMonths) < 12) { return relativeTimeFormatter.format(diffMonths, "month"); } const diffYears = Math.round(diffDays / 365); return relativeTimeFormatter.format(diffYears, "year"); };