repo_description: ✨ Light and Fast AI Assistant. Support: Web | iOS | MacOS | Android |  Linux | Windows
repo_topics: calclaude chatgpt claude cross-platform desktop fe gemini gemini-pro gemini-server gemini-ultra gpt-4o groq nextjs ollama react tauri tauri-app vercel webui
code: import { StateStorage } from "zustand/middleware";
  import { get, set, del, clear } from "idb-keyval";
  import { safeLocalStorage } from "@/app/utils";
  
  const localStorage = safeLocalStorage();
  
  class IndexedDBStorage implements StateStorage {
    public async getItem(name: string): Promise<string | null> {
      try {
        const value = (await get(name)) || localStorage.getItem(name);
        return value;
      } catch (error) {
        return localStorage.getItem(name);
      }
    }
  
    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);
      }
    }
  
    public async removeItem(name: string): Promise<void> {
      try {
        await del(name);
      } catch (error) {
        localStorage.removeItem(name);
      }
    }
  
    public async clear(): Promise<void> {
      try {
        await clear();
      } catch (error) {
        localStorage.clear();
      }
    }
  }
  
  export const indexedDBStorage = new IndexedDBStorage();
  