mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import React from 'react'
2
3import * as persisted from '#/state/persisted'
4
5type StateContext = {
6 colorMode: persisted.Schema['colorMode']
7 darkTheme: persisted.Schema['darkTheme']
8}
9type SetContext = {
10 setColorMode: (v: persisted.Schema['colorMode']) => void
11 setDarkTheme: (v: persisted.Schema['darkTheme']) => void
12}
13
14const stateContext = React.createContext<StateContext>({
15 colorMode: 'system',
16 darkTheme: 'dark',
17})
18const setContext = React.createContext<SetContext>({} as SetContext)
19
20export function Provider({children}: React.PropsWithChildren<{}>) {
21 const [colorMode, setColorMode] = React.useState(persisted.get('colorMode'))
22 const [darkTheme, setDarkTheme] = React.useState(persisted.get('darkTheme'))
23
24 const stateContextValue = React.useMemo(
25 () => ({
26 colorMode,
27 darkTheme,
28 }),
29 [colorMode, darkTheme],
30 )
31
32 const setContextValue = React.useMemo(
33 () => ({
34 setColorMode: (_colorMode: persisted.Schema['colorMode']) => {
35 setColorMode(_colorMode)
36 persisted.write('colorMode', _colorMode)
37 },
38 setDarkTheme: (_darkTheme: persisted.Schema['darkTheme']) => {
39 setDarkTheme(_darkTheme)
40 persisted.write('darkTheme', _darkTheme)
41 },
42 }),
43 [],
44 )
45
46 React.useEffect(() => {
47 const unsub1 = persisted.onUpdate('darkTheme', nextDarkTheme => {
48 setDarkTheme(nextDarkTheme)
49 })
50 const unsub2 = persisted.onUpdate('colorMode', nextColorMode => {
51 setColorMode(nextColorMode)
52 })
53 return () => {
54 unsub1()
55 unsub2()
56 }
57 }, [])
58
59 return (
60 <stateContext.Provider value={stateContextValue}>
61 <setContext.Provider value={setContextValue}>
62 {children}
63 </setContext.Provider>
64 </stateContext.Provider>
65 )
66}
67
68export function useThemePrefs() {
69 return React.useContext(stateContext)
70}
71
72export function useSetThemePrefs() {
73 return React.useContext(setContext)
74}