@@ -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