Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 30x 30x 17x 17x 42x 30x 59x 30x 30x 30x | import AsyncStorage from '@react-native-async-storage/async-storage';
import { create } from 'zustand';
import { createJSONStorage, persist } from 'zustand/middleware';
import { logger } from '@/src/utils/logger';
export type ThemeMode = 'light' | 'dark' | 'system';
interface ThemeState {
themeMode: ThemeMode;
setThemeMode: (mode: ThemeMode) => void;
_hasHydrated: boolean;
setHasHydrated: (hasHydrated: boolean) => void;
}
export const useThemeStore = create<ThemeState>()(
persist(
(set) => ({
// 默认亮色主题
themeMode: 'light',
// 设置主题模式
setThemeMode: (mode: ThemeMode) => {
set({ themeMode: mode });
logger.info('主题模式已切换', { mode });
},
// 水化状态
_hasHydrated: false,
setHasHydrated: (hasHydrated: boolean) => {
set({ _hasHydrated: hasHydrated });
},
}),
{
name: 'themeStorage_v2', // 修改版本号强制重置
storage: createJSONStorage(() => AsyncStorage),
// 只持久化主题模式
partialize: (state) => ({
themeMode: state.themeMode,
}),
// 水化完成后的回调
onRehydrateStorage: () => (state) => {
logger.info('主题状态恢复完成', {
themeMode: state?.themeMode,
});
state?.setHasHydrated(true);
},
}
)
);
|