From a6f5dc6910dbff22663fea49a9a54abbfbde8648 Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Wed, 12 Aug 2026 10:00:19 +0200 Subject: [PATCH] refactor: Contexts & types --- tools/ui/src/app.d.ts | 2 +- .../ChatFormActionAddDropdown.svelte | 60 ++++------ .../ChatFormActionAddSheet.svelte | 51 +++----- .../ChatFormActionsAdd.svelte | 55 +-------- .../ChatFormActions/ChatFormActions.svelte | 51 ++++++-- .../ChatMessage/ChatMessage.svelte | 19 ++- .../ChatMessageAssistant.svelte | 4 +- .../ChatMessageMcpPrompt.svelte | 4 +- .../ChatMessageSystem.svelte | 4 +- .../ChatMessageToolCallBlock.svelte | 3 +- .../ChatMessageToolCallBlockDefault.svelte | 3 +- ...essageToolCallBlockExecShellCommand.svelte | 3 +- .../ChatMessageUser/ChatMessageUser.svelte | 4 +- .../ChatMessageUserPending.svelte | 4 +- .../ChatMessageActionIcons.svelte | 4 +- .../ChatMessageAgenticContent.svelte | 2 +- .../ChatMessages/ChatMessageEditForm.svelte | 4 +- .../ChatMessageReasoningBlock.svelte | 3 +- .../app/chat/ChatMessages/ChatMessages.svelte | 7 +- .../lib/constants/context-keys.constants.ts | 4 +- .../src/lib/contexts/chat-actions.context.ts | 39 ------ .../lib/contexts/chat-form-actions.context.ts | 19 +++ .../contexts/chat-message-actions.context.ts | 20 +--- .../lib/contexts/chat-message-edit.context.ts | 19 +++ tools/ui/src/lib/contexts/index.ts | 20 +--- .../src/lib/contexts/message-edit.context.ts | 51 -------- ...> use-chat-message-edit-context.svelte.ts} | 8 +- tools/ui/src/lib/types/chat.d.ts | 111 +++++++++++++++++- tools/ui/src/lib/types/index.ts | 8 ++ .../tests/stories/ChatMessage.stories.svelte | 15 ++- 30 files changed, 294 insertions(+), 307 deletions(-) delete mode 100644 tools/ui/src/lib/contexts/chat-actions.context.ts create mode 100644 tools/ui/src/lib/contexts/chat-form-actions.context.ts create mode 100644 tools/ui/src/lib/contexts/chat-message-edit.context.ts delete mode 100644 tools/ui/src/lib/contexts/message-edit.context.ts rename tools/ui/src/lib/hooks/{use-message-edit-context.svelte.ts => use-chat-message-edit-context.svelte.ts} (91%) diff --git a/tools/ui/src/app.d.ts b/tools/ui/src/app.d.ts index 6f26214e1c..5309dce8f4 100644 --- a/tools/ui/src/app.d.ts +++ b/tools/ui/src/app.d.ts @@ -32,8 +32,8 @@ import type { ApiRouterModelsStatusResponse, ApiRouterModelsUnloadRequest, ApiRouterModelsUnloadResponse, - // Chat types ChatAttachmentDisplayItem, + // Chat types ChatMessagePromptProgress, ChatMessageSiblingInfo, ChatMessageTimings, diff --git a/tools/ui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionAdd/ChatFormActionAddDropdown.svelte b/tools/ui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionAdd/ChatFormActionAddDropdown.svelte index 99aaee7845..02bfadb7e4 100644 --- a/tools/ui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionAdd/ChatFormActionAddDropdown.svelte +++ b/tools/ui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionAdd/ChatFormActionAddDropdown.svelte @@ -15,37 +15,16 @@ ICON_CLASS_DEFAULT, TOOLTIP_DELAY_DURATION } from '$lib/constants'; + import { getChatFormActionsContext } from '$lib/contexts'; import { useAttachmentMenu } from '$lib/hooks/use-attachment-menu.svelte'; interface Props { class?: string; - disabled?: boolean; - hasAudioModality?: boolean; - hasVideoModality?: boolean; - hasVisionModality?: boolean; - hasMcpPromptsSupport?: boolean; - hasMcpResourcesSupport?: boolean; - onFileUpload?: () => void; - onSystemPromptClick?: () => void; - onMcpPromptClick?: () => void; - onMcpSettingsClick?: () => void; - onMcpResourcesClick?: () => void; } - let { - class: className = '', - disabled = false, - hasAudioModality = false, - hasMcpPromptsSupport = false, - hasMcpResourcesSupport = false, - hasVideoModality = false, - hasVisionModality = false, - onFileUpload, - onMcpPromptClick, - onMcpResourcesClick, - onMcpSettingsClick, - onSystemPromptClick - }: Props = $props(); + let { class: className = '' }: Props = $props(); + + const chatFormActions = getChatFormActionsContext(); let dropdownOpen = $state(false); // The system message action moves focus to the message editor, so the menu @@ -54,18 +33,23 @@ function handleMcpSettingsClick() { dropdownOpen = false; - onMcpSettingsClick?.(); + chatFormActions.onMcpSettingsClick?.(); } const attachmentMenu = useAttachmentMenu( () => ({ - hasAudioModality, - hasMcpPromptsSupport, - hasMcpResourcesSupport, - hasVideoModality, - hasVisionModality + hasAudioModality: chatFormActions.hasAudioModality, + hasMcpPromptsSupport: chatFormActions.hasMcpPromptsSupport, + hasMcpResourcesSupport: chatFormActions.hasMcpResourcesSupport, + hasVideoModality: chatFormActions.hasVideoModality, + hasVisionModality: chatFormActions.hasVisionModality + }), + () => ({ + onFileUpload: chatFormActions.onFileUpload, + onMcpPromptClick: chatFormActions.onMcpPromptClick, + onMcpResourcesClick: chatFormActions.onMcpResourcesClick, + onSystemPromptClick: chatFormActions.onSystemPromptClick }), - () => ({ onFileUpload, onMcpPromptClick, onMcpResourcesClick, onSystemPromptClick }), () => { dropdownOpen = false; } @@ -85,7 +69,7 @@ buttonVariants({ variant: 'secondary' }), 'file-upload-button h-8 w-8 cursor-pointer rounded-full p-0' )} - {disabled} + disabled={chatFormActions.disabled} > {ATTACHMENT_TOOLTIP_TEXT} @@ -162,7 +146,7 @@ class="flex cursor-pointer items-center gap-2" onclick={() => { suppressCloseAutoFocus = true; - onSystemPromptClick?.(); + chatFormActions.onSystemPromptClick?.(); }} > @@ -174,12 +158,12 @@ - {#if hasMcpPromptsSupport} + {#if chatFormActions.hasMcpPromptsSupport} @@ -187,10 +171,10 @@ {/if} - {#if hasMcpResourcesSupport} + {#if chatFormActions.hasMcpResourcesSupport} diff --git a/tools/ui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionAdd/ChatFormActionAddSheet.svelte b/tools/ui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionAdd/ChatFormActionAddSheet.svelte index aa5397ca0b..63a8c267d8 100644 --- a/tools/ui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionAdd/ChatFormActionAddSheet.svelte +++ b/tools/ui/src/lib/components/app/chat/ChatForm/ChatFormActions/ChatFormActionAdd/ChatFormActionAddSheet.svelte @@ -19,6 +19,7 @@ ICON_CLASS_DEFAULT, TOOLTIP_DELAY_DURATION } from '$lib/constants'; + import { getChatFormActionsContext } from '$lib/contexts'; import { HealthCheckStatus } from '$lib/enums'; import { AttachmentAction } from '$lib/enums/attachment.enums'; import { useAttachmentMenu } from '$lib/hooks/use-attachment-menu.svelte'; @@ -29,33 +30,12 @@ interface Props { class?: string; - disabled?: boolean; - hasAudioModality?: boolean; - hasVideoModality?: boolean; - hasVisionModality?: boolean; - hasMcpPromptsSupport?: boolean; - hasMcpResourcesSupport?: boolean; - onFileUpload?: () => void; - onSystemPromptClick?: () => void; - onMcpPromptClick?: () => void; - onMcpResourcesClick?: () => void; trigger: Snippet<[{ disabled: boolean; onclick?: () => void }]>; } - let { - class: className = '', - disabled = false, - hasAudioModality = false, - hasMcpPromptsSupport = false, - hasMcpResourcesSupport = false, - hasVideoModality = false, - hasVisionModality = false, - onFileUpload, - onMcpPromptClick, - onMcpResourcesClick, - onSystemPromptClick, - trigger - }: Props = $props(); + let { class: className = '', trigger }: Props = $props(); + + const chatFormActions = getChatFormActionsContext(); let sheetOpen = $state(false); let reasoningExpanded = $state(false); @@ -65,13 +45,18 @@ const attachmentMenu = useAttachmentMenu( () => ({ - hasAudioModality, - hasMcpPromptsSupport, - hasMcpResourcesSupport, - hasVideoModality, - hasVisionModality + hasAudioModality: chatFormActions.hasAudioModality, + hasMcpPromptsSupport: chatFormActions.hasMcpPromptsSupport, + hasMcpResourcesSupport: chatFormActions.hasMcpResourcesSupport, + hasVideoModality: chatFormActions.hasVideoModality, + hasVisionModality: chatFormActions.hasVisionModality + }), + () => ({ + onFileUpload: chatFormActions.onFileUpload, + onMcpPromptClick: chatFormActions.onMcpPromptClick, + onMcpResourcesClick: chatFormActions.onMcpResourcesClick, + onSystemPromptClick: chatFormActions.onSystemPromptClick }), - () => ({ onFileUpload, onMcpPromptClick, onMcpResourcesClick, onSystemPromptClick }), () => { sheetOpen = false; } @@ -91,7 +76,7 @@
- {@render trigger({ disabled, onclick: () => (sheetOpen = true) })} + {@render trigger({ disabled: chatFormActions.disabled, onclick: () => (sheetOpen = true) })} @@ -350,7 +335,7 @@ System Message - {#if hasMcpPromptsSupport} + {#if chatFormActions.hasMcpPromptsSupport}