Add API layer, Zustand store, markdown renderer, types
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
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,
|
||||
},
|
||||
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,
|
||||
}),
|
||||
}
|
||||
)
|
||||
);
|
||||
Reference in New Issue
Block a user