feat(ui): persist selectedProfileId across sessions

Wrap useUIStore in zustand/middleware's persist under the key
voicebox-ui. partialize only selectedProfileId so volatile UI state
(dialog open flags, form drafts, engine/voice pickers, sidebar) stays
in-memory as before — but reopening the app no longer loses whichever
profile the user was last working with.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
This commit is contained in:
James Pine
2026-04-23 19:20:42 -07:00
co-authored by Claude Opus 4.7
parent 67a9e308a9
commit 687ab2aa16
+11 -2
View File
@@ -1,4 +1,5 @@
import { create } from 'zustand'; import { create } from 'zustand';
import { persist } from 'zustand/middleware';
// Draft state for the create voice profile form // Draft state for the create voice profile form
export interface ProfileFormDraft { export interface ProfileFormDraft {
@@ -49,7 +50,9 @@ interface UIStore {
setTheme: (theme: 'light' | 'dark') => void; setTheme: (theme: 'light' | 'dark') => void;
} }
export const useUIStore = create<UIStore>((set) => ({ export const useUIStore = create<UIStore>()(
persist(
(set) => ({
sidebarOpen: true, sidebarOpen: true,
setSidebarOpen: (open) => set({ sidebarOpen: open }), setSidebarOpen: (open) => set({ sidebarOpen: open }),
@@ -78,4 +81,10 @@ export const useUIStore = create<UIStore>((set) => ({
set({ theme }); set({ theme });
document.documentElement.classList.toggle('dark', theme === 'dark'); document.documentElement.classList.toggle('dark', theme === 'dark');
}, },
})); }),
{
name: 'voicebox-ui',
partialize: (state) => ({ selectedProfileId: state.selectedProfileId }),
},
),
);