57 lines
1.6 KiB
TypeScript
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`
|
|
}
|