Files
aaronai-web/lib/store.ts
T

80 lines
2.1 KiB
TypeScript

import { create } from 'zustand';
import { persist } from 'zustand/middleware';
import type { Conversation, Message, Settings, Status } from './api';
interface AppState {
// Conversations
conversations: Conversation[];
currentId: string | null;
messages: Message[];
setConversations: (c: Conversation[]) => void;
setCurrentId: (id: string | null) => void;
setMessages: (m: Message[]) => void;
addMessage: (m: Message) => void;
// Settings
settings: Settings;
setSettings: (s: Partial<Settings>) => void;
// Status
status: Status | null;
setStatus: (s: Status) => void;
// UI
settingsOpen: boolean;
setSettingsOpen: (open: boolean) => void;
sidebarOpen: boolean;
setSidebarOpen: (open: boolean) => void;
isLoading: boolean;
setIsLoading: (loading: boolean) => void;
}
export const useStore = create<AppState>()(
persist(
(set) => ({
// Conversations
conversations: [],
currentId: null,
messages: [],
setConversations: (conversations) => set({ conversations }),
setCurrentId: (currentId) => set({ currentId }),
setMessages: (messages) => set({ messages }),
addMessage: (m) => set((s) => ({ messages: [...s.messages, m] })),
// Settings — defaults
settings: {
theme: 'light',
font_size: 'medium',
web_search: true,
show_sources: true,
dream_hour_utc: 8,
dream_minute_utc: 0,
dream_mode: 'nrem',
ingest_hour_utc: 2,
ingest_minute_utc: 30,
},
setSettings: (s) =>
set((state) => ({ settings: { ...state.settings, ...s } })),
// Status
status: null,
setStatus: (status) => set({ status }),
// UI
settingsOpen: false,
setSettingsOpen: (settingsOpen) => set({ settingsOpen }),
sidebarOpen: false,
setSidebarOpen: (sidebarOpen) => set({ sidebarOpen }),
isLoading: false,
setIsLoading: (isLoading) => set({ isLoading }),
}),
{
name: 'aaronai-store',
partialize: (state) => ({
settings: state.settings,
currentId: state.currentId,
}),
}
)
);