diff --git a/client/src/Utils/TimeUtils.ts b/client/src/Utils/TimeUtils.ts index d82649c81..2fc9412a4 100644 --- a/client/src/Utils/TimeUtils.ts +++ b/client/src/Utils/TimeUtils.ts @@ -120,30 +120,36 @@ const DURATION_UNITS: Array<{ unit: DurationUnit; milliseconds: number }> = [ { unit: "second", milliseconds: MS_PER_SECOND }, ]; +const FALLBACK_DURATION_UNIT = DURATION_UNITS[DURATION_UNITS.length - 1]; + const getDurationUnit = (ms: number) => DURATION_UNITS.find(({ milliseconds }) => Math.abs(ms) >= milliseconds) ?? - DURATION_UNITS[DURATION_UNITS.length - 1]; + FALLBACK_DURATION_UNIT; + +const getExactDurationUnit = (ms: number) => + DURATION_UNITS.find(({ milliseconds }) => ms !== 0 && ms % milliseconds === 0) ?? + FALLBACK_DURATION_UNIT; export const formatDuration = ( ms: number, { long = false, relative = false, hasSpace = true, locale }: FormatDurationOptions = {} ): string => { - if (long || relative) { + if (relative) { const { unit, milliseconds } = getDurationUnit(ms); const value = Math.sign(ms) * Math.floor(Math.abs(ms) / milliseconds); + return new Intl.RelativeTimeFormat(locale, { + numeric: "always", + style: long ? "long" : "narrow", + }).format(-value, unit); + } - if (relative) { - return new Intl.RelativeTimeFormat(locale, { - numeric: "always", - style: long ? "long" : "narrow", - }).format(-value, unit); - } - + if (long) { + const { unit, milliseconds } = getExactDurationUnit(ms); return new Intl.NumberFormat(locale, { style: "unit", unit, unitDisplay: "long", - }).format(value); + }).format(ms / milliseconds); } const formatted = prettyMilliseconds(ms, {