Skip to content

Commit a9a0975

Browse files
committed
fix: optimize ChatView to prevent excessive re-rendering when typing
- Properly memoized itemContent callback with stable dependencies - Added memoization for lastModifiedMessage to prevent unnecessary recalculations - Removed debug logging after confirming the fix works This fixes the UI jittering issue that occurred when typing in the chat input by preventing the groupedMessages and itemContent from being recalculated on every keystroke.
1 parent a79c3d0 commit a9a0975

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

webview-ui/src/components/chat/ChatRow.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ interface ChatRowContentProps extends Omit<ChatRowProps, "onHeightChange"> {}
6868
const ChatRow = memo(
6969
(props: ChatRowProps) => {
7070
const { isLast, onHeightChange, message } = props
71+
7172
// Store the previous height to compare with the current height
7273
// This allows us to detect changes without causing re-renders
7374
const prevHeightRef = useRef(0)

webview-ui/src/components/chat/ChatView.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,9 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
160160
return getLatestTodo(messages)
161161
}, [messages, currentTaskTodos])
162162

163-
const modifiedMessages = useMemo(() => combineApiRequests(combineCommandSequences(messages.slice(1))), [messages])
163+
const modifiedMessages = useMemo(() => {
164+
return combineApiRequests(combineCommandSequences(messages.slice(1)))
165+
}, [messages])
164166

165167
// Has to be after api_req_finished are all reduced into api_req_started messages.
166168
const apiMetrics = useMemo(() => getApiMetrics(modifiedMessages), [modifiedMessages])
@@ -1521,6 +1523,10 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
15211523
userRespondedRef.current = true
15221524
}, [])
15231525

1526+
// Memoize the last modified message to prevent unnecessary re-renders
1527+
const lastModifiedMessage = useMemo(() => modifiedMessages.at(-1), [modifiedMessages])
1528+
1529+
// Properly memoized itemContent callback with stable dependencies
15241530
const itemContent = useCallback(
15251531
(index: number, messageOrGroup: ClineMessage | ClineMessage[]) => {
15261532
// browser session group
@@ -1529,7 +1535,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
15291535
<BrowserSessionRow
15301536
messages={messageOrGroup}
15311537
isLast={index === groupedMessages.length - 1}
1532-
lastModifiedMessage={modifiedMessages.at(-1)}
1538+
lastModifiedMessage={lastModifiedMessage}
15331539
onHeightChange={handleRowHeightChange}
15341540
isStreaming={isStreaming}
15351541
isExpanded={(messageTs: number) => expandedRows[messageTs] ?? false}
@@ -1549,12 +1555,12 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
15491555
key={messageOrGroup.ts}
15501556
message={messageOrGroup}
15511557
isExpanded={expandedRows[messageOrGroup.ts] || false}
1552-
onToggleExpand={toggleRowExpansion} // This was already stabilized
1553-
lastModifiedMessage={modifiedMessages.at(-1)} // Original direct access
1554-
isLast={index === groupedMessages.length - 1} // Original direct access
1558+
onToggleExpand={toggleRowExpansion}
1559+
lastModifiedMessage={lastModifiedMessage}
1560+
isLast={index === groupedMessages.length - 1}
15551561
onHeightChange={handleRowHeightChange}
15561562
isStreaming={isStreaming}
1557-
onSuggestionClick={handleSuggestionClickInRow} // This was already stabilized
1563+
onSuggestionClick={handleSuggestionClickInRow}
15581564
onBatchFileResponse={handleBatchFileResponse}
15591565
onFollowUpUnmount={handleFollowUpUnmount}
15601566
isFollowUpAnswered={messageOrGroup.ts === currentFollowUpTs}
@@ -1582,7 +1588,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction<ChatViewRef, ChatViewPro
15821588
[
15831589
expandedRows,
15841590
toggleRowExpansion,
1585-
modifiedMessages,
1591+
lastModifiedMessage, // Use the memoized value instead of recalculating
15861592
groupedMessages.length,
15871593
handleRowHeightChange,
15881594
isStreaming,

0 commit comments

Comments
 (0)