-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDarkModeContext.tsx
42 lines (34 loc) · 990 Bytes
/
DarkModeContext.tsx
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
import React, {createContext, useContext, useState, useEffect} from 'react';
import {Appearance} from 'react-native';
type DarkModeContextType = {
isDarkMode: boolean;
};
const DarkModeContext = createContext<DarkModeContextType | undefined>(
undefined,
);
export const useDarkMode = () => {
const context = useContext(DarkModeContext);
if (!context) {
throw new Error('useDarkMode must be used within a DarkModeProvider');
}
return context;
};
type Props = {
children: React.ReactNode;
};
export const DarkModeProvider: React.FC<Props> = ({children}) => {
const [isDarkMode, setIsDarkMode] = useState(
Appearance.getColorScheme() === 'dark',
);
useEffect(() => {
const listener = Appearance.addChangeListener(({colorScheme}) => {
setIsDarkMode(colorScheme === 'dark');
});
return () => listener.remove();
}, []);
return (
<DarkModeContext.Provider value={{isDarkMode}}>
{children}
</DarkModeContext.Provider>
);
};