Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion webview-ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
"i18next": "^24.2.2",
"i18next-http-backend": "^3.0.2",
"knuth-shuffle-seeded": "^1.0.6",
"lru-cache": "^11.1.0",
"lucide-react": "^0.510.0",
"mermaid": "^11.4.1",
"posthog-js": "^1.227.2",
Expand All @@ -70,8 +71,8 @@
"tailwindcss": "^4.0.0",
"tailwindcss-animate": "^1.0.7",
"unist-util-visit": "^5.0.0",
"vscode-material-icons": "^0.1.1",
"use-sound": "^5.0.0",
"vscode-material-icons": "^0.1.1",
"vscrui": "^0.2.2",
"zod": "^3.24.2"
},
Expand Down
37 changes: 21 additions & 16 deletions webview-ui/src/components/chat/ChatRow.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { memo, useEffect, useMemo, useRef, useState } from "react"
import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from "react"
import { useSize } from "react-use"
import { useTranslation, Trans } from "react-i18next"
import deepEqual from "fast-deep-equal"
Expand Down Expand Up @@ -44,7 +44,7 @@ interface ChatRowProps {
isExpanded: boolean
isLast: boolean
isStreaming: boolean
onToggleExpand: () => void
onToggleExpand: (ts: number) => void
onHeightChange: (isTaller: boolean) => void
onSuggestionClick?: (answer: string, event?: React.MouseEvent) => void
}
Expand Down Expand Up @@ -103,6 +103,11 @@ export const ChatRowContent = ({
const [showCopySuccess, setShowCopySuccess] = useState(false)
const { copyWithFeedback } = useCopyToClipboard()

// Memoized callback to prevent re-renders caused by inline arrow functions
const handleToggleExpand = useCallback(() => {
onToggleExpand(message.ts)
}, [onToggleExpand, message.ts])

const [cost, apiReqCancelReason, apiReqStreamingFailedMessage] = useMemo(() => {
if (message.text !== null && message.text !== undefined && message.say === "api_req_started") {
const info = safeJsonParse<ClineApiReqInfo>(message.text)
Expand Down Expand Up @@ -302,7 +307,7 @@ export const ChatRowContent = ({
progressStatus={message.progressStatus}
isLoading={message.partial}
isExpanded={isExpanded}
onToggleExpand={onToggleExpand}
onToggleExpand={handleToggleExpand}
/>
</>
)
Expand All @@ -328,7 +333,7 @@ export const ChatRowContent = ({
progressStatus={message.progressStatus}
isLoading={message.partial}
isExpanded={isExpanded}
onToggleExpand={onToggleExpand}
onToggleExpand={handleToggleExpand}
/>
</>
)
Expand All @@ -350,7 +355,7 @@ export const ChatRowContent = ({
progressStatus={message.progressStatus}
isLoading={message.partial}
isExpanded={isExpanded}
onToggleExpand={onToggleExpand}
onToggleExpand={handleToggleExpand}
/>
</>
)
Expand Down Expand Up @@ -389,7 +394,7 @@ export const ChatRowContent = ({
language={getLanguageFromPath(tool.path || "") || "log"}
isLoading={message.partial}
isExpanded={isExpanded}
onToggleExpand={onToggleExpand}
onToggleExpand={handleToggleExpand}
/>
</>
)
Expand Down Expand Up @@ -435,7 +440,7 @@ export const ChatRowContent = ({
language="markdown"
isLoading={message.partial}
isExpanded={isExpanded}
onToggleExpand={onToggleExpand}
onToggleExpand={handleToggleExpand}
/>
</>
)
Expand All @@ -455,7 +460,7 @@ export const ChatRowContent = ({
code={tool.content}
language="shell-session"
isExpanded={isExpanded}
onToggleExpand={onToggleExpand}
onToggleExpand={handleToggleExpand}
/>
</>
)
Expand All @@ -475,7 +480,7 @@ export const ChatRowContent = ({
code={tool.content}
language="shellsession"
isExpanded={isExpanded}
onToggleExpand={onToggleExpand}
onToggleExpand={handleToggleExpand}
/>
</>
)
Expand All @@ -495,7 +500,7 @@ export const ChatRowContent = ({
code={tool.content}
language="markdown"
isExpanded={isExpanded}
onToggleExpand={onToggleExpand}
onToggleExpand={handleToggleExpand}
/>
</>
)
Expand Down Expand Up @@ -525,7 +530,7 @@ export const ChatRowContent = ({
code={tool.content}
language="shellsession"
isExpanded={isExpanded}
onToggleExpand={onToggleExpand}
onToggleExpand={handleToggleExpand}
/>
</>
)
Expand Down Expand Up @@ -813,7 +818,7 @@ export const ChatRowContent = ({
MozUserSelect: "none",
msUserSelect: "none",
}}
onClick={onToggleExpand}>
onClick={handleToggleExpand}>
<div style={{ display: "flex", alignItems: "center", gap: "10px", flexGrow: 1 }}>
{icon}
{title}
Expand Down Expand Up @@ -852,7 +857,7 @@ export const ChatRowContent = ({
code={safeJsonParse<any>(message.text)?.request}
language="markdown"
isExpanded={true}
onToggleExpand={onToggleExpand}
onToggleExpand={handleToggleExpand}
/>
</div>
)}
Expand Down Expand Up @@ -898,7 +903,7 @@ export const ChatRowContent = ({
language="diff"
isFeedback={true}
isExpanded={isExpanded}
onToggleExpand={onToggleExpand}
onToggleExpand={handleToggleExpand}
/>
</div>
)
Expand Down Expand Up @@ -945,7 +950,7 @@ export const ChatRowContent = ({
code={message.text}
language="json"
isExpanded={true}
onToggleExpand={onToggleExpand}
onToggleExpand={handleToggleExpand}
/>
</div>
</>
Expand Down Expand Up @@ -1105,7 +1110,7 @@ export const ChatRowContent = ({
code={useMcpServer.arguments}
language="json"
isExpanded={true}
onToggleExpand={onToggleExpand}
onToggleExpand={handleToggleExpand}
/>
</div>
)}
Expand Down
Loading