From 6a3d6e79d24798d9f65270094ec103cba153b09c Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Thu, 27 Nov 2025 13:44:49 +0100 Subject: [PATCH] refactor: Services/Stores syntax + logic improvements Refactors components to access stores directly instead of using exported getter functions. This change centralizes store access and logic, simplifying component code and improving maintainability by reducing the number of exported functions and promoting direct store interaction. Removes exported getter functions from `chat.svelte.ts`, `conversations.svelte.ts`, `models.svelte.ts` and `settings.svelte.ts`. --- .../app/chat/ChatForm/ChatForm.svelte | 25 +++---- .../ChatFormActions/ChatFormActions.svelte | 28 +++---- .../app/chat/ChatMessages/ChatMessage.svelte | 4 +- .../ChatMessages/ChatMessageAssistant.svelte | 4 +- .../app/chat/ChatMessages/ChatMessages.svelte | 25 +++---- .../app/chat/ChatScreen/ChatScreen.svelte | 47 +++++------- .../ChatScreenProcessingInfo.svelte | 14 +--- .../app/chat/ChatSettings/ChatSettings.svelte | 4 +- .../ChatSettings/ChatSettingsFields.svelte | 8 +- .../ChatSettings/ChatSettingsFooter.svelte | 4 +- .../app/chat/ChatSidebar/ChatSidebar.svelte | 10 +-- .../ChatSidebarConversationItem.svelte | 4 +- .../components/app/misc/SelectorModel.svelte | 15 ++-- .../app/server/ServerErrorSplash.svelte | 4 +- .../lib/hooks/use-processing-state.svelte.ts | 4 +- tools/server/webui/src/lib/services/chat.ts | 40 +++++----- .../server/webui/src/lib/services/database.ts | 6 +- tools/server/webui/src/lib/services/index.ts | 5 +- tools/server/webui/src/lib/services/models.ts | 2 +- tools/server/webui/src/lib/services/props.ts | 2 +- .../webui/src/lib/stores/chat.svelte.ts | 67 +++-------------- .../src/lib/stores/conversations.svelte.ts | 34 ++------- .../webui/src/lib/stores/models.svelte.ts | 75 ++++--------------- .../webui/src/lib/stores/server.svelte.ts | 36 +-------- .../webui/src/lib/stores/settings.svelte.ts | 24 +----- tools/server/webui/src/routes/+layout.svelte | 23 +++--- tools/server/webui/src/routes/+page.svelte | 30 +++----- .../webui/src/routes/chat/[id]/+page.svelte | 35 +++------ .../src/stories/ChatMessage.stories.svelte | 24 +++--- 29 files changed, 188 insertions(+), 415 deletions(-) diff --git a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte index 44a37ced0e..c6f99fd427 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatForm.svelte @@ -9,16 +9,9 @@ } from '$lib/components/app'; import { INPUT_CLASSES } from '$lib/constants/input-classes'; import { config } from '$lib/stores/settings.svelte'; - import { - modelOptions, - selectedModelId, - isRouterMode, - fetchModelProps, - getModelProps, - modelSupportsVision, - modelSupportsAudio - } from '$lib/stores/models.svelte'; - import { getConversationModel } from '$lib/stores/chat.svelte'; + import { modelsStore, modelOptions, selectedModelId } from '$lib/stores/models.svelte'; + import { isRouterMode } from '$lib/stores/server.svelte'; + import { chatStore } from '$lib/stores/chat.svelte'; import { activeMessages } from '$lib/stores/conversations.svelte'; import { FileTypeCategory, @@ -77,7 +70,9 @@ let textareaRef: ChatFormTextarea | undefined = $state(undefined); // Check if model is selected (in ROUTER mode) - let conversationModel = $derived(getConversationModel(activeMessages() as DatabaseMessage[])); + let conversationModel = $derived( + chatStore.getConversationModel(activeMessages() as DatabaseMessage[]) + ); let isRouter = $derived(isRouterMode()); let hasModelSelected = $derived(!isRouter || !!conversationModel || !!selectedModelId()); @@ -109,9 +104,9 @@ // Fetch model props when active model changes $effect(() => { if (isRouter && activeModelId) { - const cached = getModelProps(activeModelId); + const cached = modelsStore.getModelProps(activeModelId); if (!cached) { - fetchModelProps(activeModelId).then(() => { + modelsStore.fetchModelProps(activeModelId).then(() => { modelPropsVersion++; }); } @@ -122,7 +117,7 @@ let hasAudioModality = $derived.by(() => { if (activeModelId) { void modelPropsVersion; // Trigger reactivity on props fetch - return modelSupportsAudio(activeModelId); + return modelsStore.modelSupportsAudio(activeModelId); } return false; }); @@ -130,7 +125,7 @@ let hasVisionModality = $derived.by(() => { if (activeModelId) { void modelPropsVersion; // Trigger reactivity on props fetch - return modelSupportsVision(activeModelId); + return modelsStore.modelSupportsVision(activeModelId); } return false; }); diff --git a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte index 4dae0166b5..679d1eef39 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActions.svelte @@ -10,17 +10,9 @@ import { FileTypeCategory } from '$lib/enums'; import { getFileTypeCategory } from '$lib/utils/file-type'; import { config } from '$lib/stores/settings.svelte'; - import { - modelOptions, - selectedModelId, - selectModelByName, - isRouterMode, - fetchModelProps, - getModelProps, - modelSupportsVision, - modelSupportsAudio - } from '$lib/stores/models.svelte'; - import { getConversationModel } from '$lib/stores/chat.svelte'; + import { modelsStore, modelOptions, selectedModelId } from '$lib/stores/models.svelte'; + import { isRouterMode } from '$lib/stores/server.svelte'; + import { chatStore } from '$lib/stores/chat.svelte'; import { activeMessages } from '$lib/stores/conversations.svelte'; import type { ChatUploadedFile } from '$lib/types/chat'; @@ -53,14 +45,16 @@ let currentConfig = $derived(config()); let isRouter = $derived(isRouterMode()); - let conversationModel = $derived(getConversationModel(activeMessages() as DatabaseMessage[])); + let conversationModel = $derived( + chatStore.getConversationModel(activeMessages() as DatabaseMessage[]) + ); let previousConversationModel: string | null = null; $effect(() => { if (conversationModel && conversationModel !== previousConversationModel) { previousConversationModel = conversationModel; - selectModelByName(conversationModel); + modelsStore.selectModelByName(conversationModel); } }); @@ -92,10 +86,10 @@ $effect(() => { if (isRouter && activeModelId) { // Check if we already have cached props - const cached = getModelProps(activeModelId); + const cached = modelsStore.getModelProps(activeModelId); if (!cached) { // Fetch props for this model - fetchModelProps(activeModelId).then(() => { + modelsStore.fetchModelProps(activeModelId).then(() => { // Trigger reactivity update modelPropsVersion++; }); @@ -107,7 +101,7 @@ let hasAudioModality = $derived.by(() => { if (activeModelId) { void modelPropsVersion; // Trigger reactivity on props fetch - return modelSupportsAudio(activeModelId); + return modelsStore.modelSupportsAudio(activeModelId); } return false; }); @@ -115,7 +109,7 @@ let hasVisionModality = $derived.by(() => { if (activeModelId) { void modelPropsVersion; // Trigger reactivity on props fetch - return modelSupportsVision(activeModelId); + return modelsStore.modelSupportsVision(activeModelId); } return false; }); diff --git a/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte b/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte index 5656e08334..8968174d0f 100644 --- a/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte +++ b/tools/server/webui/src/lib/components/app/chat/ChatMessages/ChatMessage.svelte @@ -1,5 +1,5 @@ @@ -82,7 +82,7 @@