const numberFormatter = new Intl.NumberFormat("en-GB", { maximumFractionDigits: 2, minimumFractionDigits: 0 }) const dateFormatter = new Intl.DateTimeFormat("en-GB", { year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit", hour12: false }) export function formatNumber(num: number) { return numberFormatter.format(num) } export function formatDate(timestamp: number) { return dateFormatter.format(new Date(timestamp)) } export function formatSecondsToTime(seconds: number) { if (!Number.isFinite(seconds)) return "0s" seconds = Math.floor(Math.max(0, seconds)) const days = Math.floor(seconds / 86400) const hours = Math.floor((seconds % 86400) / 3600) const minutes = Math.floor((seconds % 3600) / 60) const secs = seconds % 60 const parts: string[] = [] if (days) parts.push(days + "d") if (hours) parts.push(hours + "h") if (minutes) parts.push(minutes + "m") if (secs || parts.length === 0) parts.push(secs + "s") if (parts.length === 1) return parts[0] if (parts.length === 2) return parts[0] + " and " + parts[1] // For 3+ parts: separate first n-1 by comma+space, last preceded by 'and' return parts.slice(0, -1).join(", ") + " and " + parts[parts.length - 1] } export function formatRelativeTime(timestamp: number, type: "past" | "future") { const now = Date.now() let diffMs = timestamp - now const past = diffMs < 0 diffMs = Math.abs(diffMs) const suffixString = type === "past" ? " ago" : "" const seconds = Math.floor(diffMs / 1000) const days = Math.floor(seconds / 86400) const hours = Math.floor((seconds % 86400) / 3600) const minutes = Math.floor((seconds % 3600) / 60) const secs = seconds % 60 const parts: string[] = [] if (days) parts.push(days + " days,") if (hours) parts.push(hours + " hours,") if (minutes) parts.push(minutes + " minutes and") if (!parts.length || secs) parts.push(secs + " seconds") const str = parts.slice(0, 4).join(" ") return past ? str + suffixString : "in " + str }