diff --git a/frontend/src/ts/utils/date-and-time.ts b/frontend/src/ts/utils/date-and-time.ts index fc79dd3c4..1ca2fdb62 100644 --- a/frontend/src/ts/utils/date-and-time.ts +++ b/frontend/src/ts/utils/date-and-time.ts @@ -1,6 +1,6 @@ import { roundTo2 } from "@monkeytype/util/numbers"; import { Day } from "date-fns"; -import * as Locales from "date-fns/locale"; + /** * Converts seconds to a human-readable string representation of time. * @param sec The number of seconds to convert. @@ -106,6 +106,115 @@ export function secondsToString( return ret.trim(); } +/* +generated by +import * as Locales from "date-fns/locale"; +const result = {}; + for (const locale of Object.keys(Locales)) { + // @ts-ignore + const data = Locales[locale] as Locales.Locale; + result[locale] = (data.options?.weekStartsOn as number) % 7; + } + */ + +const weekStartsOnFallback: Record = { + af: 0, + ar: 6, + arDZ: 0, + arEG: 0, + arMA: 1, + arSA: 0, + arTN: 1, + az: 1, + be: 1, + beTarask: 1, + bg: 1, + bn: 0, + bs: 1, + ca: 1, + ckb: 0, + cs: 1, + cy: 0, + da: 1, + de: 1, + deAT: 1, + el: 1, + enAU: 1, + enCA: 0, + enGB: 1, + enIE: 1, + enIN: 1, + enNZ: 1, + enUS: 0, + enZA: 0, + eo: 1, + es: 1, + et: 1, + eu: 1, + faIR: 6, + fi: 1, + fr: 1, + frCA: 0, + frCH: 1, + fy: 1, + gd: 0, + gl: 1, + gu: 1, + he: 0, + hi: 0, + hr: 1, + ht: 1, + hu: 1, + hy: 1, + id: 1, + is: 1, + it: 1, + itCH: 1, + ja: 0, + jaHira: 0, + ka: 1, + kk: 1, + km: 0, + kn: 1, + ko: 0, + lb: 1, + lt: 1, + lv: 1, + mk: 1, + mn: 1, + ms: 1, + mt: 1, + nb: 1, + nl: 1, + nlBE: 1, + nn: 1, + oc: 1, + pl: 1, + pt: 1, + ptBR: 0, + ro: 1, + ru: 1, + se: 1, + sk: 1, + sl: 1, + sq: 1, + sr: 1, + srLatn: 1, + sv: 1, + ta: 1, + te: 0, + th: 0, + tr: 1, + ug: 0, + uk: 1, + uz: 1, + uzCyrl: 1, + vi: 1, + zhCN: 1, + zhHK: 0, + zhTW: 1, +}; + export function getFirstDayOfTheWeek(): Day { if (navigator.language === undefined || navigator.language === null) { return 0; @@ -128,20 +237,16 @@ export function getFirstDayOfTheWeek(): Day { return (locale.getWeekInfo().firstDay as number) % 7; } - //use date-fns for browsers like firefox - // @ts-ignore - let dateFnsLocale = Locales[ - navigator.language.replaceAll("-", "") - ] as Locales.Locale; - - if (dateFnsLocale === undefined || dateFnsLocale === null) { - //retry with language only - // @ts-ignore - dateFnsLocale = Locales[navigator.language.split("-")[0]] as Locales.Locale; + //use fallback generated from date-fns for browsers like firefox + let fallback = weekStartsOnFallback[navigator.language.replaceAll("-", "")]; + if (fallback !== undefined) { + return fallback; } - if (dateFnsLocale !== undefined && dateFnsLocale !== null) { - return ((dateFnsLocale.options?.weekStartsOn ?? 0) % 7) as Day; + //retry with language only + fallback = weekStartsOnFallback[navigator.language.split("-")[0] as string]; + if (fallback !== undefined) { + return fallback; } return 0; //start on sunday