diff --git a/src/hooks/useTheme.ts b/src/hooks/useTheme.ts index 0dcbf62e8e..e8adc67e7e 100644 --- a/src/hooks/useTheme.ts +++ b/src/hooks/useTheme.ts @@ -1,5 +1,13 @@ import { useEffect } from "react"; import { useSettings } from "./useSettings"; +import { + applyThemeClass, + readStoredTheme, + resolveTheme, + type EffectiveTheme, +} from "../utils/theme"; + +const DARK_SCHEME_QUERY = "(prefers-color-scheme: dark)"; export function useTheme() { const { theme, setTheme } = useSettings(); @@ -7,36 +15,20 @@ export function useTheme() { useEffect(() => { const htmlElement = document.documentElement; - // Determine effective theme - const effectiveTheme: "light" | "dark" = - theme === "auto" - ? window.matchMedia("(prefers-color-scheme: dark)").matches - ? "dark" - : "light" - : theme; - - // Apply dark class - if (effectiveTheme === "dark") { - htmlElement.classList.add("dark"); - document.body.classList.add("dark"); - } else { - htmlElement.classList.remove("dark"); - document.body.classList.remove("dark"); - } + // Determine effective theme (stored value, or system preference when auto) + const stored = readStoredTheme(window.localStorage); + const effectiveTheme: EffectiveTheme = resolveTheme( + stored, + window.matchMedia(DARK_SCHEME_QUERY).matches + ); + applyThemeClass(htmlElement, document.body, effectiveTheme); - // Listen for system preference changes (only when auto) + // Follow the system preference while the theme is set to "auto" if (theme === "auto") { - const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); + const mediaQuery = window.matchMedia(DARK_SCHEME_QUERY); const handler = (e: MediaQueryListEvent) => { - if (e.matches) { - htmlElement.classList.add("dark"); - document.body.classList.add("dark"); - } else { - htmlElement.classList.remove("dark"); - document.body.classList.remove("dark"); - } + applyThemeClass(htmlElement, document.body, e.matches ? "dark" : "light"); }; - mediaQuery.addEventListener("change", handler); return () => mediaQuery.removeEventListener("change", handler); } diff --git a/src/index.html b/src/index.html index e767b282c7..89f3ea75d3 100644 --- a/src/index.html +++ b/src/index.html @@ -4,11 +4,42 @@ - +