fix theme cross-tab write loop (#2774)

* don't write on onUpdate, memoize

* refac useColorModeTheme
This commit is contained in:
Hailey 2024-02-06 21:16:50 -08:00 committed by GitHub
parent dc6603a1b9
commit 573cf31d86
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 49 additions and 37 deletions

View file

@ -20,36 +20,38 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
const [colorMode, setColorMode] = React.useState(persisted.get('colorMode'))
const [darkTheme, setDarkTheme] = React.useState(persisted.get('darkTheme'))
const setColorModeWrapped = React.useCallback(
(_colorMode: persisted.Schema['colorMode']) => {
setColorMode(_colorMode)
persisted.write('colorMode', _colorMode)
},
[setColorMode],
const stateContextValue = React.useMemo(
() => ({
colorMode,
darkTheme,
}),
[colorMode, darkTheme],
)
const setDarkThemeWrapped = React.useCallback(
(_darkTheme: persisted.Schema['darkTheme']) => {
setDarkTheme(_darkTheme)
persisted.write('darkTheme', _darkTheme)
},
[setDarkTheme],
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(() => {
return persisted.onUpdate(() => {
setColorModeWrapped(persisted.get('colorMode'))
setDarkThemeWrapped(persisted.get('darkTheme'))
setColorMode(persisted.get('colorMode'))
setDarkTheme(persisted.get('darkTheme'))
})
}, [setColorModeWrapped, setDarkThemeWrapped])
}, [])
return (
<stateContext.Provider value={{colorMode, darkTheme}}>
<setContext.Provider
value={{
setDarkTheme: setDarkThemeWrapped,
setColorMode: setColorModeWrapped,
}}>
<stateContext.Provider value={stateContextValue}>
<setContext.Provider value={setContextValue}>
{children}
</setContext.Provider>
</stateContext.Provider>