/** * Side-effect module: pins every Intl-based date/time display to East Africa * Time (UTC+3) so all users see the same wall-clock times no matter what * timezone their PC is set to. Import it FIRST in the app entry, before any * other app module, so no module-scope formatter is created unpatched: * * import "@edr/ui-common/display-timezone"; * * Call sites that pass an explicit `timeZone` option keep it. date-fns and * dayjs `format()` do NOT go through Intl and stay PC-local — don't use them * to display API timestamps. */ export const DISPLAY_TIME_ZONE = "Africa/Addis_Ababa"; type Locales = string | string[] | undefined; type LocaleMethod = ( this: Date, locales?: Locales, options?: Intl.DateTimeFormatOptions, ) => string; function pinned(original: LocaleMethod): LocaleMethod { return function (locales, options) { return original.call(this, locales, { ...options, timeZone: options?.timeZone ?? DISPLAY_TIME_ZONE, }); }; } Date.prototype.toLocaleString = pinned(Date.prototype.toLocaleString); Date.prototype.toLocaleDateString = pinned(Date.prototype.toLocaleDateString); Date.prototype.toLocaleTimeString = pinned(Date.prototype.toLocaleTimeString); const OriginalDateTimeFormat = Intl.DateTimeFormat; function PinnedDateTimeFormat( locales?: Locales, options?: Intl.DateTimeFormatOptions, ): Intl.DateTimeFormat { return new OriginalDateTimeFormat(locales, { ...options, timeZone: options?.timeZone ?? DISPLAY_TIME_ZONE, }); } // Keep `instanceof Intl.DateTimeFormat` and the static method working. PinnedDateTimeFormat.prototype = OriginalDateTimeFormat.prototype; PinnedDateTimeFormat.supportedLocalesOf = OriginalDateTimeFormat.supportedLocalesOf; Intl.DateTimeFormat = PinnedDateTimeFormat as unknown as typeof Intl.DateTimeFormat;