diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index fd3d480014..fdb18daf0b 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -16,6 +16,12 @@ import { findMatchingResourceOrTemplate } from "@src/utils/mcp" import { vscode } from "@src/utils/vscode" import { removeLeadingNonAlphanumeric } from "@src/utils/removeLeadingNonAlphanumeric" import { getLanguageFromPath } from "@src/utils/getLanguageFromPath" +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@src/components/ui/dropdown-menu" import { ToolUseBlock, ToolUseBlockHeader } from "../common/ToolUseBlock" import UpdateTodoListToolBlock from "./UpdateTodoListToolBlock" @@ -1002,29 +1008,63 @@ export const ChatRowContent = ({ return ( <> -
-
- {icon} - {title} -
-
0 ? 1 : 0 }}> - ${Number(cost || 0)?.toFixed(4)} -
-
+ + +
e.preventDefault()}> +
+ {icon} + {title} +
+
+
0 ? 1 : 0, + }}> + ${Number(cost || 0)?.toFixed(4)} +
+
{ + e.stopPropagation() + vscode.postMessage({ type: "deleteMessage", value: message.ts }) + }} + title={t("chat:deleteMessageAndSubsequent")}> + +
+
+
+
+ + vscode.postMessage({ type: "deleteMessage", value: message.ts })} + className="flex items-center gap-2" + disabled={isApiRequestInProgress}> + + + {t( + "chat:deleteMessageAndSubsequent", + "Delete message and subsequent nodes", + )} + + + +
{(((cost === null || cost === undefined) && apiRequestFailedMessage) || apiReqStreamingFailedMessage) && ( -
- - {t("chat:text.rooSaid")} -
-
- - {message.images && message.images.length > 0 && ( -
- {message.images.map((image, index) => ( - - ))} + + +
e.preventDefault()}> +
+
+ + {t("chat:text.rooSaid")} +
+
{ + e.stopPropagation() + vscode.postMessage({ type: "deleteMessage", value: message.ts }) + }} + title={t("chat:deleteMessageAndSubsequent")}> + +
- )} -
-
+
+ + {message.images && message.images.length > 0 && ( +
+ {message.images.map((image, index) => ( + + ))} +
+ )} +
+
+ + + vscode.postMessage({ type: "deleteMessage", value: message.ts })} + className="flex items-center gap-2" + disabled={isStreaming}> + + + {t("chat:deleteMessageAndSubsequent", "Delete message and subsequent nodes")} + + + + ) case "user_feedback": return ( @@ -1162,15 +1229,42 @@ export const ChatRowContent = ({ return case "completion_result": return ( - <> -
- {icon} - {title} -
-
- -
- + + +
e.preventDefault()}> +
+
+ {icon} + {title} +
+
{ + e.stopPropagation() + vscode.postMessage({ type: "deleteMessage", value: message.ts }) + }} + title={t("chat:deleteMessageAndSubsequent")}> + +
+
+
+ +
+
+
+ + vscode.postMessage({ type: "deleteMessage", value: message.ts })} + className="flex items-center gap-2" + disabled={isStreaming}> + + + {t("chat:deleteMessageAndSubsequent", "Delete message and subsequent nodes")} + + + +
) case "shell_integration_warning": return