Files
kycnotme/web/src/lib/timeAgo.ts
2025-06-15 13:18:22 +00:00

57 lines
1.6 KiB
TypeScript

import { addDays, differenceInDays, format, isBefore, isToday, isYesterday } from 'date-fns'
import TimeAgo from 'javascript-time-ago'
import en from 'javascript-time-ago/locale/en'
import { transformCase, type TransformCaseType } from './strings'
TimeAgo.addDefaultLocale(en)
export const timeAgo = new TimeAgo('en-US')
export type FormatDateShortOptions = {
prefix?: boolean
hourPrecision?: boolean
daysUntilDate?: number | null
caseType?: TransformCaseType
hoursShort?: boolean
}
export function formatDateShort(
date: Date,
{
prefix = true,
hourPrecision = true,
daysUntilDate = null,
caseType,
hoursShort = false,
}: FormatDateShortOptions = {}
) {
const text = (() => {
if (isToday(date)) {
if (hourPrecision) return timeAgo.format(date, hoursShort ? 'twitter-minute-now' : 'round-minute')
return 'today'
}
if (isYesterday(date)) return 'yesterday'
if (daysUntilDate && isBefore(date, addDays(new Date(), daysUntilDate))) {
return timeAgo.format(date, 'round-minute')
}
const currentYear = new Date().getFullYear()
const dateYear = date.getFullYear()
const formattedDate = dateYear === currentYear ? format(date, 'MMM d') : format(date, 'MMM d, yyyy')
return prefix ? `on ${formattedDate}` : formattedDate
})()
if (!caseType) return text
return transformCase(text, caseType)
}
export function formatDaysAgo(approvedAt: Date) {
const days = differenceInDays(new Date(), approvedAt)
if (days === 0) return 'today'
if (days === 1) return 'yesterday'
return `${days.toLocaleString()} days ago`
}