From 01870883d6062c43d275cad0d5d2012cf643df93 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 14 Sep 2023 18:15:17 -0500 Subject: [PATCH] clean up into hook --- src/lib/ThemeContext.tsx | 43 ++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/lib/ThemeContext.tsx b/src/lib/ThemeContext.tsx index 76e7091807..f77b551519 100644 --- a/src/lib/ThemeContext.tsx +++ b/src/lib/ThemeContext.tsx @@ -3,7 +3,7 @@ import React, {ReactNode, createContext, useContext} from 'react' import { AppState, TextStyle, - useColorScheme, + useColorScheme as useColorScheme_BUGGY, ViewStyle, ColorSchemeName, } from 'react-native' @@ -93,31 +93,36 @@ export const ThemeContext = createContext(defaultTheme) export const useTheme = () => useContext(ThemeContext) -const getTheme = (theme: ColorSchemeName) => - theme === 'dark' ? darkTheme : defaultTheme +function getTheme(theme: ColorSchemeName) { + return theme === 'dark' ? darkTheme : defaultTheme +} + +function useColorScheme_FIXED() { + const colorScheme = useColorScheme_BUGGY() + const [currentColorScheme, setCurrentColorScheme] = + React.useState(colorScheme) + + React.useEffect(() => { + // we don't need to be updating state on web + if (isWeb) return + const subscription = AppState.addEventListener('change', state => { + const isActive = state === 'active' + if (!isActive) return + setCurrentColorScheme(colorScheme) + }) + return () => subscription.remove() + }, [colorScheme]) + + return isWeb ? colorScheme : currentColorScheme +} export const ThemeProvider: React.FC = ({ theme, children, }) => { - const colorSchemeFromRN = useColorScheme() - const [statefulColorScheme, setStatefulColorScheme] = - React.useState(colorSchemeFromRN) - const colorScheme = isWeb ? colorSchemeFromRN : statefulColorScheme + const colorScheme = useColorScheme_FIXED() const themeValue = getTheme(theme === 'system' ? colorScheme : theme) - React.useEffect(() => { - if (!isWeb) return - const subscription = AppState.addEventListener('change', state => { - const isActive = state === 'active' - - if (!isActive) return - - setStatefulColorScheme(colorSchemeFromRN) - }) - return () => subscription.remove() - }, [colorSchemeFromRN]) - return ( {children} )