|
|
|
|
|
/**
|
|
|
|
|
|
* AsyncStorage 封装工具
|
|
|
|
|
|
* 提供类型安全的本地存储操作
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 存储键名常量
|
|
|
|
|
|
*/
|
|
|
|
|
|
export enum STORAGE_KEYS {
|
|
|
|
|
|
AUTH_TOKEN = 'auth_token',
|
|
|
|
|
|
USER_INFO = 'user_info',
|
|
|
|
|
|
SETTINGS = 'settings',
|
|
|
|
|
|
THEME = 'theme',
|
|
|
|
|
|
LANGUAGE = 'language',
|
|
|
|
|
|
USER_PREFERENCES = 'user_preferences',
|
|
|
|
|
|
TENANT_STORE = 'tenant_storage',
|
|
|
|
|
|
USER_STORE = 'user_storage',
|
|
|
|
|
|
SETTINGS_STORE = 'settings_storage',
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Storage 工具类
|
|
|
|
|
|
*/
|
|
|
|
|
|
class Storage {
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 存储字符串
|
|
|
|
|
|
*/
|
|
|
|
|
|
static async setString(key: string, value: string): Promise<void> {
|
|
|
|
|
|
try {
|
|
|
|
|
|
await AsyncStorage.setItem(key, value);
|
|
|
|
|
|
if (__DEV__) {
|
|
|
|
|
|
console.log(`💾 Storage set: ${key}`);
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error(`Storage setString error for key "${key}":`, error);
|
|
|
|
|
|
throw error;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取字符串
|
|
|
|
|
|
*/
|
|
|
|
|
|
static async getString(key: string): Promise<string | null> {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const value = await AsyncStorage.getItem(key);
|
|
|
|
|
|
if (__DEV__) {
|
|
|
|
|
|
console.log(`📖 Storage get: ${key}`, value ? '✓' : '✗');
|
|
|
|
|
|
}
|
|
|
|
|
|
return value;
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error(`Storage getString error for key "${key}":`, error);
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 存储对象(自动序列化为 JSON)
|
|
|
|
|
|
*/
|
|
|
|
|
|
static async setObject<T>(key: string, value: T): Promise<void> {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const jsonValue = JSON.stringify(value);
|
|
|
|
|
|
await AsyncStorage.setItem(key, jsonValue);
|
|
|
|
|
|
if (__DEV__) {
|
|
|
|
|
|
console.log(`💾 Storage set object: ${key}`);
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error(`Storage setObject error for key "${key}":`, error);
|
|
|
|
|
|
throw error;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取对象(自动反序列化 JSON)
|
|
|
|
|
|
*/
|
|
|
|
|
|
static async getObject<T>(key: string): Promise<T | null> {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const jsonValue = await AsyncStorage.getItem(key);
|
|
|
|
|
|
if (jsonValue === null) {
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
const value = JSON.parse(jsonValue) as T;
|
|
|
|
|
|
if (__DEV__) {
|
|
|
|
|
|
console.log(`📖 Storage get object: ${key} ✓`);
|
|
|
|
|
|
}
|
|
|
|
|
|
return value;
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error(`Storage getObject error for key "${key}":`, error);
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 删除指定键
|
|
|
|
|
|
*/
|
|
|
|
|
|
static async remove(key: string): Promise<void> {
|
|
|
|
|
|
try {
|
|
|
|
|
|
await AsyncStorage.removeItem(key);
|
|
|
|
|
|
if (__DEV__) {
|
|
|
|
|
|
console.log(`🗑️ Storage remove: ${key}`);
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error(`Storage remove error for key "${key}":`, error);
|
|
|
|
|
|
throw error;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 清空所有存储
|
|
|
|
|
|
*/
|
|
|
|
|
|
static async clear(): Promise<void> {
|
|
|
|
|
|
try {
|
|
|
|
|
|
await AsyncStorage.clear();
|
|
|
|
|
|
if (__DEV__) {
|
|
|
|
|
|
console.log('🗑️ Storage cleared all');
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('Storage clear error:', error);
|
|
|
|
|
|
throw error;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取所有键名
|
|
|
|
|
|
*/
|
|
|
|
|
|
static async getAllKeys(): Promise<string[]> {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const keys = await AsyncStorage.getAllKeys();
|
|
|
|
|
|
if (__DEV__) {
|
|
|
|
|
|
console.log('🔑 Storage all keys:', keys);
|
|
|
|
|
|
}
|
|
|
|
|
|
return keys;
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('Storage getAllKeys error:', error);
|
|
|
|
|
|
return [];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 批量获取
|
|
|
|
|
|
*/
|
|
|
|
|
|
static async multiGet(keys: string[]): Promise<[string, string | null][]> {
|
|
|
|
|
|
try {
|
|
|
|
|
|
const values = await AsyncStorage.multiGet(keys);
|
|
|
|
|
|
return values;
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('Storage multiGet error:', error);
|
|
|
|
|
|
return [];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 批量设置
|
|
|
|
|
|
*/
|
|
|
|
|
|
static async multiSet(keyValuePairs: [string, string][]): Promise<void> {
|
|
|
|
|
|
try {
|
|
|
|
|
|
await AsyncStorage.multiSet(keyValuePairs);
|
|
|
|
|
|
if (__DEV__) {
|
|
|
|
|
|
console.log(`💾 Storage multiSet: ${keyValuePairs.length} items`);
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('Storage multiSet error:', error);
|
|
|
|
|
|
throw error;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 批量删除
|
|
|
|
|
|
*/
|
|
|
|
|
|
static async multiRemove(keys: string[]): Promise<void> {
|
|
|
|
|
|
try {
|
|
|
|
|
|
await AsyncStorage.multiRemove(keys);
|
|
|
|
|
|
if (__DEV__) {
|
|
|
|
|
|
console.log(`🗑️ Storage multiRemove: ${keys.length} items`);
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('Storage multiRemove error:', error);
|
|
|
|
|
|
throw error;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export default Storage;
|