// originally written by @imoaazahmed import { useLocalStorage } from '@uidotdev/usehooks' import { useEffect, useMemo } from 'react' const ThemeProps = { key: 'theme', light: 'light', dark: 'dark' } as const type Theme = typeof ThemeProps.light | typeof ThemeProps.dark export const useTheme = (defaultTheme?: Theme) => { const [theme, setTheme] = useLocalStorage(ThemeProps.key, defaultTheme) const isDark = useMemo(() => { return theme === ThemeProps.dark }, [theme]) const isLight = useMemo(() => { return theme === ThemeProps.light }, [theme]) const _setTheme = (theme: Theme) => { setTheme(theme) document.documentElement.classList.remove(ThemeProps.light, ThemeProps.dark) document.documentElement.classList.add(theme) } const setLightTheme = () => _setTheme(ThemeProps.light) const setDarkTheme = () => _setTheme(ThemeProps.dark) const toggleTheme = () => theme === ThemeProps.dark ? setLightTheme() : setDarkTheme() useEffect(() => { _setTheme(theme) }) return { theme, isDark, isLight, setLightTheme, setDarkTheme, toggleTheme } }