indexedDB-storage.ts 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { StateStorage } from "zustand/middleware";
  2. import { get, set, del, clear } from "idb-keyval";
  3. class IndexedDBStorage implements StateStorage {
  4. public async getItem(name: string): Promise<string | null> {
  5. try {
  6. const value = (await get(name)) || localStorage.getItem(name);
  7. return value;
  8. } catch (error) {
  9. return localStorage.getItem(name);
  10. }
  11. }
  12. public async setItem(name: string, value: string): Promise<void> {
  13. try {
  14. const _value = JSON.parse(value);
  15. if (!_value?.state?._hasHydrated) {
  16. console.warn("skip setItem", name);
  17. return;
  18. }
  19. await set(name, value);
  20. } catch (error) {
  21. localStorage.setItem(name, value);
  22. }
  23. }
  24. public async removeItem(name: string): Promise<void> {
  25. try {
  26. await del(name);
  27. } catch (error) {
  28. localStorage.removeItem(name);
  29. }
  30. }
  31. public async clear(): Promise<void> {
  32. try {
  33. await clear();
  34. } catch (error) {
  35. localStorage.clear();
  36. }
  37. }
  38. }
  39. export const indexedDBStorage = new IndexedDBStorage();