fix: ai friend's picture localStorge
Browse files- assets/ai_friend.png +3 -0
- assets/desktop.png +3 -0
- desktop/src/stores/companionStore.ts +33 -4
assets/ai_friend.png
ADDED
|
Git LFS Details
|
assets/desktop.png
ADDED
|
Git LFS Details
|
desktop/src/stores/companionStore.ts
CHANGED
|
@@ -1,6 +1,29 @@
|
|
| 1 |
import { create } from 'zustand'
|
| 2 |
import type { CompanionStatus } from '../types/companion'
|
| 3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
interface CompanionStore {
|
| 5 |
status: CompanionStatus
|
| 6 |
serverUrl: string
|
|
@@ -44,8 +67,8 @@ export const useCompanionStore = create<CompanionStore>((set) => ({
|
|
| 44 |
micEnabled: true,
|
| 45 |
cameraEnabled: true,
|
| 46 |
error: null,
|
| 47 |
-
avatarUrl:
|
| 48 |
-
backgroundUrl:
|
| 49 |
|
| 50 |
setServerUrl: (url) => set({ serverUrl: url }),
|
| 51 |
setVoiceName: (name) => set({ voiceName: name }),
|
|
@@ -60,8 +83,14 @@ export const useCompanionStore = create<CompanionStore>((set) => ({
|
|
| 60 |
setMicEnabled: (enabled) => set({ micEnabled: enabled }),
|
| 61 |
setCameraEnabled: (enabled) => set({ cameraEnabled: enabled }),
|
| 62 |
setError: (error) => set({ error }),
|
| 63 |
-
setAvatarUrl: (url) =>
|
| 64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
reset: () =>
|
| 66 |
set({
|
| 67 |
status: 'disconnected',
|
|
|
|
| 1 |
import { create } from 'zustand'
|
| 2 |
import type { CompanionStatus } from '../types/companion'
|
| 3 |
|
| 4 |
+
const AVATAR_KEY = 'companion-avatar-url'
|
| 5 |
+
const BACKGROUND_KEY = 'companion-background-url'
|
| 6 |
+
|
| 7 |
+
function loadPersisted(key: string): string | null {
|
| 8 |
+
try {
|
| 9 |
+
return localStorage.getItem(key)
|
| 10 |
+
} catch {
|
| 11 |
+
return null
|
| 12 |
+
}
|
| 13 |
+
}
|
| 14 |
+
|
| 15 |
+
function persist(key: string, value: string | null) {
|
| 16 |
+
try {
|
| 17 |
+
if (value === null) {
|
| 18 |
+
localStorage.removeItem(key)
|
| 19 |
+
} else {
|
| 20 |
+
localStorage.setItem(key, value)
|
| 21 |
+
}
|
| 22 |
+
} catch {
|
| 23 |
+
// localStorage may be full; silently ignore
|
| 24 |
+
}
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
interface CompanionStore {
|
| 28 |
status: CompanionStatus
|
| 29 |
serverUrl: string
|
|
|
|
| 67 |
micEnabled: true,
|
| 68 |
cameraEnabled: true,
|
| 69 |
error: null,
|
| 70 |
+
avatarUrl: loadPersisted(AVATAR_KEY),
|
| 71 |
+
backgroundUrl: loadPersisted(BACKGROUND_KEY),
|
| 72 |
|
| 73 |
setServerUrl: (url) => set({ serverUrl: url }),
|
| 74 |
setVoiceName: (name) => set({ voiceName: name }),
|
|
|
|
| 83 |
setMicEnabled: (enabled) => set({ micEnabled: enabled }),
|
| 84 |
setCameraEnabled: (enabled) => set({ cameraEnabled: enabled }),
|
| 85 |
setError: (error) => set({ error }),
|
| 86 |
+
setAvatarUrl: (url) => {
|
| 87 |
+
persist(AVATAR_KEY, url)
|
| 88 |
+
set({ avatarUrl: url })
|
| 89 |
+
},
|
| 90 |
+
setBackgroundUrl: (url) => {
|
| 91 |
+
persist(BACKGROUND_KEY, url)
|
| 92 |
+
set({ backgroundUrl: url })
|
| 93 |
+
},
|
| 94 |
reset: () =>
|
| 95 |
set({
|
| 96 |
status: 'disconnected',
|