From 263588af6ae6f8d91e93598b8b7780a0dd27cb5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Sat, 19 Sep 2026 23:16:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=8A=E8=BF=90=E8=A1=8C=E4=B8=AD=E5=9B=9E?= =?UTF-8?q?=E5=90=88=E7=9A=84=E7=A7=92=E7=BA=A7=E8=AE=A1=E6=97=B6=E4=B8=8B?= =?UTF-8?q?=E7=A7=BB=E5=88=B0=E8=80=97=E6=97=B6=E6=96=87=E6=A1=88=E7=BB=84?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - apps/ai-game-creator-shell/src/view/project-development/chat/components/DirectProjectConversation/DirectProjectConversation.tsx 新增 DirectTurnElapsed,自己持有 1 秒 tick 与已耗时渲染 - apps/ai-game-creator-shell/src/view/project-development/chat/DirectProjectChatView.tsx 删除 turnUsageNow state 与其 interval,不再把每秒 tick 传给会话区 - 原先每秒 tick 触发的是整个聊天视图重渲染(含 Markdown 回合列表、工具调用组与队列芯片),现在只重渲染耗时那一小块 --- .../chat/DirectProjectChatView.tsx | 9 ---- .../DirectProjectConversation.tsx | 41 +++++++++++++------ 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/apps/ai-game-creator-shell/src/view/project-development/chat/DirectProjectChatView.tsx b/apps/ai-game-creator-shell/src/view/project-development/chat/DirectProjectChatView.tsx index d8720c944..bd51ea53a 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/chat/DirectProjectChatView.tsx +++ b/apps/ai-game-creator-shell/src/view/project-development/chat/DirectProjectChatView.tsx @@ -100,7 +100,6 @@ export function DirectProjectChatView({ const shouldFollowLatestRef = useRef(true); const [runtimeNotice, setRuntimeNotice] = useState(''); const [settingsOpen, setSettingsOpen] = useState(false); - const [turnUsageNow, setTurnUsageNow] = useState(() => Date.now()); const [approvalOpen, setApprovalOpen] = useState(false); const [approvalMode, setApprovalMode] = useState('strict'); const [approvalNotice, setApprovalNotice] = useState(''); @@ -183,13 +182,6 @@ export function DirectProjectChatView({ if (list) list.scrollTop = list.scrollHeight; }, [directEntries, localMessages]); - useEffect(() => { - if (!directTurnRunning) return; - setTurnUsageNow(Date.now()); - const timer = setInterval(() => setTurnUsageNow(Date.now()), 1000); - return () => clearInterval(timer); - }, [directTurnRunning]); - const directTurns = buildDirectChatTurns({ entries: directEntries, localMessages, @@ -231,7 +223,6 @@ export function DirectProjectChatView({ historyHasMore={historyHasMore} running={directTurnRunning} activeTurnStartedAt={activeTurnStartedAt} - turnUsageNow={turnUsageNow} onLoadEarlierHistory={() => void loadEarlierHistory()} onScroll={handleScroll} /> diff --git a/apps/ai-game-creator-shell/src/view/project-development/chat/components/DirectProjectConversation/DirectProjectConversation.tsx b/apps/ai-game-creator-shell/src/view/project-development/chat/components/DirectProjectConversation/DirectProjectConversation.tsx index 8a063a383..b982c84ae 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/chat/components/DirectProjectConversation/DirectProjectConversation.tsx +++ b/apps/ai-game-creator-shell/src/view/project-development/chat/components/DirectProjectConversation/DirectProjectConversation.tsx @@ -1,4 +1,9 @@ -import type { RefObject, UIEventHandler } from 'react'; +import { + type RefObject, + type UIEventHandler, + useEffect, + useState, +} from 'react'; import { AgentMessageContent } from '../../../../../../../../packages/shared/src/components/AgentMessageContent'; import type { DirectChatTurn } from '../../conversation/directTurnPresentation'; @@ -16,7 +21,6 @@ export function DirectProjectConversation({ historyHasMore, running, activeTurnStartedAt, - turnUsageNow, onLoadEarlierHistory, onScroll, }: { @@ -25,7 +29,6 @@ export function DirectProjectConversation({ historyHasMore: boolean; running: boolean; activeTurnStartedAt: number; - turnUsageNow: number; onLoadEarlierHistory: () => void; onScroll: UIEventHandler; }) { @@ -64,18 +67,32 @@ export function DirectProjectConversation({
) : null} ); } + +/** + * 运行中回合的已耗时。 + * + * 计时器只属于这一小块:秒级 tick 不该把整份回合列表(Markdown、工具组、队列芯片) + * 一起重渲染。 + */ +function DirectTurnElapsed({ startedAt }: { startedAt: number }) { + const [now, setNow] = useState(() => Date.now()); + useEffect(() => { + if (startedAt <= 0) return undefined; + setNow(Date.now()); + const timer = setInterval(() => setNow(Date.now()), 1000); + return () => clearInterval(timer); + }, [startedAt]); + if (startedAt <= 0) return null; + return ( + + {`已耗时 ${formatTurnDuration(Math.max(0, now - startedAt)) ?? '0秒'}`} + + ); +}