import { differenceInCalendarDays, differenceInCalendarYears } from 'date-fns' import * as React from 'react' import { TimeAgo } from './TimeAgo' export type DateFormatProps = { /** Date object to format */ date?: Date /** Defaults to en-US */ locale?: string | string[] /** Switch to for relative formating */ nice?: boolean /** Date formatting options */ options?: Intl.DateTimeFormatOptions } const defaultOptions = { weekday: 'short', month: 'short', day: 'numeric', } export function DateFormat({ date = new Date(), locale = 'en-US', options = null, nice = false, }: DateFormatProps) { if (nice) { return {date} } // @ts-ignore let finalOptions: Intl.DateTimeFormatOptions = { ...defaultOptions, ...options, } if (differenceInCalendarYears(date, Date.now()) > 0) { finalOptions.year = '2-digit' delete finalOptions.weekday } else if (differenceInCalendarDays(date, Date.now()) < 7) { finalOptions.weekday = 'short' } let formatted if (date.toLocaleDateString) { formatted = date .toLocaleDateString(locale, finalOptions) .replace(/,.*,/, ',') .replace(/\//g, 'ยท') } else { console.warn('invalid date', date) formatted = `${date}` } // TODO wait for https://github.com/DefinitelyTyped/DefinitelyTyped/issues/20544 to fix type return formatted as any }