|
1 | 1 | import { proxy, subscribe as sub } from 'valtio'; |
2 | 2 | import type { ThemeMode, ThemeVariables } from '@reown/appkit-common-react-native'; |
3 | | -import { derive } from 'derive-valtio'; |
4 | 3 |
|
5 | 4 | // -- Types --------------------------------------------- // |
6 | 5 | export interface ThemeControllerState { |
| 6 | + themeMode: ThemeMode; |
7 | 7 | systemThemeMode?: ThemeMode; |
8 | 8 | defaultThemeMode?: ThemeMode; |
9 | 9 | themeVariables: ThemeVariables; |
10 | 10 | } |
11 | 11 |
|
12 | 12 | // -- State --------------------------------------------- // |
13 | | -const baseState = proxy<ThemeControllerState>({ |
14 | | - systemThemeMode: undefined, |
15 | | - defaultThemeMode: undefined, |
16 | | - themeVariables: {} |
17 | | -}); |
18 | | - |
19 | | -// -- Derived State ------------------------------------- // |
20 | | -const derivedState = derive( |
21 | | - { |
22 | | - themeMode: (get): ThemeMode => { |
23 | | - const snap = get(baseState); |
24 | | - |
25 | | - return snap.defaultThemeMode ?? snap.systemThemeMode ?? 'light'; |
26 | | - } |
27 | | - }, |
28 | | - { |
29 | | - proxy: baseState |
| 13 | +const state = proxy({ |
| 14 | + systemThemeMode: undefined as ThemeMode | undefined, |
| 15 | + defaultThemeMode: undefined as ThemeMode | undefined, |
| 16 | + themeVariables: {} as ThemeVariables, |
| 17 | + get themeMode(): ThemeMode { |
| 18 | + // eslint-disable-next-line valtio/avoid-this-in-proxy -- using `this` for sibling property access in getters is the recommended valtio pattern for computed properties |
| 19 | + return this.defaultThemeMode ?? this.systemThemeMode ?? 'light'; |
30 | 20 | } |
31 | | -); |
| 21 | +}); |
32 | 22 |
|
33 | 23 | // -- Controller ---------------------------------------- // |
34 | 24 | export const ThemeController = { |
35 | | - state: derivedState, |
| 25 | + state: state as ThemeControllerState, |
36 | 26 |
|
37 | 27 | subscribe(callback: (newState: ThemeControllerState) => void) { |
38 | | - return sub(derivedState, () => callback(derivedState)); |
| 28 | + return sub(state, () => callback(state)); |
39 | 29 | }, |
40 | 30 |
|
41 | 31 | setSystemThemeMode(systemThemeMode?: ThemeControllerState['systemThemeMode']) { |
42 | | - baseState.systemThemeMode = systemThemeMode ?? 'light'; |
| 32 | + state.systemThemeMode = systemThemeMode ?? 'light'; |
43 | 33 | }, |
44 | 34 |
|
45 | 35 | setDefaultThemeMode(themeMode?: ThemeControllerState['defaultThemeMode']) { |
46 | | - baseState.defaultThemeMode = themeMode; |
| 36 | + state.defaultThemeMode = themeMode; |
47 | 37 | }, |
48 | 38 |
|
49 | 39 | setThemeVariables(themeVariables?: ThemeControllerState['themeVariables']) { |
50 | 40 | if (!themeVariables) { |
51 | | - baseState.themeVariables = {}; |
| 41 | + state.themeVariables = {}; |
52 | 42 |
|
53 | 43 | return; |
54 | 44 | } |
55 | 45 |
|
56 | | - baseState.themeVariables = { ...baseState.themeVariables, ...themeVariables }; |
| 46 | + state.themeVariables = { ...state.themeVariables, ...themeVariables }; |
57 | 47 | } |
58 | 48 | }; |
0 commit comments