/** * 统一存储管理器 * * 提供统一的接口来使用 localStorage (AsyncStorage) 或 sessionStorage * * 使用场景: * - local: 持久化数据,应用重启后仍然存在 * - session: 临时数据,应用重启后丢失 * * 示例: * ```typescript * // 使用 localStorage * await storageManager.local.setItem('user', userData); * const user = await storageManager.local.getItem('user'); * * // 使用 sessionStorage * storageManager.session.setItem('temp', tempData); * const temp = storageManager.session.getItem('temp'); * ``` */ import AsyncStorage from '@react-native-async-storage/async-storage'; /** * 存储键名常量 */ export enum STORAGE_KEYS { AUTH_TOKEN = 'auth_token', THEME = 'theme', LANGUAGE = 'language', USER_PREFERENCES = 'user_preferences', TENANT_STORE = 'tenant_storage', USER_STORE = 'user_storage', USER_INFO = 'user_info', // 游戏相关 GAME_STORE = 'game_storage', GAME_TRY = 'game_try', SETTINGS_STORE = 'settings_storage', MSG_STORE = 'msg_storage', TEMP_DATA = 'temp_data', FORM_DRAFT = 'form_draft', SEARCH_HISTORY = 'search_history', CURRENT_TAB = 'current_tab', SCROLL_POSITION = 'scroll_position', FILTER_STATE = 'filter_state', TENANT_TID = 'tenant_tid', APP_CONFIG = 'app_config', APP_THEME = 'app_theme', // 主题 APP_PLATFORM = 'app_platform', // 平台 APP_TEMPLATE = 'app_template', // 模板 APP_LANGUAGE = 'app_language', // 语言 APP_ACTIVE_FOOTER_TAB_MENU = 'app_active_footer_tab_menu', // 底部菜单 APP_MAIN_MENU = 'app_main_menu', // 首页一级菜单原始数据 APP_ACTIVE_MAIN_MENU_TAB = 'app_active_main_menu_tab', // 游戏列表页主菜单 APP_ACTIVE_SUB_MENU_TAB = 'app_active_sub_menu_tab', // 游戏列表页二级菜单 APP_ACTIVE_CHILD_MENU_TAB = 'app_active_child_menu_tab', // 游戏列表页三级菜单 APP_USER_INFO = 'app_user_info', // 登录用户信息 POPUP_MODAL_LIST = 'app_popup_modal_list', // 首页弹窗列表 POPUP_MODAL_STATUS_MAP = 'popup_modal_status_map', // 首页弹窗状态 RECOVER_PASSWORD = 'recover_password', // 找回密码 CDN_PAGE_DATA_LOADED = 'cdn_page_data_loaded', // CDN首页数据是否已加载 } /** * 数据类型标记 */ enum DataType { STRING = 'string', NUMBER = 'number', BOOLEAN = 'boolean', OBJECT = 'object', ARRAY = 'array', NULL = 'null', } /** * 带类型标记的存储值 */ interface TypedValue { type: DataType; value: string; } /** * 存储工具基类 * 提供公共的序列化、反序列化和类型转换方法 */ abstract class StorageBase { /** * 获取数据类型 */ protected static getDataType(value: any): DataType { if (value === null) return DataType.NULL; if (Array.isArray(value)) return DataType.ARRAY; const typeStr = typeof value; const dataType = DataType[typeStr.toUpperCase() as keyof typeof DataType]; return dataType || DataType.OBJECT; } /** * 序列化值(带类型标记) */ protected static serializeValue(value: any): string { const type = this.getDataType(value); const typedValue: TypedValue = { type, value: typeof value === 'string' ? value : JSON.stringify(value), }; return JSON.stringify(typedValue); } /** * 反序列化值(自动转换类型) */ protected static deserializeValue(data: string): any { try { const typedValue: TypedValue = JSON.parse(data); const { type, value } = typedValue; switch (type) { case DataType.STRING: return value; case DataType.NUMBER: return Number(value); case DataType.BOOLEAN: return value === 'true'; case DataType.NULL: return null; case DataType.OBJECT: case DataType.ARRAY: return JSON.parse(value); default: return value; } } catch (error) { console.error('StorageBase deserialize error:', error); return null; } } } /** * 本地存储类(AsyncStorage) * 继承 StorageBase,使用其公共的序列化和反序列化方法 */ class LocalStorage extends StorageBase { /** * 存储数据(自动序列化和类型标记) */ static async setItem(key: string, value: any): Promise { try { const serialized = this.serializeValue(value); await AsyncStorage.setItem(key, serialized); if (__DEV__) { console.log(`💾 LocalStorage set: ${key}`); } } catch (error) { console.error(`LocalStorage setItem error for key "${key}":`, error); throw error; } } /** * 获取数据(自动反序列化和类型转换) */ static async getItem(key: string): Promise { try { const value = await AsyncStorage.getItem(key); if (value === null) { if (__DEV__) { console.log(`📖 LocalStorage get: ${key} ✗`); } return null; } const result = this.deserializeValue(value); if (__DEV__) { console.log(`📖 LocalStorage get: ${key} ✓`); } return result; } catch (error) { console.error(`LocalStorage getItem error for key "${key}":`, error); return null; } } /** * 删除指定键 */ static async removeItem(key: string): Promise { try { await AsyncStorage.removeItem(key); if (__DEV__) { console.log(`🗑️ LocalStorage remove: ${key}`); } } catch (error) { console.error(`LocalStorage removeItem error for key "${key}":`, error); throw error; } } /** * 清空所有存储 */ static async clear(): Promise { try { await AsyncStorage.clear(); if (__DEV__) { console.log('🗑️ LocalStorage cleared all'); } } catch (error) { console.error('LocalStorage clear error:', error); throw error; } } } /** * 会话存储类(内存实现) * 继承 StorageBase,使用其公共的序列化和反序列化方法 */ class SessionStorage extends StorageBase { private static storage: Map = new Map(); /** * 存储数据(自动序列化和类型标记) */ static setItem(key: string, value: any): void { try { const serialized = this.serializeValue(value); this.storage.set(key, serialized); if (__DEV__) { console.log(`💾 SessionStorage set: ${key}`); } } catch (error) { console.error(`SessionStorage setItem error for key "${key}":`, error); throw error; } } /** * 获取数据(自动反序列化和类型转换) */ static getItem(key: string): any { try { const value = this.storage.get(key); if (value === undefined) { if (__DEV__) { console.log(`📖 SessionStorage get: ${key} ✗`); } return null; } const result = this.deserializeValue(value); if (__DEV__) { console.log(`📖 SessionStorage get: ${key} ✓`); } return result; } catch (error) { console.error(`SessionStorage getItem error for key "${key}":`, error); return null; } } /** * 删除指定键 */ static removeItem(key: string): void { try { this.storage.delete(key); if (__DEV__) { console.log(`🗑️ SessionStorage remove: ${key}`); } } catch (error) { console.error(`SessionStorage removeItem error for key "${key}":`, error); throw error; } } /** * 清空所有存储 */ static clear(): void { try { this.storage.clear(); if (__DEV__) { console.log('🗑️ SessionStorage cleared all'); } } catch (error) { console.error('SessionStorage clear error:', error); throw error; } } } /** * 统一存储管理器 */ const storageManager = { local: LocalStorage, session: SessionStorage, }; export default storageManager;