1+ import AsyncStorage from '@react-native-async-storage/async-storage' ;
12import React , { createContext , useContext , useState } from 'react' ;
23import { Appearance } from 'react-native' ;
34
4- import { NOOP } from '@sendbird/uikit-utils' ;
5+ import { NOOP , useAsyncLayoutEffect } from '@sendbird/uikit-utils' ;
56
67const DEFAULT_APPEARANCE = 'light' ;
78
@@ -10,16 +11,44 @@ const AppearanceContext = createContext<{ scheme: 'light' | 'dark'; setScheme: (
1011 setScheme : NOOP ,
1112} ) ;
1213
14+ const SchemeManager = {
15+ KEY : 'sendbird@scheme' ,
16+ async get ( ) {
17+ return ( ( await AsyncStorage . getItem ( SchemeManager . KEY ) ) ?? Appearance . getColorScheme ( ) ?? DEFAULT_APPEARANCE ) as
18+ | 'light'
19+ | 'dark' ;
20+ } ,
21+ async set ( scheme : 'light' | 'dark' ) {
22+ await AsyncStorage . setItem ( SchemeManager . KEY , scheme ) ;
23+ } ,
24+ } ;
25+
1326export const AppearanceProvider = ( { children } : React . PropsWithChildren ) => {
1427 const [ scheme , setScheme ] = useState < 'light' | 'dark' > ( Appearance . getColorScheme ( ) ?? DEFAULT_APPEARANCE ) ;
1528
29+ useAsyncLayoutEffect ( async ( ) => {
30+ setScheme ( await SchemeManager . get ( ) ) ;
31+ } , [ ] ) ;
32+
1633 // Handle scheme from Settings screen.
1734 // useEffect(() => {
1835 // const unsubscribe = Appearance.addChangeListener(({ colorScheme }) => setScheme(colorScheme ?? DEFAULT_APPEARANCE));
1936 // return () => unsubscribe.remove();
2037 // }, []);
2138
22- return < AppearanceContext . Provider value = { { scheme, setScheme } } > { children } </ AppearanceContext . Provider > ;
39+ return (
40+ < AppearanceContext . Provider
41+ value = { {
42+ scheme,
43+ setScheme : async ( value ) => {
44+ setScheme ( value ) ;
45+ await SchemeManager . set ( value ) ;
46+ } ,
47+ } }
48+ >
49+ { children }
50+ </ AppearanceContext . Provider >
51+ ) ;
2352} ;
2453
2554const useAppearance = ( ) => {
0 commit comments