| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| import { createContext, useCallback, useContext, useState } from 'react'; |
|
|
| const ThemeContext = createContext(null); |
| export const useTheme = () => useContext(ThemeContext); |
|
|
| const SetThemeContext = createContext(null); |
| export const useSetTheme = () => useContext(SetThemeContext); |
|
|
| export const ThemeProvider = ({ children }) => { |
| const [theme, _setTheme] = useState(() => { |
| try { |
| return localStorage.getItem('theme-mode') || null; |
| } catch { |
| return null; |
| } |
| }); |
|
|
| const setTheme = useCallback((input) => { |
| _setTheme(input ? 'dark' : 'light'); |
|
|
| const body = document.body; |
| if (!input) { |
| body.removeAttribute('theme-mode'); |
| localStorage.setItem('theme-mode', 'light'); |
| } else { |
| body.setAttribute('theme-mode', 'dark'); |
| localStorage.setItem('theme-mode', 'dark'); |
| } |
| }, []); |
|
|
| return ( |
| <SetThemeContext.Provider value={setTheme}> |
| <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider> |
| </SetThemeContext.Provider> |
| ); |
| }; |
|
|