import React from 'react' import * as persisted from '#/state/persisted' type StateContext = { colorMode: persisted.Schema['colorMode'] darkTheme: persisted.Schema['darkTheme'] } type SetContext = { setColorMode: (v: persisted.Schema['colorMode']) => void setDarkTheme: (v: persisted.Schema['darkTheme']) => void } const stateContext = React.createContext({ colorMode: 'system', darkTheme: 'dark', }) const setContext = React.createContext({} as SetContext) export function Provider({children}: React.PropsWithChildren<{}>) { const [colorMode, setColorMode] = React.useState(persisted.get('colorMode')) const [darkTheme, setDarkTheme] = React.useState(persisted.get('darkTheme')) const stateContextValue = React.useMemo( () => ({ colorMode, darkTheme, }), [colorMode, darkTheme], ) const setContextValue = React.useMemo( () => ({ setColorMode: (_colorMode: persisted.Schema['colorMode']) => { setColorMode(_colorMode) persisted.write('colorMode', _colorMode) }, setDarkTheme: (_darkTheme: persisted.Schema['darkTheme']) => { setDarkTheme(_darkTheme) persisted.write('darkTheme', _darkTheme) }, }), [], ) React.useEffect(() => { const unsub1 = persisted.onUpdate('darkTheme', nextDarkTheme => { setDarkTheme(nextDarkTheme) }) const unsub2 = persisted.onUpdate('colorMode', nextColorMode => { setColorMode(nextColorMode) }) return () => { unsub1() unsub2() } }, []) return ( {children} ) } export function useThemePrefs() { return React.useContext(stateContext) } export function useSetThemePrefs() { return React.useContext(setContext) }