@cerberus-design/react
Version:
The Cerberus Design React component library.
75 lines (74 loc) • 1.88 kB
JavaScript
// 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