1
+ import AsyncStorage from '@react-native-async-storage/async-storage' ;
1
2
import React , { createContext , useContext , useState } from 'react' ;
2
3
import { Appearance } from 'react-native' ;
3
4
4
- import { NOOP } from '@sendbird/uikit-utils' ;
5
+ import { NOOP , useAsyncLayoutEffect } from '@sendbird/uikit-utils' ;
5
6
6
7
const DEFAULT_APPEARANCE = 'light' ;
7
8
@@ -10,16 +11,44 @@ const AppearanceContext = createContext<{ scheme: 'light' | 'dark'; setScheme: (
10
11
setScheme : NOOP ,
11
12
} ) ;
12
13
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
+
13
26
export const AppearanceProvider = ( { children } : React . PropsWithChildren ) => {
14
27
const [ scheme , setScheme ] = useState < 'light' | 'dark' > ( Appearance . getColorScheme ( ) ?? DEFAULT_APPEARANCE ) ;
15
28
29
+ useAsyncLayoutEffect ( async ( ) => {
30
+ setScheme ( await SchemeManager . get ( ) ) ;
31
+ } , [ ] ) ;
32
+
16
33
// Handle scheme from Settings screen.
17
34
// useEffect(() => {
18
35
// const unsubscribe = Appearance.addChangeListener(({ colorScheme }) => setScheme(colorScheme ?? DEFAULT_APPEARANCE));
19
36
// return () => unsubscribe.remove();
20
37
// }, []);
21
38
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
+ ) ;
23
52
} ;
24
53
25
54
const useAppearance = ( ) => {
0 commit comments