{"version":3,"file":"Duration.jsx","names":["memo","Duration","durationFormatters","year","month","week","day","hour","minute","second","millisecond","t0","$","_c","seconds","display","maxDigits","t1","t2","t3","formatDuration","t4","unitDisplay","ms","unit","thresholdStr","Object","entries","threshold","Number","getFormatter","format","formatterCache","fu","fun","Intl","NumberFormat","style","maximumFractionDigits"],"sources":["../src/Duration.tsx"],"sourcesContent":["import { memo } from \"react\";\n\nexport type UnitDisplay = NonNullable<Intl.NumberFormatOptions[\"unitDisplay\"]>;\n\nexport interface DurationProps {\n\tseconds: number;\n\tdisplay: UnitDisplay;\n\tmaxDigits?: number;\n}\n\nexport default memo(Duration);\n\ntype Unit =\n\t| \"year\"\n\t| \"month\"\n\t| \"week\"\n\t| \"day\"\n\t| \"hour\"\n\t| \"minute\"\n\t| \"second\"\n\t| \"millisecond\";\n\n/**\n * Constants will be folded by the bundler\n *\n * Values taken from:\n * https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier\n *\n * TODO: Maybe use https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DurationFormat one day\n */\nconst durationFormatters = {\n\tyear: 1000 * 60 * 60 * 24 * 365,\n\tmonth: 1000 * 60 * 60 * 24 * 30,\n\tweek: 1000 * 60 * 60 * 24 * 7,\n\tday: 1000 * 60 * 60 * 24,\n\thour: 1000 * 60 * 60,\n\tminute: 1000 * 60,\n\tsecond: 1000,\n\tmillisecond: 1,\n} satisfies Record<Unit, number>;\n\nfunction Duration({ seconds, display, maxDigits }: DurationProps) {\n\t// <time> can also be used for durations:\n\t// https://stackoverflow.com/a/31591343\n\treturn (\n\t\t<time dateTime={`${seconds}s`}>\n\t\t\t{formatDuration(seconds, display, maxDigits ?? 0)}\n\t\t</time>\n\t);\n}\n\nfunction formatDuration(\n\tseconds: number,\n\tunitDisplay: UnitDisplay,\n\tmaxDigits: number,\n) {\n\tconst ms = seconds * 1000;\n\n\tfor (const [unit, thresholdStr] of Object.entries(durationFormatters)) {\n\t\tconst threshold = Number(thresholdStr);\n\t\tif (ms >= threshold) {\n\t\t\treturn getFormatter(unit as Unit, unitDisplay, maxDigits).format(\n\t\t\t\tms / threshold,\n\t\t\t);\n\t\t}\n\t}\n\treturn getFormatter(\"second\", unitDisplay, maxDigits).format(ms);\n}\n\nconst formatterCache: Partial<\n\tRecord<\n\t\tUnitDisplay,\n\t\tPartial<Record<Unit, Record<number, Intl.NumberFormat>>>\n\t>\n> = {};\n\nfunction getFormatter(\n\tunit: Unit,\n\tunitDisplay: UnitDisplay,\n\tmaxDigits: number,\n): Intl.NumberFormat {\n\t// biome-ignore lint/suspicious/noAssignInExpressions: Ok here\n\tconst fu = (formatterCache[unitDisplay] ??= {});\n\t// biome-ignore lint/suspicious/noAssignInExpressions: Ok here\n\tconst fun = (fu[unit] ??= {});\n\t// biome-ignore lint/suspicious/noAssignInExpressions: Ok here\n\treturn (fun[maxDigits] ??= new Intl.NumberFormat(\"de-DE\", {\n\t\tstyle: \"unit\",\n\t\tunit,\n\t\tunitDisplay,\n\t\tmaximumFractionDigits: maxDigits,\n\t}));\n}\n"],"mappings":"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","ignoreList":[]}