Przeglądaj źródła

Merge pull request #5356 from ConnectAI-E/feature/indexdb

fix: hydrated for indexedDB
Lloyd Zhou 1 rok temu
rodzic
commit
85704570f3
2 zmienionych plików z 19 dodań i 1 usunięć
  1. 7 1
      app/utils/indexedDB-storage.ts
  2. 12 0
      app/utils/store.ts

+ 7 - 1
app/utils/indexedDB-storage.ts

@@ -4,7 +4,8 @@ import { get, set, del, clear } from "idb-keyval";
 class IndexedDBStorage implements StateStorage {
   public async getItem(name: string): Promise<string | null> {
     try {
-      return (await get(name)) || localStorage.getItem(name);
+      const value = (await get(name)) || localStorage.getItem(name);
+      return value;
     } catch (error) {
       return localStorage.getItem(name);
     }
@@ -12,6 +13,11 @@ class IndexedDBStorage implements StateStorage {
 
   public async setItem(name: string, value: string): Promise<void> {
     try {
+      const _value = JSON.parse(value);
+      if (!_value?.state?._hasHydrated) {
+        console.warn("skip setItem", name);
+        return;
+      }
       await set(name, value);
     } catch (error) {
       localStorage.setItem(name, value);

+ 12 - 0
app/utils/store.ts

@@ -14,9 +14,11 @@ type SecondParam<T> = T extends (
 
 type MakeUpdater<T> = {
   lastUpdateTime: number;
+  _hasHydrated: boolean;
 
   markUpdate: () => void;
   update: Updater<T>;
+  setHasHydrated: (state: boolean) => void;
 };
 
 type SetStoreState<T> = (
@@ -33,12 +35,19 @@ export function createPersistStore<T extends object, M>(
   persistOptions: SecondParam<typeof persist<T & M & MakeUpdater<T>>>,
 ) {
   persistOptions.storage = createJSONStorage(() => indexedDBStorage);
+  const oldOonRehydrateStorage = persistOptions?.onRehydrateStorage;
+  persistOptions.onRehydrateStorage = (state) => {
+    oldOonRehydrateStorage?.(state);
+    return () => state.setHasHydrated(true);
+  };
+
   return create(
     persist(
       combine(
         {
           ...state,
           lastUpdateTime: 0,
+          _hasHydrated: false,
         },
         (set, get) => {
           return {
@@ -57,6 +66,9 @@ export function createPersistStore<T extends object, M>(
                 lastUpdateTime: Date.now(),
               });
             },
+            setHasHydrated: (state: boolean) => {
+              set({ _hasHydrated: state } as Partial<T & M & MakeUpdater<T>>);
+            },
           } as M & MakeUpdater<T>;
         },
       ),