80 lines
2.1 KiB
TypeScript
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,
|
|
}),
|
|
}
|
|
)
|
|
);
|