diff --git a/README.md b/README.md
index da1adb6a5..db62e0838 100644
--- a/README.md
+++ b/README.md
@@ -30,6 +30,8 @@ One-Click to get a well-designed cross-platform ChatGPT web UI, with GPT3, GPT4
[
](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FChatGPTNextWeb%2FChatGPT-Next-Web&env=OPENAI_API_KEY&env=CODE&project-name=nextchat&repository-name=NextChat) [
](https://zeabur.com/templates/ZBUEFA) [
](https://gitpod.io/#https://github.com/Yidadaa/ChatGPT-Next-Web)
+[
](https://monica.im/?utm=nxcrp)
+
## Enterprise Edition
diff --git a/app/store/chat.ts b/app/store/chat.ts
index ff0f27c8d..5742ee692 100644
--- a/app/store/chat.ts
+++ b/app/store/chat.ts
@@ -32,6 +32,7 @@ import { createPersistStore } from "../utils/store";
import { collectModelsWithDefaultModel } from "../utils/model";
import { useAccessStore } from "./access";
import { isDalle3 } from "../utils";
+import { indexedDBStorage } from "@/app/utils/indexedDB-storage";
export type ChatMessage = RequestMessage & {
date: string;
@@ -1023,7 +1024,8 @@ export const useChatStore = createPersistStore(
set(() => ({ sessions }));
},
- clearAllData() {
+ async clearAllData() {
+ await indexedDBStorage.clear();
localStorage.clear();
location.reload();
},
diff --git a/app/utils/indexedDB-storage.ts b/app/utils/indexedDB-storage.ts
new file mode 100644
index 000000000..51ee92b81
--- /dev/null
+++ b/app/utils/indexedDB-storage.ts
@@ -0,0 +1,38 @@
+import { StateStorage } from "zustand/middleware";
+import { get, set, del, clear } from "idb-keyval";
+
+class IndexedDBStorage implements StateStorage {
+ public async getItem(name: string): Promise {
+ try {
+ return (await get(name)) || localStorage.getItem(name);
+ } catch (error) {
+ return localStorage.getItem(name);
+ }
+ }
+
+ public async setItem(name: string, value: string): Promise {
+ try {
+ await set(name, value);
+ } catch (error) {
+ localStorage.setItem(name, value);
+ }
+ }
+
+ public async removeItem(name: string): Promise {
+ try {
+ await del(name);
+ } catch (error) {
+ localStorage.removeItem(name);
+ }
+ }
+
+ public async clear(): Promise {
+ try {
+ await clear();
+ } catch (error) {
+ localStorage.clear();
+ }
+ }
+}
+
+export const indexedDBStorage = new IndexedDBStorage();
diff --git a/app/utils/store.ts b/app/utils/store.ts
index 684a19112..13bef6d5d 100644
--- a/app/utils/store.ts
+++ b/app/utils/store.ts
@@ -1,7 +1,8 @@
import { create } from "zustand";
-import { combine, persist } from "zustand/middleware";
+import { combine, persist, createJSONStorage } from "zustand/middleware";
import { Updater } from "../typing";
import { deepClone } from "./clone";
+import { indexedDBStorage } from "@/app/utils/indexedDB-storage";
type SecondParam = T extends (
_f: infer _F,
@@ -31,6 +32,7 @@ export function createPersistStore(
) => M,
persistOptions: SecondParam>>,
) {
+ persistOptions.storage = createJSONStorage(() => indexedDBStorage);
return create(
persist(
combine(
diff --git a/package.json b/package.json
index 3abd3d5c7..eacf4d7b1 100644
--- a/package.json
+++ b/package.json
@@ -36,6 +36,7 @@
"fuse.js": "^7.0.0",
"heic2any": "^0.0.4",
"html-to-image": "^1.11.11",
+ "idb-keyval": "^6.2.1",
"lodash-es": "^4.17.21",
"mermaid": "^10.7.0",
"microsoft-cognitiveservices-speech-sdk": "^1.36.0",
diff --git a/yarn.lock b/yarn.lock
index 6dee7e17d..b07174ebd 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4877,6 +4877,11 @@ iconv-lite@0.6:
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
+idb-keyval@^6.2.1:
+ version "6.2.1"
+ resolved "https://registry.npmmirror.com/idb-keyval/-/idb-keyval-6.2.1.tgz#94516d625346d16f56f3b33855da11bfded2db33"
+ integrity sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==
+
ignore@^5.2.0:
version "5.3.1"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef"