diff options
-rw-r--r-- | src/alf/util/useColorModeTheme.ts | 42 | ||||
-rw-r--r-- | src/state/shell/color-mode.tsx | 44 |
2 files changed, 49 insertions, 37 deletions
diff --git a/src/alf/util/useColorModeTheme.ts b/src/alf/util/useColorModeTheme.ts index 49e2ec8f5..48cf904fe 100644 --- a/src/alf/util/useColorModeTheme.ts +++ b/src/alf/util/useColorModeTheme.ts @@ -1,5 +1,5 @@ import React from 'react' -import {useColorScheme} from 'react-native' +import {ColorSchemeName, useColorScheme} from 'react-native' import {useThemePrefs} from 'state/shell' import {isWeb} from 'platform/detection' @@ -10,21 +10,31 @@ export function useColorModeTheme(): ThemeName { const colorScheme = useColorScheme() const {colorMode, darkTheme} = useThemePrefs() - return React.useMemo(() => { - if ( - (colorMode === 'system' && colorScheme === 'light') || - colorMode === 'light' - ) { - updateDocument('light') - updateSystemBackground('light') - return 'light' - } else { - const themeName = darkTheme ?? 'dim' - updateDocument(themeName) - updateSystemBackground(themeName) - return themeName - } - }, [colorMode, darkTheme, colorScheme]) + React.useLayoutEffect(() => { + const theme = getThemeName(colorScheme, colorMode, darkTheme) + updateDocument(theme) + updateSystemBackground(theme) + }, [colorMode, colorScheme, darkTheme]) + + return React.useMemo( + () => getThemeName(colorScheme, colorMode, darkTheme), + [colorScheme, colorMode, darkTheme], + ) +} + +function getThemeName( + colorScheme: ColorSchemeName, + colorMode: 'system' | 'light' | 'dark', + darkTheme?: ThemeName, +) { + if ( + (colorMode === 'system' && colorScheme === 'light') || + colorMode === 'light' + ) { + return 'light' + } else { + return darkTheme ?? 'dim' + } } function updateDocument(theme: ThemeName) { diff --git a/src/state/shell/color-mode.tsx b/src/state/shell/color-mode.tsx index 4f0391aa6..f3339d240 100644 --- a/src/state/shell/color-mode.tsx +++ b/src/state/shell/color-mode.tsx @@ -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> |