@@ -36,6 +36,15 @@ export interface CreateThemeOptions {
3636 componentDefaults ?: Record < ModifiableComponent , Record < string , any > > ;
3737}
3838
39+ function setColorScheme ( scheme : 'light' | 'dark' , ignoreSystemMode : boolean ) {
40+ if ( ignoreSystemMode ) {
41+ Colors . setScheme ( scheme as SchemeType ) ;
42+ } else {
43+ const systemScheme = Appearance . getColorScheme ( ) as 'light' | 'dark' | null ;
44+ Colors . setScheme ( systemScheme || 'default' ) ;
45+ }
46+ }
47+
3948export function createTheme ( {
4049 ignoreSystemMode,
4150 supportDarkMode,
@@ -85,13 +94,7 @@ export function createTheme({
8594 return ( scheme : 'light' | 'dark' ) => {
8695 setTheme ( ( prev ) => {
8796 const next = { ...prev , scheme } ;
88-
89- if ( next . ignoreSystemMode ) {
90- Colors . setScheme ( scheme as SchemeType ) ;
91- } else {
92- Colors . setScheme ( 'default' ) ;
93- }
94-
97+ setColorScheme ( scheme , next . ignoreSystemMode ) ;
9598 return next ;
9699 } ) ;
97100 } ;
@@ -102,15 +105,18 @@ export function createTheme({
102105 const [ state , setState ] = React . useState < 'light' | 'dark' > ( scheme ) ;
103106
104107 React . useEffect ( ( ) => {
105- const systemScheme = Appearance . getColorScheme ( ) as 'light' | 'dark' | null ;
106- const initialScheme = ignoreSystemMode ? scheme : systemScheme ?? scheme ;
107- Colors . setScheme ( initialScheme as SchemeType ) ;
108- setState ( initialScheme ) ;
108+ setColorScheme ( scheme , ignoreSystemMode ) ;
109+ setState ( scheme ) ;
109110 } , [ scheme , ignoreSystemMode ] ) ;
110111
111112 return state ;
112113 }
113114
115+ function useIgnoreSystemMode ( ) {
116+ const { ignoreSystemMode } = useAtomValue ( atom ) ;
117+ return ignoreSystemMode
118+ }
119+
114120 function ThemeProviderComponent ( { children } : { children : React . ReactNode } ) {
115121 const { scheme, ignoreSystemMode } = useAtomValue ( atom ) ;
116122 const [ navThemeState , setNavThemeState ] = React . useState (
@@ -121,7 +127,7 @@ export function createTheme({
121127 ) ;
122128
123129 React . useEffect ( ( ) => {
124- Colors . setScheme ( scheme as SchemeType ) ;
130+ setColorScheme ( scheme , ignoreSystemMode ) ;
125131 setNavThemeState (
126132 createReactNavigationTheme (
127133 availableSchemes [ scheme ] ,
@@ -130,7 +136,9 @@ export function createTheme({
130136 ) ;
131137 } , [ scheme , ignoreSystemMode ] ) ;
132138
133- return < ThemeProvider value = { navThemeState } > { children } </ ThemeProvider > ;
139+ return (
140+ < ThemeProvider value = { navThemeState } > { children } </ ThemeProvider >
141+ ) ;
134142 }
135143
136144 function ThemeSettings ( ) {
@@ -141,13 +149,7 @@ export function createTheme({
141149 const dispatch = ( ) => {
142150 setState ( ( prev ) => {
143151 const next = { ...prev , ignoreSystemMode : ! ignoreSystemMode } ;
144-
145- if ( next . ignoreSystemMode ) {
146- Colors . setScheme ( prev . scheme || defaultScheme ) ;
147- } else {
148- Colors . setScheme ( 'default' ) ;
149- }
150-
152+ setColorScheme ( prev . scheme || defaultScheme , next . ignoreSystemMode ) ;
151153 return next ;
152154 } ) ;
153155 } ;
@@ -178,6 +180,7 @@ export function createTheme({
178180 return {
179181 useChangeTheme : useChangeScheme ,
180182 useThemeScheme,
183+ useIgnoreSystemMode,
181184 ThemeProvider : ThemeProviderComponent ,
182185 ThemeSettings,
183186 } ;
0 commit comments