ConceptPortal-public/rsconcept/frontend/src/context/ThemeContext.tsx

48 lines
1.0 KiB
TypeScript
Raw Normal View History

2023-07-15 17:46:19 +03:00
import { createContext, useContext, useEffect } from 'react';
import useLocalStorage from '../hooks/useLocalStorage';
interface IThemeContext {
darkMode: boolean
toggleDarkMode: () => void
}
export const ThemeContext = createContext<IThemeContext>({
darkMode: true,
toggleDarkMode: () => {}
})
interface ThemeStateProps {
children: React.ReactNode
}
export const ThemeState = ({ children }: ThemeStateProps) => {
const [darkMode, setDarkMode] = useLocalStorage('darkMode', false);
const setDarkClass = (isDark: boolean) => {
const root = window.document.documentElement;
if (isDark) {
root.classList.add('dark');
} else {
root.classList.remove('dark');
}
};
const toggleDarkMode = () => {
setDarkMode(!darkMode)
};
useEffect(() => {
setDarkClass(darkMode)
}, [darkMode]);
return (
<ThemeContext.Provider value={{
darkMode, toggleDarkMode
}}>
{children}
</ThemeContext.Provider>
);
}
export const useTheme = () => useContext(ThemeContext);