UNPKG

@cerberus-design/react

Version:

The Cerberus Design React component library.

66 lines (63 loc) 1.82 kB
'use client'; import { useState, useCallback, useLayoutEffect, useEffect, useMemo } from 'react'; const THEME_KEY = "cerberus-theme"; const 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 { MODE_KEY, THEME_KEY, useTheme };