From ff8c188d3af703c1a23c8755b7e3e2dbda6156df Mon Sep 17 00:00:00 2001 From: Will Li Date: Wed, 9 Jul 2025 09:00:43 -0700 Subject: [PATCH 01/14] improved chat row first pass --- webview-ui/src/components/chat/ChatRow.tsx | 47 +++++++++++++++++----- webview-ui/src/i18n/locales/en/chat.json | 3 ++ 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/webview-ui/src/components/chat/ChatRow.tsx b/webview-ui/src/components/chat/ChatRow.tsx index 4fd7977fc2..d43db0c794 100644 --- a/webview-ui/src/components/chat/ChatRow.tsx +++ b/webview-ui/src/components/chat/ChatRow.tsx @@ -6,6 +6,7 @@ import deepEqual from "fast-deep-equal" import { VSCodeBadge, VSCodeButton } from "@vscode/webview-ui-toolkit/react" import type { ClineMessage } from "@roo-code/types" +import { Mode } from "@roo/modes" import { ClineApiReqInfo, ClineAskUseMcpServer, ClineSayTool } from "@roo/ExtensionMessage" import { COMMAND_OUTPUT_STRING } from "@roo/combineCommandSequences" @@ -20,6 +21,8 @@ import { removeLeadingNonAlphanumeric } from "@src/utils/removeLeadingNonAlphanu import { getLanguageFromPath } from "@src/utils/getLanguageFromPath" import { Button } from "@src/components/ui" +import ChatTextArea from "./ChatTextArea" + import { ToolUseBlock, ToolUseBlockHeader } from "../common/ToolUseBlock" import UpdateTodoListToolBlock from "./UpdateTodoListToolBlock" import CodeAccordian from "../common/CodeAccordian" @@ -109,12 +112,14 @@ export const ChatRowContent = ({ editable, }: ChatRowContentProps) => { const { t } = useTranslation() - const { mcpServers, alwaysAllowMcp, currentCheckpoint } = useExtensionState() + const { mcpServers, alwaysAllowMcp, currentCheckpoint, mode } = useExtensionState() const [reasoningCollapsed, setReasoningCollapsed] = useState(true) const [isDiffErrorExpanded, setIsDiffErrorExpanded] = useState(false) const [showCopySuccess, setShowCopySuccess] = useState(false) const [isEditing, setIsEditing] = useState(false) const [editedContent, setEditedContent] = useState("") + const [editMode, setEditMode] = useState(mode || "code") + const [editImages, setEditImages] = useState([]) const { copyWithFeedback } = useCopyToClipboard() // Memoized callback to prevent re-renders caused by inline arrow functions @@ -126,15 +131,19 @@ export const ChatRowContent = ({ const handleEditClick = useCallback(() => { setIsEditing(true) setEditedContent(message.text || "") + setEditImages(message.images || []) + setEditMode(mode || "code") // Edit mode is now handled entirely in the frontend // No need to notify the backend - }, [message.text]) + }, [message.text, message.images, mode]) // Handle cancel edit const handleCancelEdit = useCallback(() => { setIsEditing(false) setEditedContent(message.text || "") - }, [message.text]) + setEditImages(message.images || []) + setEditMode(mode || "code") + }, [message.text, message.images, mode]) // Handle save edit const handleSaveEdit = useCallback(() => { @@ -147,6 +156,16 @@ export const ChatRowContent = ({ }) }, [message.ts, editedContent]) + // Handle sending edited message (when Enter is pressed in ChatTextArea) + const handleSendEdit = useCallback(() => { + handleSaveEdit() + }, [handleSaveEdit]) + + // Handle image selection for editing + const handleSelectImages = useCallback(() => { + vscode.postMessage({ type: "selectImages" }) + }, []) + const [cost, apiReqCancelReason, apiReqStreamingFailedMessage] = useMemo(() => { if (message.text !== null && message.text !== undefined && message.say === "api_req_started") { const info = safeJsonParse(message.text) @@ -1032,12 +1051,20 @@ export const ChatRowContent = ({
{isEditing ? (
-