From f43b5ea73b6e898848dceff977027e2446aa387a Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Wed, 17 Jun 2026 16:25:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(chat):=20=E8=BF=90=E8=A1=8C=E6=9C=9F?= =?UTF-8?q?=E9=97=B4=E6=81=A2=E5=A4=8D=E6=97=A7=E6=BB=9A=E5=8A=A8=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E5=A0=86=E5=8F=A0=E5=9D=97=E6=9B=B4=E5=A4=9A?= =?UTF-8?q?=E6=8C=89=E9=92=AE=E4=B9=9F=E6=8E=A5=E5=85=A5=E9=94=9A=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/src/components/chat/ChatArea.vue | 44 +++++++++++++------- static/src/components/chat/StackedBlocks.vue | 14 +++++++ 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/static/src/components/chat/ChatArea.vue b/static/src/components/chat/ChatArea.vue index ecb4077..d17a50d 100644 --- a/static/src/components/chat/ChatArea.vue +++ b/static/src/components/chat/ChatArea.vue @@ -131,6 +131,7 @@ :format-search-topic="formatSearchTopic" :format-search-time="formatSearchTime" :format-search-domains="formatSearchDomains" + @more-toggle="handleStackedMoreToggle" />
()); watch( @@ -1102,6 +1097,10 @@ watch( prevExpandedBlocks.value = new Set(newSet); if (changed.size === 0) return; + + // 保守策略:运行期间保持旧逻辑,由 stick-to-bottom 固定向下展开并向上滚动 + if (props.streamingMessage) return; + const container = scrollRef.value; if (!container) return; @@ -1110,13 +1109,10 @@ watch( `[data-block-id="${escapeBlockSelector(id)}"]` ) as HTMLElement | null; if (el) { - const isExpanding = newSet.has(id); - const streaming = elementLooksStreaming(el); anchorBlockElement(el, id, { direction: 'auto', - duration: streaming ? 5000 : 260, - extendOnGrowth: streaming, - phase: isExpanding ? 'expand' : 'collapse' + duration: 260, + phase: newSet.has(id) ? 'expand' : 'collapse' }); } } @@ -1124,7 +1120,25 @@ watch( { flush: 'post' } ); +function handleStackedMoreToggle(payload: { + element: HTMLElement; + expanded: boolean; + stackKey: string; +}) { + // 保守策略:运行期间保持旧逻辑 + if (props.streamingMessage) return; + + anchorBlockElement(payload.element, `more-${payload.stackKey}`, { + direction: 'auto', + duration: 260, + phase: expanded ? 'expand' : 'collapse' + }); +} + function handleMinimalGroupToggle(payload: { groupId: string; expanded: boolean }) { + // 保守策略:运行期间保持旧逻辑 + if (props.streamingMessage) return; + const { groupId, expanded } = payload; const container = scrollRef.value; if (!container) return; @@ -1132,11 +1146,9 @@ function handleMinimalGroupToggle(payload: { groupId: string; expanded: boolean `[data-group-id="${escapeBlockSelector(groupId)}"]` ) as HTMLElement | null; if (el) { - const streaming = elementLooksStreaming(el); anchorBlockElement(el, groupId, { direction: 'auto', - duration: streaming ? 5000 : 300, - extendOnGrowth: streaming, + duration: 300, phase: expanded ? 'expand' : 'collapse' }); } diff --git a/static/src/components/chat/StackedBlocks.vue b/static/src/components/chat/StackedBlocks.vue index 37bb04e..84d1cd2 100644 --- a/static/src/components/chat/StackedBlocks.vue +++ b/static/src/components/chat/StackedBlocks.vue @@ -177,6 +177,16 @@ const props = defineProps<{ formatSearchDomains: (filters: Record) => string; }>(); +const emit = defineEmits<{ + ( + event: 'more-toggle', + payload: { element: HTMLElement; expanded: boolean; stackKey: string } + ): void; +}>(); + +let stackInstanceCounter = 0; +const stackKey = `stacked-${++stackInstanceCounter}`; + // 初始化 personalization store const personalizationStore = usePersonalizationStore(); @@ -253,6 +263,10 @@ const isToolCompleted = (action: any) => action?.tool?.status === 'completed'; const toggleMore = () => { showAll.value = !showAll.value; scheduleMeasure(); + const el = moreBlock.value; + if (el instanceof HTMLElement) { + emit('more-toggle', { element: el, expanded: showAll.value, stackKey }); + } }; const toggleBlock = (blockId: string) => {