64 lines
2.1 KiB
TypeScript
64 lines
2.1 KiB
TypeScript
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
|
|
}
|