UNPKG

@cerberus-design/react

Version:

The Cerberus Design React component library.

75 lines (74 loc) 1.88 kB
// src/hooks/useTheme.ts import { useCallback, useEffect, useLayoutEffect, useMemo, useState } from "react"; var THEME_KEY = "cerberus-theme"; var MODE_KEY = "cerberus-mode"; function useTheme(defaultTheme = "cerberus", defaultColorMode = "light", options = {}) { const { updateMode, updateTheme, cache } = options; const [theme, setTheme] = useState(defaultTheme); const [colorMode, setColorMode] = useState(defaultColorMode); const handleThemeChange = useCallback( (newTheme) => { setTheme(newTheme); updateTheme?.(newTheme); }, [updateTheme] ); const handleColorModeChange = useCallback( (newMode) => { setColorMode(newMode); updateMode?.(newMode); }, [updateMode] ); useLayoutEffect(() => { const theme2 = localStorage.getItem(THEME_KEY); if (theme2) { setTheme(theme2); } }, []); useLayoutEffect(() => { const mode = localStorage.getItem(MODE_KEY); if (mode) { setColorMode(mode); } }, []); useEffect(() => { const root = document.documentElement; root.dataset.pandaTheme = theme; if (cache) { localStorage.setItem(THEME_KEY, theme); } }, [theme, cache]); useEffect(() => { const root = document.documentElement; if (colorMode === "system") { root.dataset.colorMode = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"; } else { root.dataset.colorMode = colorMode; } if (cache) { localStorage.setItem(MODE_KEY, colorMode); } }, [colorMode, cache]); return useMemo( () => ({ theme, mode: colorMode, updateTheme: handleThemeChange, updateMode: handleColorModeChange }), [theme, colorMode, handleThemeChange, handleColorModeChange] ); } export { THEME_KEY, MODE_KEY, useTheme }; //# sourceMappingURL=chunk-EJOXOICK.js.map