{"version":3,"file":"DateTimeCountdown.jsx","names":["memo","useCallback","useMemo","useState","useInterval","nativeDurationFormat","Intl","DurationFormat","style","undefined","absoluteDateFormatter","DateTimeFormat","dateStyle","formatTimeRemaining","timeLeftSeconds","trimLeadingZeros","days","hours","minutes","seconds","toFormat","res","format","DateTimeCountdown","props","$","_c","now","Date","targetTimestamp","secondsRemaining","setSecondsRemaining","t0","cb","onZero","placeholder","t1","t2","t3","t4","targetDateTime","toISOString","t5","isoString","userReadable","t6","t7","t8","t9","formatted","t10","prefix"],"sources":["../src/DateTimeCountdown.tsx"],"sourcesContent":["import { memo, useCallback, useMemo, useState } from \"react\";\nimport useInterval from \"./useInterval\";\n\nexport type DateTimeCountdownProps =\n\t| PlaceholderDateTimeCountdownProps\n\t| HiddenDateTimeCountdownProps\n\t| ContinueDateTimeCountdownProps;\n\nexport interface BaseDateTimeCountdownProps {\n\t/**\n\t * Server-sent Timestamp that was fetched from the backend. **Unix time in seconds**.\n\t * @remarks We use a `number` instead of `Date` because `Date`s are objects and would cause unnecessary re-renders. `number`s are easier to memoize and to compare.\n\t */\n\ttargetTimestamp: number;\n\t/**\n\t * What to prefix the countdown with when it is not zero.\n\t */\n\tprefix?: string;\n\ttrimLeadingZeros?: boolean;\n}\n\nexport interface PlaceholderDateTimeCountdownProps\n\textends BaseDateTimeCountdownProps {\n\tonZero: \"placeholder\";\n\tplaceholder: string;\n}\n\nexport interface HiddenDateTimeCountdownProps\n\textends BaseDateTimeCountdownProps {\n\tonZero: \"hide\";\n}\n\nexport interface ContinueDateTimeCountdownProps\n\textends BaseDateTimeCountdownProps {\n\tonZero: \"continue\";\n}\n\nconst nativeDurationFormat =\n\t// @ts-expect-error: Remove this suppression when TS ships with\n\ttypeof Intl.DurationFormat === \"function\" // @ts-expect-error: Remove this suppression when TS ships with Intl.DurationFormat\n\t\t? new Intl.DurationFormat([\"de\", \"en\"], { style: \"narrow\" })\n\t\t: undefined;\n\nconst absoluteDateFormatter = new Intl.DateTimeFormat([\"de\", \"en\"], {\n\tdateStyle: \"long\",\n});\n\nfunction formatTimeRemaining(\n\ttimeLeftSeconds: number,\n\ttrimLeadingZeros: boolean,\n): string {\n\tconst days = (timeLeftSeconds / (60 * 60 * 24)) | 0;\n\tconst hours = ((timeLeftSeconds % (60 * 60 * 24)) / (60 * 60)) | 0;\n\tconst minutes = ((timeLeftSeconds % (60 * 60)) / 60) | 0;\n\tconst seconds = (timeLeftSeconds % 60) | 0;\n\n\t// Docs:\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DurationFormat\n\tconst toFormat: Record<string, number | undefined> = {\n\t\tdays,\n\t\thours,\n\t\tminutes,\n\t\tseconds,\n\t};\n\n\tif (trimLeadingZeros) {\n\t\ttoFormat.days = days === 0 ? undefined : days;\n\t\ttoFormat.hours =\n\t\t\thours === 0 && toFormat.days === undefined ? undefined : hours;\n\t\ttoFormat.minutes =\n\t\t\tminutes === 0 && toFormat.hours === undefined ? undefined : minutes;\n\t}\n\n\tif (!nativeDurationFormat) {\n\t\tif (trimLeadingZeros) {\n\t\t\tlet res = \"\";\n\t\t\tif (toFormat.days !== undefined) {\n\t\t\t\tres += `${toFormat.days}d `;\n\t\t\t}\n\t\t\tif (toFormat.hours !== undefined && toFormat.days !== undefined) {\n\t\t\t\tres += `${toFormat.hours}h `;\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttoFormat.minutes !== undefined &&\n\t\t\t\ttoFormat.hours !== undefined\n\t\t\t) {\n\t\t\t\tres += `${toFormat.minutes}m `;\n\t\t\t}\n\t\t\tres += `${toFormat.seconds}s`; // seconds are always shown\n\t\t\treturn res;\n\t\t}\n\n\t\treturn `${days}d ${hours}h ${minutes}m ${seconds}s`;\n\t}\n\n\treturn nativeDurationFormat.format(toFormat);\n}\n\nexport default memo(function DateTimeCountdown(props: DateTimeCountdownProps) {\n\tconst now = (Date.now() / 1000) | 0;\n\tconst targetTimestamp = props.targetTimestamp;\n\n\tconst [secondsRemaining, setSecondsRemaining] = useState<number>(\n\t\ttargetTimestamp - now,\n\t);\n\n\tconst cb = useCallback(() => {\n\t\tsetSecondsRemaining((targetTimestamp - Date.now() / 1000) | 0);\n\t}, [targetTimestamp]);\n\n\tuseInterval(cb, 1000);\n\n\tif (secondsRemaining <= 0) {\n\t\tswitch (props.onZero) {\n\t\t\tcase \"placeholder\":\n\t\t\t\treturn props.placeholder;\n\t\t\tcase \"hide\":\n\t\t\t\treturn undefined;\n\t\t\tcase \"continue\":\n\t\t\t\t// continue to return below to show the countdown even when it reaches zero\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst [isoString, userReadable] = useMemo(() => {\n\t\tconst targetDateTime = new Date(targetTimestamp * 1000);\n\t\treturn [\n\t\t\ttargetDateTime.toISOString(),\n\t\t\tabsoluteDateFormatter.format(targetDateTime),\n\t\t];\n\t}, [targetTimestamp]);\n\n\tconst formatted = (\n\t\t<time dateTime={isoString} title={`Countdown bis zum ${userReadable}`}>\n\t\t\t{formatTimeRemaining(secondsRemaining, !!props.trimLeadingZeros)}\n\t\t</time>\n\t);\n\n\treturn props.prefix ? (\n\t\t<>\n\t\t\t{props.prefix}\n\t\t\t{formatted}\n\t\t</>\n\t) : (\n\t\tformatted\n\t);\n});\n"],"mappings":"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","ignoreList":[]}