import { writable, derived } from "svelte/store"; import { type ChatMessage, type MessageSegment } from "../models/chat-data"; interface SimpleChatState { messages: ChatMessage[]; connected: boolean; processing: boolean; error: string | null; typingIndicator: boolean; } function createChatStore() { const initialState: SimpleChatState = { messages: [], connected: false, processing: false, error: null, typingIndicator: false, }; const { subscribe, update } = writable(initialState); return { subscribe, setConnected(connected: boolean) { update((state) => ({ ...state, connected })); }, setProcessing(processing: boolean) { update((state) => ({ ...state, processing })); }, setError(error: string | null) { update((state) => ({ ...state, error })); }, addMessage(message: ChatMessage) { update((state) => ({ ...state, messages: [...state.messages, message], })); }, appendToLastMessage(content: string) { update((state) => { if (state.messages.length === 0) return state; const messages = [...state.messages]; const lastMessage = messages[messages.length - 1]; messages[messages.length - 1] = { ...lastMessage, content: lastMessage.content + content, }; return { ...state, messages }; }); }, setLastMessageContent(content: string) { update((state) => { if (state.messages.length === 0) return state; const messages = [...state.messages]; const lastMessage = messages[messages.length - 1]; messages[messages.length - 1] = { ...lastMessage, content, }; return { ...state, messages }; }); }, setLastMessageSegments(segments: MessageSegment[]) { update((state) => { if (state.messages.length === 0) return state; const messages = [...state.messages]; const lastMessage = messages[messages.length - 1]; messages[messages.length - 1] = { ...lastMessage, segments, }; return { ...state, messages }; }); }, clearMessages() { update((state) => ({ ...state, messages: [], error: null, })); }, setTypingIndicator(typingIndicator: boolean) { update((state) => ({ ...state, typingIndicator })); }, }; } export const chatStore = createChatStore(); export const isProcessing = derived(chatStore, ($chat) => $chat.processing); export const isConnected = derived(chatStore, ($chat) => $chat.connected); export const messages = derived(chatStore, ($chat) => $chat.messages); export const error = derived(chatStore, ($chat) => $chat.error); export const typingIndicator = derived( chatStore, ($chat) => $chat.typingIndicator, );