..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 | import React, {
createContext,
useContext,
useState,
useEffect,
ReactNode,
} from 'react';
type ThemeContextType = {
isDarkMode: boolean;
toggleTheme: () => void;
};
const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
export const useTheme = () => useContext(ThemeContext)!;
type ThemeProviderProps = {
children: ReactNode;
};
export const ThemeProvider = ({ children }: ThemeProviderProps) => {
const [isDarkMode, setIsDarkMode] = useState<boolean>(() =>
getInitialThemePreference(),
);
useEffect(() => {
document.documentElement.classList.toggle('dark-mode', isDarkMode);
localStorage.setItem('themePreference', isDarkMode ? 'dark' : 'light');
}, [isDarkMode]);
const toggleTheme = () => {
setIsDarkMode(!isDarkMode);
};
return (
<ThemeContext.Provider value={{ isDarkMode, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
};
const getInitialThemePreference = (): boolean => {
const storedThemePreference = localStorage.getItem('themePreference');
if (storedThemePreference) {
return storedThemePreference === 'dark';
}
return (
window.matchMedia &&
window.matchMedia('(prefers-color-scheme: dark)').matches
);
};
|
|