From b024f8faea3126d7763c34174040f1db20ca0c0b Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Thu, 24 Sep 2026 11:02:50 +0000 Subject: [PATCH] perf: let React Compiler compile ChatPane --- scripts/check_react_compiler_coverage.ts | 1 - src/browser/components/ChatPane/ChatPane.tsx | 34 +++++++++++--------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/scripts/check_react_compiler_coverage.ts b/scripts/check_react_compiler_coverage.ts index 5713630b9c3..07734dd544a 100644 --- a/scripts/check_react_compiler_coverage.ts +++ b/scripts/check_react_compiler_coverage.ts @@ -51,7 +51,6 @@ const HOT_COMPONENTS: Record = { * so fixing a component forces its removal here. */ const KNOWN_SKIPPED: ReadonlySet = new Set([ - "src/browser/components/ChatPane/ChatPane.tsx#ChatPaneContent", "src/browser/features/Messages/MessageRenderer.tsx#MessageRenderer", "src/browser/features/Messages/AssistantMessage.tsx#AssistantMessage", "src/browser/components/ProjectSidebar/ProjectSidebar.tsx#ProjectSidebarInner", diff --git a/src/browser/components/ChatPane/ChatPane.tsx b/src/browser/components/ChatPane/ChatPane.tsx index 74b5b342c44..1e2874a7c48 100644 --- a/src/browser/components/ChatPane/ChatPane.tsx +++ b/src/browser/components/ChatPane/ChatPane.tsx @@ -125,6 +125,7 @@ import { } from "@/browser/utils/messages/transcriptRenderProjection"; import { isBlockedPreStreamTaskStatus } from "@/browser/utils/ui/workspaceFiltering"; import { PerfRenderMarker } from "@/browser/utils/perf/PerfRenderMarker"; +import { runWithCatch } from "@/browser/utils/compilerSafeControlFlow"; import { CUSTOM_EVENTS, type CustomEventType, @@ -968,12 +969,12 @@ const ChatPaneContent: React.FC = (props) => { [api, workspaceId] ); - const handleEditQueuedMessage = useCallback(async () => { + const handleEditQueuedMessage = async () => { const queuedMessage = workspaceState?.queuedMessage; if (!queuedMessage) return; await restoreQueuedDraft(queuedMessage); - }, [restoreQueuedDraft, workspaceState?.queuedMessage]); + }; const sendQueuedImmediatelyInFlightRef = useRef(null); @@ -999,7 +1000,7 @@ const ChatPaneContent: React.FC = (props) => { }; // Handler for sending queued message immediately (interrupt + send) - const handleSendQueuedImmediately = useCallback(async () => { + const handleSendQueuedImmediately = async () => { const queuedMessage = workspaceState?.queuedMessage; if ( !api || @@ -1019,22 +1020,25 @@ const ChatPaneContent: React.FC = (props) => { sendQueuedImmediatelyInFlightRef.current = null; } }; - try { - // Set "interrupting" state immediately so UI shows "interrupting..." without flash. - storeRaw.setInterrupting(workspaceId); - const interruptResult = await api.workspace.interruptStream({ - workspaceId, - options: { sendQueuedImmediately: true }, - }); - if (!interruptResult.success) { + const interruptResult = await runWithCatch( + () => { + // Set "interrupting" state immediately so UI shows "interrupting..." without flash. + storeRaw.setInterrupting(workspaceId); + return api.workspace.interruptStream({ + workspaceId, + options: { sendQueuedImmediately: true }, + }); + }, + (error) => { clearInFlightGuardIfCurrent(); - throw new Error(interruptResult.error); + throw error; } - } catch (error) { + ); + if (!interruptResult.success) { clearInFlightGuardIfCurrent(); - throw error; + throw new Error(interruptResult.error); } - }, [api, workspaceId, workspaceState?.queuedMessage, workspaceState?.canInterrupt, storeRaw]); + }; const handleQueuedDispatchModeChange = async (queueDispatchMode: QueueDispatchMode) => { clearQueuedActionError();