/* eslint-disable react-refresh/only-export-components */ import { createContext, useContext, useState, useEffect } from "react"; const ThemeContext = createContext(); export function ThemeProvider({ children }) { const [theme, setThemeState] = useState(() => { try { return localStorage.getItem("brew-theme") || "system"; } catch { return "system"; } }); const [resolvedTheme, setResolvedTheme] = useState("light"); const setTheme = (newTheme) => { try { localStorage.setItem("brew-theme", newTheme); } catch (e) { console.error("Failed to set theme in localStorage", e); } setThemeState(newTheme); }; useEffect(() => { const root = window.document.documentElement; const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); const applyTheme = () => { const isDark = theme === "dark" || (theme === "system" && mediaQuery.matches); if (isDark) { root.classList.add("dark"); setResolvedTheme("dark"); } else { root.classList.remove("dark"); setResolvedTheme("light"); } }; applyTheme(); const handleChange = () => { if (theme === "system") { applyTheme(); } }; mediaQuery.addEventListener("change", handleChange); return () => mediaQuery.removeEventListener("change", handleChange); }, [theme]); return ( {children} ); } export function useTheme() { const context = useContext(ThemeContext); if (!context) { throw new Error("useTheme must be used within a ThemeProvider"); } return context; }