indexedDB-storage.ts 1.1 KB

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