@qhr123/sa2kit 0.4.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +30 -0
  2. package/dist/auth/index.d.mts +104 -0
  3. package/dist/auth/index.d.ts +104 -0
  4. package/dist/auth/index.js +186 -0
  5. package/dist/auth/index.js.map +1 -0
  6. package/dist/auth/index.mjs +183 -0
  7. package/dist/auth/index.mjs.map +1 -0
  8. package/dist/chunk-TLXAIOXP.js +476 -0
  9. package/dist/chunk-TLXAIOXP.js.map +1 -0
  10. package/dist/chunk-WUTGV44D.mjs +466 -0
  11. package/dist/chunk-WUTGV44D.mjs.map +1 -0
  12. package/dist/config/index.d.mts +64 -0
  13. package/dist/config/index.d.ts +64 -0
  14. package/dist/config/index.js +136 -0
  15. package/dist/config/index.js.map +1 -0
  16. package/dist/config/index.mjs +128 -0
  17. package/dist/config/index.mjs.map +1 -0
  18. package/dist/i18n/index.d.mts +15 -3
  19. package/dist/i18n/index.d.ts +15 -3
  20. package/dist/i18n/index.js +3 -0
  21. package/dist/i18n/index.js.map +1 -1
  22. package/dist/i18n/index.mjs +1 -1
  23. package/dist/i18n/index.mjs.map +1 -1
  24. package/dist/index.d.mts +1 -3
  25. package/dist/index.d.ts +1 -3
  26. package/dist/index.js +29 -6
  27. package/dist/index.mjs +1 -2
  28. package/dist/storage/index.d.mts +162 -3
  29. package/dist/storage/index.d.ts +162 -3
  30. package/dist/storage/index.js +34 -2
  31. package/dist/storage/index.mjs +1 -1
  32. package/package.json +26 -8
  33. package/dist/chunk-3R73CUAY.js +0 -80
  34. package/dist/chunk-3R73CUAY.js.map +0 -1
  35. package/dist/chunk-4JTIYLS6.js +0 -88
  36. package/dist/chunk-4JTIYLS6.js.map +0 -1
  37. package/dist/chunk-C7VOMO3L.mjs +0 -77
  38. package/dist/chunk-C7VOMO3L.mjs.map +0 -1
  39. package/dist/chunk-M7CA3DTF.mjs +0 -86
  40. package/dist/chunk-M7CA3DTF.mjs.map +0 -1
  41. package/dist/hooks/index.d.mts +0 -30
  42. package/dist/hooks/index.d.ts +0 -30
  43. package/dist/hooks/index.js +0 -18
  44. package/dist/hooks/index.js.map +0 -1
  45. package/dist/hooks/index.mjs +0 -5
  46. package/dist/hooks/index.mjs.map +0 -1
  47. package/dist/types-BaZccpvk.d.mts +0 -48
  48. package/dist/types-BaZccpvk.d.ts +0 -48
@@ -0,0 +1,476 @@
1
+ 'use strict';
2
+
3
+ var chunkDGUM43GV_js = require('./chunk-DGUM43GV.js');
4
+ var react = require('react');
5
+
6
+ // src/storage/web-adapter.ts
7
+ var isBrowser = typeof window !== "undefined" && typeof window.localStorage !== "undefined";
8
+ var WebStorageAdapter = class {
9
+ async getItem(key) {
10
+ if (!isBrowser) {
11
+ return null;
12
+ }
13
+ try {
14
+ return localStorage.getItem(key);
15
+ } catch (error) {
16
+ console.error(`[WebStorage] Error getting item "${key}":`, error);
17
+ return null;
18
+ }
19
+ }
20
+ async setItem(key, value) {
21
+ if (!isBrowser) {
22
+ return;
23
+ }
24
+ try {
25
+ localStorage.setItem(key, value);
26
+ } catch (error) {
27
+ console.error(`[WebStorage] Error setting item "${key}":`, error);
28
+ throw error;
29
+ }
30
+ }
31
+ async removeItem(key) {
32
+ if (!isBrowser) {
33
+ return;
34
+ }
35
+ try {
36
+ localStorage.removeItem(key);
37
+ } catch (error) {
38
+ console.error(`[WebStorage] Error removing item "${key}":`, error);
39
+ throw error;
40
+ }
41
+ }
42
+ async clear() {
43
+ if (!isBrowser) {
44
+ return;
45
+ }
46
+ try {
47
+ localStorage.clear();
48
+ } catch (error) {
49
+ console.error("[WebStorage] Error clearing storage:", error);
50
+ throw error;
51
+ }
52
+ }
53
+ addChangeListener(callback) {
54
+ if (!isBrowser) {
55
+ return () => {
56
+ };
57
+ }
58
+ const handleStorageEvent = (e) => {
59
+ if (e.key) {
60
+ callback(e.key, e.newValue);
61
+ }
62
+ };
63
+ const handleCustomEvent = (e) => {
64
+ const customEvent = e;
65
+ callback(customEvent.detail.key, customEvent.detail.value);
66
+ };
67
+ window.addEventListener("storage", handleStorageEvent);
68
+ window.addEventListener("local-storage-change", handleCustomEvent);
69
+ return () => {
70
+ window.removeEventListener("storage", handleStorageEvent);
71
+ window.removeEventListener("local-storage-change", handleCustomEvent);
72
+ };
73
+ }
74
+ /**
75
+ * 触发自定义事件,通知同标签页的其他组件
76
+ */
77
+ dispatchChange(key, value) {
78
+ if (!isBrowser) {
79
+ return;
80
+ }
81
+ window.dispatchEvent(
82
+ new CustomEvent("local-storage-change", {
83
+ detail: { key, value }
84
+ })
85
+ );
86
+ }
87
+ };
88
+
89
+ // src/storage/react-native-adapter.ts
90
+ var AsyncStorage = null;
91
+ try {
92
+ AsyncStorage = chunkDGUM43GV_js.__require("@react-native-async-storage/async-storage").default;
93
+ } catch (e) {
94
+ }
95
+ var ReactNativeStorageAdapter = class {
96
+ constructor() {
97
+ this.listeners = /* @__PURE__ */ new Map();
98
+ }
99
+ async getItem(key) {
100
+ if (!AsyncStorage) return null;
101
+ try {
102
+ return await AsyncStorage.getItem(key);
103
+ } catch (error) {
104
+ console.error(`[ReactNativeStorage] Error getting item "${key}":`, error);
105
+ return null;
106
+ }
107
+ }
108
+ async setItem(key, value) {
109
+ if (!AsyncStorage) {
110
+ throw new Error("AsyncStorage is not available");
111
+ }
112
+ try {
113
+ await AsyncStorage.setItem(key, value);
114
+ this.notifyListeners(key, value);
115
+ } catch (error) {
116
+ console.error(`[ReactNativeStorage] Error setting item "${key}":`, error);
117
+ throw error;
118
+ }
119
+ }
120
+ async removeItem(key) {
121
+ if (!AsyncStorage) {
122
+ throw new Error("AsyncStorage is not available");
123
+ }
124
+ try {
125
+ await AsyncStorage.removeItem(key);
126
+ this.notifyListeners(key, null);
127
+ } catch (error) {
128
+ console.error(`[ReactNativeStorage] Error removing item "${key}":`, error);
129
+ throw error;
130
+ }
131
+ }
132
+ async clear() {
133
+ if (!AsyncStorage) {
134
+ throw new Error("AsyncStorage is not available");
135
+ }
136
+ try {
137
+ await AsyncStorage.clear();
138
+ } catch (error) {
139
+ console.error("[ReactNativeStorage] Error clearing storage:", error);
140
+ throw error;
141
+ }
142
+ }
143
+ addChangeListener(callback) {
144
+ if (!this.listeners.has("*")) {
145
+ this.listeners.set("*", /* @__PURE__ */ new Set());
146
+ }
147
+ this.listeners.get("*").add(callback);
148
+ return () => {
149
+ this.listeners.get("*")?.delete(callback);
150
+ };
151
+ }
152
+ notifyListeners(key, value) {
153
+ const globalListeners = this.listeners.get("*");
154
+ if (globalListeners) {
155
+ globalListeners.forEach((callback) => callback(key, value));
156
+ }
157
+ }
158
+ };
159
+
160
+ // src/storage/miniapp-adapter.ts
161
+ var Taro = null;
162
+ try {
163
+ Taro = chunkDGUM43GV_js.__require("@tarojs/taro").default;
164
+ } catch (e) {
165
+ }
166
+ var MiniAppStorageAdapter = class {
167
+ constructor() {
168
+ this.listeners = /* @__PURE__ */ new Map();
169
+ }
170
+ async getItem(key) {
171
+ if (!Taro) return null;
172
+ try {
173
+ const result = await Taro.getStorage({ key });
174
+ return result.data;
175
+ } catch (error) {
176
+ if (error.errMsg?.includes("data not found")) {
177
+ return null;
178
+ }
179
+ console.error(`[MiniAppStorage] Error getting item "${key}":`, error);
180
+ return null;
181
+ }
182
+ }
183
+ async setItem(key, value) {
184
+ if (!Taro) {
185
+ throw new Error("Taro is not available");
186
+ }
187
+ try {
188
+ await Taro.setStorage({ key, data: value });
189
+ this.notifyListeners(key, value);
190
+ } catch (error) {
191
+ console.error(`[MiniAppStorage] Error setting item "${key}":`, error);
192
+ throw error;
193
+ }
194
+ }
195
+ async removeItem(key) {
196
+ if (!Taro) {
197
+ throw new Error("Taro is not available");
198
+ }
199
+ try {
200
+ await Taro.removeStorage({ key });
201
+ this.notifyListeners(key, null);
202
+ } catch (error) {
203
+ console.error(`[MiniAppStorage] Error removing item "${key}":`, error);
204
+ throw error;
205
+ }
206
+ }
207
+ async clear() {
208
+ if (!Taro) {
209
+ throw new Error("Taro is not available");
210
+ }
211
+ try {
212
+ await Taro.clearStorage();
213
+ } catch (error) {
214
+ console.error("[MiniAppStorage] Error clearing storage:", error);
215
+ throw error;
216
+ }
217
+ }
218
+ addChangeListener(callback) {
219
+ if (!this.listeners.has("*")) {
220
+ this.listeners.set("*", /* @__PURE__ */ new Set());
221
+ }
222
+ this.listeners.get("*").add(callback);
223
+ return () => {
224
+ this.listeners.get("*")?.delete(callback);
225
+ };
226
+ }
227
+ notifyListeners(key, value) {
228
+ const globalListeners = this.listeners.get("*");
229
+ if (globalListeners) {
230
+ globalListeners.forEach((callback) => callback(key, value));
231
+ }
232
+ }
233
+ };
234
+
235
+ // src/storage/electron-adapter.ts
236
+ var hasLocalStorage = typeof window !== "undefined" && typeof window.localStorage !== "undefined";
237
+ var ElectronStorageAdapter = class {
238
+ constructor() {
239
+ this.listeners = /* @__PURE__ */ new Map();
240
+ }
241
+ async getItem(key) {
242
+ if (!hasLocalStorage) {
243
+ return null;
244
+ }
245
+ try {
246
+ return localStorage.getItem(key);
247
+ } catch (error) {
248
+ console.error(`[ElectronStorage] Error getting item "${key}":`, error);
249
+ return null;
250
+ }
251
+ }
252
+ async setItem(key, value) {
253
+ if (!hasLocalStorage) {
254
+ return;
255
+ }
256
+ try {
257
+ localStorage.setItem(key, value);
258
+ this.notifyListeners(key, value);
259
+ if (typeof window !== "undefined") {
260
+ window.dispatchEvent(
261
+ new CustomEvent("electron-storage-change", {
262
+ detail: { key, value }
263
+ })
264
+ );
265
+ }
266
+ } catch (error) {
267
+ console.error(`[ElectronStorage] Error setting item "${key}":`, error);
268
+ throw error;
269
+ }
270
+ }
271
+ async removeItem(key) {
272
+ if (!hasLocalStorage) {
273
+ return;
274
+ }
275
+ try {
276
+ localStorage.removeItem(key);
277
+ this.notifyListeners(key, null);
278
+ if (typeof window !== "undefined") {
279
+ window.dispatchEvent(
280
+ new CustomEvent("electron-storage-change", {
281
+ detail: { key, value: null }
282
+ })
283
+ );
284
+ }
285
+ } catch (error) {
286
+ console.error(`[ElectronStorage] Error removing item "${key}":`, error);
287
+ throw error;
288
+ }
289
+ }
290
+ async clear() {
291
+ if (!hasLocalStorage) {
292
+ return;
293
+ }
294
+ try {
295
+ localStorage.clear();
296
+ this.listeners.forEach((listeners, key) => {
297
+ listeners.forEach((listener) => {
298
+ listener(key, null);
299
+ });
300
+ });
301
+ if (typeof window !== "undefined") {
302
+ window.dispatchEvent(
303
+ new CustomEvent("electron-storage-change", {
304
+ detail: { key: "*", value: null }
305
+ })
306
+ );
307
+ }
308
+ } catch (error) {
309
+ console.error("[ElectronStorage] Error clearing storage:", error);
310
+ throw error;
311
+ }
312
+ }
313
+ /**
314
+ * 添加存储变化监听器
315
+ * 支持跨 Electron 窗口同步
316
+ */
317
+ addChangeListener(listener) {
318
+ const allListeners = this.listeners.get("*") || /* @__PURE__ */ new Set();
319
+ allListeners.add(listener);
320
+ this.listeners.set("*", allListeners);
321
+ const storageHandler = (e) => {
322
+ if (e.key) {
323
+ listener(e.key, e.newValue);
324
+ }
325
+ };
326
+ const customHandler = (e) => {
327
+ const customEvent = e;
328
+ const { key, value } = customEvent.detail;
329
+ if (key === "*") {
330
+ this.listeners.forEach((_, k) => listener(k, null));
331
+ } else {
332
+ listener(key, value);
333
+ }
334
+ };
335
+ if (typeof window !== "undefined") {
336
+ window.addEventListener("storage", storageHandler);
337
+ window.addEventListener("electron-storage-change", customHandler);
338
+ }
339
+ return () => {
340
+ allListeners.delete(listener);
341
+ if (allListeners.size === 0) {
342
+ this.listeners.delete("*");
343
+ }
344
+ if (typeof window !== "undefined") {
345
+ window.removeEventListener("storage", storageHandler);
346
+ window.removeEventListener("electron-storage-change", customHandler);
347
+ }
348
+ };
349
+ }
350
+ removeChangeListener(listener) {
351
+ const allListeners = this.listeners.get("*");
352
+ if (allListeners) {
353
+ allListeners.delete(listener);
354
+ if (allListeners.size === 0) {
355
+ this.listeners.delete("*");
356
+ }
357
+ }
358
+ }
359
+ /**
360
+ * 通知监听器
361
+ */
362
+ notifyListeners(key, value) {
363
+ const keyListeners = this.listeners.get(key);
364
+ if (keyListeners) {
365
+ keyListeners.forEach((listener) => {
366
+ listener(key, value);
367
+ });
368
+ }
369
+ const allListeners = this.listeners.get("*");
370
+ if (allListeners) {
371
+ allListeners.forEach((listener) => {
372
+ listener(key, value);
373
+ });
374
+ }
375
+ }
376
+ };
377
+ function useStorage(storage, key, defaultValue) {
378
+ const [value, setValue] = react.useState(defaultValue);
379
+ const [loading, setLoading] = react.useState(true);
380
+ react.useEffect(() => {
381
+ const loadValue = async () => {
382
+ try {
383
+ const stored = await storage.getItem(key);
384
+ if (stored !== null) {
385
+ setValue(JSON.parse(stored));
386
+ }
387
+ } catch (error) {
388
+ console.error(`Error reading storage key "${key}":`, error);
389
+ } finally {
390
+ setLoading(false);
391
+ }
392
+ };
393
+ void loadValue();
394
+ }, [storage, key]);
395
+ const updateValue = react.useCallback(
396
+ async (newValue) => {
397
+ try {
398
+ setValue(newValue);
399
+ await storage.setItem(key, JSON.stringify(newValue));
400
+ if ("dispatchChange" in storage && typeof storage.dispatchChange === "function") {
401
+ storage.dispatchChange(key, JSON.stringify(newValue));
402
+ }
403
+ } catch (error) {
404
+ console.error(`Error setting storage key "${key}":`, error);
405
+ }
406
+ },
407
+ [storage, key]
408
+ );
409
+ const removeValue = react.useCallback(async () => {
410
+ try {
411
+ setValue(defaultValue);
412
+ await storage.removeItem(key);
413
+ if ("dispatchChange" in storage && typeof storage.dispatchChange === "function") {
414
+ storage.dispatchChange(key, null);
415
+ }
416
+ } catch (error) {
417
+ console.error(`Error removing storage key "${key}":`, error);
418
+ }
419
+ }, [storage, key, defaultValue]);
420
+ react.useEffect(() => {
421
+ if (!storage.addChangeListener) {
422
+ return;
423
+ }
424
+ const cleanup = storage.addChangeListener((changedKey, newValue) => {
425
+ if (changedKey === key) {
426
+ try {
427
+ if (newValue === null) {
428
+ setValue(defaultValue);
429
+ } else {
430
+ setValue(JSON.parse(newValue));
431
+ }
432
+ } catch (error) {
433
+ console.error("Error parsing storage change event:", error);
434
+ }
435
+ }
436
+ });
437
+ return cleanup;
438
+ }, [storage, key, defaultValue]);
439
+ return [value, updateValue, removeValue, loading];
440
+ }
441
+
442
+ // src/storage/hooks/useLocalStorage.ts
443
+ var webStorage = new WebStorageAdapter();
444
+ function useLocalStorage(key, defaultValue) {
445
+ return useStorage(webStorage, key, defaultValue);
446
+ }
447
+
448
+ // src/storage/hooks/useAsyncStorage.ts
449
+ var asyncStorage = new ReactNativeStorageAdapter();
450
+ function useAsyncStorage(key, defaultValue) {
451
+ return useStorage(asyncStorage, key, defaultValue);
452
+ }
453
+
454
+ // src/storage/hooks/useTaroStorage.ts
455
+ var taroStorage = new MiniAppStorageAdapter();
456
+ function useTaroStorage(key, defaultValue) {
457
+ return useStorage(taroStorage, key, defaultValue);
458
+ }
459
+
460
+ // src/storage/hooks/useElectronStorage.ts
461
+ var electronStorage = new ElectronStorageAdapter();
462
+ function useElectronStorage(key, defaultValue) {
463
+ return useStorage(electronStorage, key, defaultValue);
464
+ }
465
+
466
+ exports.ElectronStorageAdapter = ElectronStorageAdapter;
467
+ exports.MiniAppStorageAdapter = MiniAppStorageAdapter;
468
+ exports.ReactNativeStorageAdapter = ReactNativeStorageAdapter;
469
+ exports.WebStorageAdapter = WebStorageAdapter;
470
+ exports.useAsyncStorage = useAsyncStorage;
471
+ exports.useElectronStorage = useElectronStorage;
472
+ exports.useLocalStorage = useLocalStorage;
473
+ exports.useStorage = useStorage;
474
+ exports.useTaroStorage = useTaroStorage;
475
+ //# sourceMappingURL=chunk-TLXAIOXP.js.map
476
+ //# sourceMappingURL=chunk-TLXAIOXP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storage/web-adapter.ts","../src/storage/react-native-adapter.ts","../src/storage/miniapp-adapter.ts","../src/storage/electron-adapter.ts","../src/storage/hooks/useStorage.ts","../src/storage/hooks/useLocalStorage.ts","../src/storage/hooks/useAsyncStorage.ts","../src/storage/hooks/useTaroStorage.ts","../src/storage/hooks/useElectronStorage.ts"],"names":["__require","useState","useEffect","useCallback"],"mappings":"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","file":"chunk-TLXAIOXP.js","sourcesContent":["/**\n * Web 平台存储适配器 (localStorage)\n */\n\nimport type { StorageAdapter } from './types';\n\n/**\n * 检查是否在浏览器环境中\n */\nconst isBrowser = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\nexport class WebStorageAdapter implements StorageAdapter {\n async getItem(key: string): Promise<string | null> {\n // SSR 环境下返回 null\n if (!isBrowser) {\n return null;\n }\n\n try {\n return localStorage.getItem(key);\n } catch (error) {\n console.error(`[WebStorage] Error getting item \"${key}\":`, error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // SSR 环境下静默忽略\n if (!isBrowser) {\n return;\n }\n\n try {\n localStorage.setItem(key, value);\n } catch (error) {\n console.error(`[WebStorage] Error setting item \"${key}\":`, error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n // SSR 环境下静默忽略\n if (!isBrowser) {\n return;\n }\n\n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.error(`[WebStorage] Error removing item \"${key}\":`, error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n // SSR 环境下静默忽略\n if (!isBrowser) {\n return;\n }\n\n try {\n localStorage.clear();\n } catch (error) {\n console.error('[WebStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n addChangeListener(callback: (key: string, value: string | null) => void): () => void {\n // SSR 环境下返回空函数\n if (!isBrowser) {\n return () => {};\n }\n\n // 监听 storage 事件(跨标签页)\n const handleStorageEvent = (e: StorageEvent) => {\n if (e.key) {\n callback(e.key, e.newValue);\n }\n };\n\n // 监听自定义事件(同标签页)\n const handleCustomEvent = (e: Event) => {\n const customEvent = e as CustomEvent;\n callback(customEvent.detail.key, customEvent.detail.value);\n };\n\n window.addEventListener('storage', handleStorageEvent);\n window.addEventListener('local-storage-change', handleCustomEvent);\n\n // 返回清理函数\n return () => {\n window.removeEventListener('storage', handleStorageEvent);\n window.removeEventListener('local-storage-change', handleCustomEvent);\n };\n }\n\n /**\n * 触发自定义事件,通知同标签页的其他组件\n */\n dispatchChange(key: string, value: string | null): void {\n // SSR 环境下静默忽略\n if (!isBrowser) {\n return;\n }\n\n window.dispatchEvent(\n new CustomEvent('local-storage-change', {\n detail: { key, value },\n })\n );\n }\n}\n\n","/**\n * React Native 平台存储适配器 (AsyncStorage)\n */\n\nimport type { StorageAdapter } from './types';\n\n// 动态导入 AsyncStorage(避免在非 RN 环境报错)\nlet AsyncStorage: any = null;\n\ntry {\n AsyncStorage = require('@react-native-async-storage/async-storage').default;\n} catch (e) {\n // AsyncStorage 不可用(非 React Native 环境)\n // 这是正常的,不需要警告\n}\n\nexport class ReactNativeStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n if (!AsyncStorage) return null;\n\n try {\n return await AsyncStorage.getItem(key);\n } catch (error) {\n console.error(`[ReactNativeStorage] Error getting item \"${key}\":`, error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.setItem(key, value);\n this.notifyListeners(key, value);\n } catch (error) {\n console.error(`[ReactNativeStorage] Error setting item \"${key}\":`, error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.removeItem(key);\n this.notifyListeners(key, null);\n } catch (error) {\n console.error(`[ReactNativeStorage] Error removing item \"${key}\":`, error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.clear();\n } catch (error) {\n console.error('[ReactNativeStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n addChangeListener(callback: (key: string, value: string | null) => void): () => void {\n // React Native 没有原生的跨实例存储监听,我们使用内存中的监听器\n if (!this.listeners.has('*')) {\n this.listeners.set('*', new Set());\n }\n\n this.listeners.get('*')!.add(callback);\n\n // 返回清理函数\n return () => {\n this.listeners.get('*')?.delete(callback);\n };\n }\n\n private notifyListeners(key: string, value: string | null): void {\n const globalListeners = this.listeners.get('*');\n if (globalListeners) {\n globalListeners.forEach((callback) => callback(key, value));\n }\n }\n}\n\n","/**\n * 小程序平台存储适配器 (wx.storage / Taro.storage)\n */\n\nimport type { StorageAdapter } from './types';\n\n// 尝试导入 Taro\nlet Taro: any = null;\n\ntry {\n Taro = require('@tarojs/taro').default;\n} catch (e) {\n // Taro 不可用(非小程序环境)\n}\n\nexport class MiniAppStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n if (!Taro) return null;\n\n try {\n const result = await Taro.getStorage({ key });\n return result.data;\n } catch (error: any) {\n // 如果 key 不存在,Taro 会抛出错误\n if (error.errMsg?.includes('data not found')) {\n return null;\n }\n console.error(`[MiniAppStorage] Error getting item \"${key}\":`, error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n if (!Taro) {\n throw new Error('Taro is not available');\n }\n\n try {\n await Taro.setStorage({ key, data: value });\n this.notifyListeners(key, value);\n } catch (error) {\n console.error(`[MiniAppStorage] Error setting item \"${key}\":`, error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n if (!Taro) {\n throw new Error('Taro is not available');\n }\n\n try {\n await Taro.removeStorage({ key });\n this.notifyListeners(key, null);\n } catch (error) {\n console.error(`[MiniAppStorage] Error removing item \"${key}\":`, error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n if (!Taro) {\n throw new Error('Taro is not available');\n }\n\n try {\n await Taro.clearStorage();\n } catch (error) {\n console.error('[MiniAppStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n addChangeListener(callback: (key: string, value: string | null) => void): () => void {\n // 小程序没有原生的存储监听,我们使用内存中的监听器\n if (!this.listeners.has('*')) {\n this.listeners.set('*', new Set());\n }\n\n this.listeners.get('*')!.add(callback);\n\n // 返回清理函数\n return () => {\n this.listeners.get('*')?.delete(callback);\n };\n }\n\n private notifyListeners(key: string, value: string | null): void {\n const globalListeners = this.listeners.get('*');\n if (globalListeners) {\n globalListeners.forEach((callback) => callback(key, value));\n }\n }\n}\n\n","/**\n * Electron 桌面端存储适配器\n *\n * Electron 渲染进程可以使用 localStorage(和 Web 相同)\n * 但我们提供专门的适配器以支持未来可能的主进程存储需求\n */\n\nimport type { StorageAdapter } from './types';\n\n/**\n * 检查 localStorage 是否可用(Electron 渲染进程)\n */\nconst hasLocalStorage = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\nexport class ElectronStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n // 非 Electron 或无 localStorage 环境返回 null\n if (!hasLocalStorage) {\n return null;\n }\n\n try {\n return localStorage.getItem(key);\n } catch (error) {\n console.error(`[ElectronStorage] Error getting item \"${key}\":`, error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // 非 Electron 或无 localStorage 环境静默忽略\n if (!hasLocalStorage) {\n return;\n }\n\n try {\n localStorage.setItem(key, value);\n this.notifyListeners(key, value);\n\n // 触发自定义事件(用于跨窗口同步)\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('electron-storage-change', {\n detail: { key, value },\n })\n );\n }\n } catch (error) {\n console.error(`[ElectronStorage] Error setting item \"${key}\":`, error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n if (!hasLocalStorage) {\n return;\n }\n\n try {\n localStorage.removeItem(key);\n this.notifyListeners(key, null);\n\n // 触发自定义事件\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('electron-storage-change', {\n detail: { key, value: null },\n })\n );\n }\n } catch (error) {\n console.error(`[ElectronStorage] Error removing item \"${key}\":`, error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n if (!hasLocalStorage) {\n return;\n }\n\n try {\n localStorage.clear();\n\n // 通知所有监听器\n this.listeners.forEach((listeners, key) => {\n listeners.forEach((listener) => {\n listener(key, null);\n });\n });\n\n // 触发自定义事件\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('electron-storage-change', {\n detail: { key: '*', value: null },\n })\n );\n }\n } catch (error) {\n console.error('[ElectronStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n /**\n * 添加存储变化监听器\n * 支持跨 Electron 窗口同步\n */\n addChangeListener(listener: (key: string, newValue: string | null) => void): () => void {\n // 添加到监听器集合\n const allListeners = this.listeners.get('*') || new Set();\n allListeners.add(listener);\n this.listeners.set('*', allListeners);\n\n // Storage 事件监听(同源窗口)\n const storageHandler = (e: StorageEvent) => {\n if (e.key) {\n listener(e.key, e.newValue);\n }\n };\n\n // 自定义事件监听(Electron 窗口间通信)\n const customHandler = (e: Event) => {\n const customEvent = e as CustomEvent;\n const { key, value } = customEvent.detail;\n if (key === '*') {\n // clear 操作\n this.listeners.forEach((_, k) => listener(k, null));\n } else {\n listener(key, value);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', storageHandler);\n window.addEventListener('electron-storage-change', customHandler);\n }\n\n // 返回清理函数\n return () => {\n allListeners.delete(listener);\n if (allListeners.size === 0) {\n this.listeners.delete('*');\n }\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('storage', storageHandler);\n window.removeEventListener('electron-storage-change', customHandler);\n }\n };\n }\n\n removeChangeListener(listener: (key: string, newValue: string | null) => void): void {\n const allListeners = this.listeners.get('*');\n if (allListeners) {\n allListeners.delete(listener);\n if (allListeners.size === 0) {\n this.listeners.delete('*');\n }\n }\n }\n\n /**\n * 通知监听器\n */\n private notifyListeners(key: string, value: string | null): void {\n // 通知特定 key 的监听器\n const keyListeners = this.listeners.get(key);\n if (keyListeners) {\n keyListeners.forEach((listener) => {\n listener(key, value);\n });\n }\n\n // 通知通配符监听器\n const allListeners = this.listeners.get('*');\n if (allListeners) {\n allListeners.forEach((listener) => {\n listener(key, value);\n });\n }\n }\n}\n\n","/**\n * 通用存储 Hook\n * 支持多平台:Web、React Native、小程序\n *\n * 优点:\n * 1. 异步读取,不阻塞渲染\n * 2. 统一的错误处理\n * 3. 类型安全\n * 4. 跨平台支持\n * 5. 自动同步(支持的平台)\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { StorageAdapter } from '../types';\n\nexport function useStorage<T>(\n storage: StorageAdapter,\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n const [value, setValue] = useState<T>(defaultValue);\n const [loading, setLoading] = useState(true);\n\n // 初始化时从存储读取\n useEffect(() => {\n const loadValue = async () => {\n try {\n const stored = await storage.getItem(key);\n if (stored !== null) {\n setValue(JSON.parse(stored));\n }\n } catch (error) {\n console.error(`Error reading storage key \"${key}\":`, error);\n } finally {\n setLoading(false);\n }\n };\n\n void loadValue();\n }, [storage, key]);\n\n // 更新值并同步到存储\n const updateValue = useCallback(\n async (newValue: T) => {\n try {\n setValue(newValue);\n await storage.setItem(key, JSON.stringify(newValue));\n\n // 如果是 Web 适配器,触发自定义事件\n if ('dispatchChange' in storage && typeof storage.dispatchChange === 'function') {\n (storage as any).dispatchChange(key, JSON.stringify(newValue));\n }\n } catch (error) {\n console.error(`Error setting storage key \"${key}\":`, error);\n }\n },\n [storage, key]\n );\n\n // 删除值\n const removeValue = useCallback(async () => {\n try {\n setValue(defaultValue);\n await storage.removeItem(key);\n\n // 如果是 Web 适配器,触发自定义事件\n if ('dispatchChange' in storage && typeof storage.dispatchChange === 'function') {\n (storage as any).dispatchChange(key, null);\n }\n } catch (error) {\n console.error(`Error removing storage key \"${key}\":`, error);\n }\n }, [storage, key, defaultValue]);\n\n // 监听存储变化\n useEffect(() => {\n if (!storage.addChangeListener) {\n return;\n }\n\n const cleanup = storage.addChangeListener((changedKey: string, newValue: string | null) => {\n if (changedKey === key) {\n try {\n if (newValue === null) {\n setValue(defaultValue);\n } else {\n setValue(JSON.parse(newValue));\n }\n } catch (error) {\n console.error('Error parsing storage change event:', error);\n }\n }\n });\n\n return cleanup;\n }, [storage, key, defaultValue]);\n\n return [value, updateValue, removeValue, loading];\n}\n\n","/**\n * Web 平台 localStorage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { WebStorageAdapter } from '../web-adapter';\n\n// 创建单例适配器\nconst webStorage = new WebStorageAdapter();\n\n/**\n * Web 平台的 localStorage Hook\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n */\nexport function useLocalStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(webStorage, key, defaultValue);\n}\n\n","'use client';\n\n/**\n * React Native AsyncStorage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { ReactNativeStorageAdapter } from '../react-native-adapter';\n\n// 创建单例适配器\nconst asyncStorage = new ReactNativeStorageAdapter();\n\n/**\n * React Native 的 AsyncStorage Hook\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n */\nexport function useAsyncStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(asyncStorage, key, defaultValue);\n}\n\n","'use client';\n\n/**\n * 小程序 Taro Storage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { MiniAppStorageAdapter } from '../miniapp-adapter';\n\n// 创建单例适配器\nconst taroStorage = new MiniAppStorageAdapter();\n\n/**\n * 小程序的 Taro Storage Hook\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n */\nexport function useTaroStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(taroStorage, key, defaultValue);\n}\n\n","'use client';\n\n/**\n * Electron 桌面端 Storage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { ElectronStorageAdapter } from '../electron-adapter';\n\n// 创建单例适配器\nconst electronStorage = new ElectronStorageAdapter();\n\n/**\n * Electron 桌面端的 Storage Hook\n *\n * 在 Electron 渲染进程中使用 localStorage\n * 支持跨窗口同步\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n *\n * @example\n * ```tsx\n * const [token, setToken, removeToken] = useElectronStorage('auth-token', '')\n * ```\n */\nexport function useElectronStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(electronStorage, key, defaultValue);\n}\n\n"]}