From c9e5ece185bdf331e2b2a0cffae5345b09699566 Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Mon, 23 Mar 2026 13:42:36 -0500 Subject: [PATCH] fix: guard frontend theme storage access --- assets/js/app.ts | 22 +++++++++++++++++++--- assets/js/map_helpers.ts | 2 ++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/assets/js/app.ts b/assets/js/app.ts index 80b2661..de42894 100644 --- a/assets/js/app.ts +++ b/assets/js/app.ts @@ -214,8 +214,24 @@ const applyTheme = (theme: string | null) => { } }; +const getStoredTheme = (): string => { + try { + return localStorage.getItem("theme") || "auto"; + } catch (_error) { + return "auto"; + } +}; + +const setStoredTheme = (theme: string) => { + try { + localStorage.setItem("theme", theme); + } catch (_error) { + // Ignore storage failures in restricted/private browsing contexts. + } +}; + // Apply initial theme from localStorage -applyTheme(localStorage.getItem("theme") || "auto"); +applyTheme(getStoredTheme()); const colorSchemeQuery = window.matchMedia ? window.matchMedia("(prefers-color-scheme: dark)") @@ -225,13 +241,13 @@ const colorSchemeQuery = window.matchMedia window.addEventListener("phx:set-theme", ((e: CustomEvent<{ theme: string }>) => { const theme = e.detail.theme; applyTheme(theme); - localStorage.setItem("theme", theme); + setStoredTheme(theme); window.dispatchEvent(new CustomEvent("themeChanged")); }) as EventListener); // Listen for system theme changes when auto is selected const handleSystemThemeChange = () => { - if (localStorage.getItem("theme") === "auto") { + if (getStoredTheme() === "auto") { applyTheme("auto"); window.dispatchEvent(new CustomEvent("themeChanged")); } diff --git a/assets/js/map_helpers.ts b/assets/js/map_helpers.ts index 5a00e70..d7f79fa 100644 --- a/assets/js/map_helpers.ts +++ b/assets/js/map_helpers.ts @@ -39,6 +39,8 @@ export function parseTimestamp(timestamp: string | number | Date | undefined): n return timestamp; } else if (typeof timestamp === "string") { return new Date(timestamp).getTime(); + } else if (timestamp instanceof Date) { + return timestamp.getTime(); } return Date.now(); }