model.id === modelId)
if (model) {
if (
- engines?.[model.engine]?.[0].type === 'local' ||
- (engines?.[model.engine]?.[0].api_key?.length ?? 0) > 0
+ engines?.[model.engine]?.[0]?.type === 'local' ||
+ (engines?.[model.engine]?.[0]?.api_key?.length ?? 0) > 0
)
setSelectedModel(model)
} else {
diff --git a/web/containers/Providers/SWRConfigProvider.tsx b/web/containers/Providers/SWRConfigProvider.tsx
new file mode 100644
index 0000000000..3463853439
--- /dev/null
+++ b/web/containers/Providers/SWRConfigProvider.tsx
@@ -0,0 +1,30 @@
+'use client'
+
+import * as React from 'react'
+
+import { SWRConfig } from 'swr'
+
+function SWRConfigProvider({ children }: { children: React.ReactNode }) {
+ // https://swr.vercel.app/docs/advanced/cache#localstorage-based-persistent-cache
+ // When initializing, we restore the data from `localStorage` into a map.
+
+ const map = React.useMemo(() => new Map(), [])
+ React.useEffect(() => {
+ const savedCache = JSON.parse(
+ window.localStorage.getItem('app-cache') || '[]'
+ )
+ savedCache.forEach(([key, value]: [string, object]) => {
+ map.set(key, value)
+ })
+
+ // Before unloading the app, we write back all the data into `localStorage`.
+ window.addEventListener('beforeunload', () => {
+ const appCache = JSON.stringify(Array.from(map.entries()))
+ window.localStorage.setItem('app-cache', appCache)
+ })
+ }, [map])
+
+ return map }}>{children}
+}
+
+export default SWRConfigProvider
diff --git a/web/containers/Providers/index.tsx b/web/containers/Providers/index.tsx
index 67778e30c4..bed0f07ecf 100644
--- a/web/containers/Providers/index.tsx
+++ b/web/containers/Providers/index.tsx
@@ -4,6 +4,8 @@ import { PropsWithChildren } from 'react'
import { Toaster } from 'react-hot-toast'
+import { SWRConfig } from 'swr'
+
import EventListener from '@/containers/Providers/EventListener'
import JotaiWrapper from '@/containers/Providers/Jotai'
@@ -18,27 +20,30 @@ import DeepLinkListener from './DeepLinkListener'
import KeyListener from './KeyListener'
import Responsive from './Responsive'
+import SWRConfigProvider from './SWRConfigProvider'
import SettingsHandler from './SettingsHandler'
const Providers = ({ children }: PropsWithChildren) => {
return (
-
-
-
-
- <>
-
-
-
-
-
-
-
- {children}
- >
-
-
-
+
+
+
+
+
+ <>
+
+
+
+
+
+
+
+ {children}
+ >
+
+
+
+
)
}
diff --git a/web/screens/Settings/MyModels/MyModelList/index.tsx b/web/screens/Settings/MyModels/MyModelList/index.tsx
index ba21d79bd9..6824d1471f 100644
--- a/web/screens/Settings/MyModels/MyModelList/index.tsx
+++ b/web/screens/Settings/MyModels/MyModelList/index.tsx
@@ -2,7 +2,7 @@ import { memo, useState } from 'react'
import { Model } from '@janhq/core'
import { Badge, Button, Tooltip, useClickOutside } from '@janhq/joi'
-import { useAtom, useAtomValue } from 'jotai'
+import { useAtom } from 'jotai'
import {
MoreVerticalIcon,
PlayIcon,
|