|
|
/** |
|
|
* 统一存储管理器 |
|
|
* |
|
|
* 提供统一的接口来使用 localStorage (AsyncStorage) 或 sessionStorage |
|
|
* |
|
|
* 使用场景: |
|
|
* - localStorage: 持久化数据,应用重启后仍然存在 |
|
|
* - sessionStorage: 临时数据,应用重启后丢失 |
|
|
* |
|
|
* 示例: |
|
|
* ```typescript |
|
|
* // 使用 localStorage(默认) |
|
|
* await StorageManager.set('user', userData); |
|
|
* |
|
|
* // 使用 sessionStorage |
|
|
* await StorageManager.set('temp', tempData, { type: 'session' }); |
|
|
* |
|
|
* // 获取数据(自动从正确的存储中读取) |
|
|
* const user = await StorageManager.get('user'); |
|
|
* const temp = await StorageManager.get('temp', { type: 'session' }); |
|
|
* ``` |
|
|
*/ |
|
|
|
|
|
import Storage from './storage'; |
|
|
import SessionStorage from './sessionStorage'; |
|
|
|
|
|
/** |
|
|
* 存储类型 |
|
|
*/ |
|
|
export type StorageType = 'local' | 'session'; |
|
|
|
|
|
/** |
|
|
* 存储选项 |
|
|
*/ |
|
|
export interface StorageOptions { |
|
|
/** |
|
|
* 存储类型 |
|
|
* - 'local': 持久化存储(AsyncStorage) |
|
|
* - 'session': 会话存储(内存) |
|
|
*/ |
|
|
type?: StorageType; |
|
|
} |
|
|
|
|
|
/** |
|
|
* 统一存储管理器 |
|
|
*/ |
|
|
class StorageManager { |
|
|
/** |
|
|
* 存储字符串 |
|
|
*/ |
|
|
static async setString( |
|
|
key: string, |
|
|
value: string, |
|
|
options: StorageOptions = {} |
|
|
): Promise<void> { |
|
|
const { type = 'local' } = options; |
|
|
|
|
|
if (type === 'session') { |
|
|
SessionStorage.setString(key, value); |
|
|
} else { |
|
|
await Storage.setString(key, value); |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* 获取字符串 |
|
|
*/ |
|
|
static async getString( |
|
|
key: string, |
|
|
options: StorageOptions = {} |
|
|
): Promise<string | null> { |
|
|
const { type = 'local' } = options; |
|
|
|
|
|
if (type === 'session') { |
|
|
return SessionStorage.getString(key); |
|
|
} else { |
|
|
return await Storage.getString(key); |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* 存储对象 |
|
|
*/ |
|
|
static async setObject<T>( |
|
|
key: string, |
|
|
value: T, |
|
|
options: StorageOptions = {} |
|
|
): Promise<void> { |
|
|
const { type = 'local' } = options; |
|
|
|
|
|
if (type === 'session') { |
|
|
SessionStorage.setObject(key, value); |
|
|
} else { |
|
|
await Storage.setObject(key, value); |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* 获取对象 |
|
|
*/ |
|
|
static async getObject<T>( |
|
|
key: string, |
|
|
options: StorageOptions = {} |
|
|
): Promise<T | null> { |
|
|
const { type = 'local' } = options; |
|
|
|
|
|
if (type === 'session') { |
|
|
return SessionStorage.getObject<T>(key); |
|
|
} else { |
|
|
return await Storage.getObject<T>(key); |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* 删除指定键 |
|
|
*/ |
|
|
static async remove(key: string, options: StorageOptions = {}): Promise<void> { |
|
|
const { type = 'local' } = options; |
|
|
|
|
|
if (type === 'session') { |
|
|
SessionStorage.remove(key); |
|
|
} else { |
|
|
await Storage.remove(key); |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* 清空指定类型的所有存储 |
|
|
*/ |
|
|
static async clear(options: StorageOptions = {}): Promise<void> { |
|
|
const { type = 'local' } = options; |
|
|
|
|
|
if (type === 'session') { |
|
|
SessionStorage.clear(); |
|
|
} else { |
|
|
await Storage.clear(); |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* 获取所有键名 |
|
|
*/ |
|
|
static async getAllKeys(options: StorageOptions = {}): Promise<string[]> { |
|
|
const { type = 'local' } = options; |
|
|
|
|
|
if (type === 'session') { |
|
|
return SessionStorage.getAllKeys(); |
|
|
} else { |
|
|
return await Storage.getAllKeys(); |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* 检查键是否存在 |
|
|
*/ |
|
|
static async has(key: string, options: StorageOptions = {}): Promise<boolean> { |
|
|
const { type = 'local' } = options; |
|
|
|
|
|
if (type === 'session') { |
|
|
return SessionStorage.has(key); |
|
|
} else { |
|
|
const value = await Storage.getString(key); |
|
|
return value !== null; |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* 批量获取 |
|
|
*/ |
|
|
static async multiGet( |
|
|
keys: string[], |
|
|
options: StorageOptions = {} |
|
|
): Promise<[string, string | null][]> { |
|
|
const { type = 'local' } = options; |
|
|
|
|
|
if (type === 'session') { |
|
|
return SessionStorage.multiGet(keys); |
|
|
} else { |
|
|
return await Storage.multiGet(keys); |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* 批量设置 |
|
|
*/ |
|
|
static async multiSet( |
|
|
keyValuePairs: [string, string][], |
|
|
options: StorageOptions = {} |
|
|
): Promise<void> { |
|
|
const { type = 'local' } = options; |
|
|
|
|
|
if (type === 'session') { |
|
|
SessionStorage.multiSet(keyValuePairs); |
|
|
} else { |
|
|
await Storage.multiSet(keyValuePairs); |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* 批量删除 |
|
|
*/ |
|
|
static async multiRemove( |
|
|
keys: string[], |
|
|
options: StorageOptions = {} |
|
|
): Promise<void> { |
|
|
const { type = 'local' } = options; |
|
|
|
|
|
if (type === 'session') { |
|
|
SessionStorage.multiRemove(keys); |
|
|
} else { |
|
|
await Storage.multiRemove(keys); |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* 获取存储大小(仅 session storage) |
|
|
*/ |
|
|
static getSize(options: StorageOptions = {}): number { |
|
|
const { type = 'local' } = options; |
|
|
|
|
|
if (type === 'session') { |
|
|
return SessionStorage.length; |
|
|
} else { |
|
|
// AsyncStorage 不支持直接获取大小 |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
|
|
|
/** |
|
|
* 清空所有存储(local + session) |
|
|
*/ |
|
|
static async clearAll(): Promise<void> { |
|
|
await Storage.clear(); |
|
|
SessionStorage.clear(); |
|
|
if (__DEV__) { |
|
|
console.log('🗑️ All storage cleared (local + session)'); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
export default StorageManager; |
|
|
|
|
|
|