From 402abf9e5a682e970d544f2c2c7077284c55a173 Mon Sep 17 00:00:00 2001 From: condyl Date: Tue, 20 Jan 2026 15:53:29 -0500 Subject: [PATCH] feat: persist theme mode --- src/main.jsx | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main.jsx b/src/main.jsx index 4ef9f2e..db53e51 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -10,12 +10,21 @@ import CustomSnackbarProvider from "@/components/sitewide/SnackbarProvider"; import ReactGA from "react-ga4"; import "@/styles/index.css"; +const THEME_STORAGE_KEY = "bt-theme-mode"; + const App = () => { useEffect(() => { if (!import.meta.env.PROD) return; ReactGA.initialize("G-M2NP1M6YSK"); }, []); const [mode, setMode] = useState(() => { + if (typeof window === "undefined") { + return "light"; + } + const storedMode = window.localStorage.getItem(THEME_STORAGE_KEY); + if (storedMode === "light" || storedMode === "dark") { + return storedMode; + } const prefersDark = window.matchMedia( "(prefers-color-scheme: dark)", ).matches; @@ -25,7 +34,13 @@ const App = () => { const colorMode = useMemo( () => ({ toggleColorMode: () => { - setMode((prevMode) => (prevMode === "light" ? "dark" : "light")); + setMode((prevMode) => { + const nextMode = prevMode === "light" ? "dark" : "light"; + if (typeof window !== "undefined") { + window.localStorage.setItem(THEME_STORAGE_KEY, nextMode); + } + return nextMode; + }); }, }), [], @@ -88,8 +103,15 @@ const App = () => { ); useEffect(() => { + if (typeof window === "undefined") { + return undefined; + } const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); const handleChange = (e) => { + const storedMode = window.localStorage.getItem(THEME_STORAGE_KEY); + if (storedMode === "light" || storedMode === "dark") { + return; + } setMode(e.matches ? "dark" : "light"); }; mediaQuery.addEventListener("change", handleChange);