diff --git a/webview-ui/src/components/chat/ModeSelector.tsx b/webview-ui/src/components/chat/ModeSelector.tsx index e71469130c..81f2087acc 100644 --- a/webview-ui/src/components/chat/ModeSelector.tsx +++ b/webview-ui/src/components/chat/ModeSelector.tsx @@ -1,5 +1,5 @@ import React from "react" -import { ChevronUp, Check, X, Upload, Download } from "lucide-react" +import { ChevronUp, Check, X, Upload } from "lucide-react" import { cn } from "@/lib/utils" import { useRooPortal } from "@/components/ui/hooks/useRooPortal" import { Popover, PopoverContent, PopoverTrigger, StandardTooltip, Button } from "@/components/ui" @@ -50,6 +50,8 @@ export const ModeSelector = ({ const [isExporting, setIsExporting] = React.useState(null) const [isImporting, setIsImporting] = React.useState(false) const [showImportDialog, setShowImportDialog] = React.useState(false) + const [exportError, setExportError] = React.useState(null) + const [importError, setImportError] = React.useState(null) const trackModeSelectorOpened = React.useCallback(() => { // Track telemetry every time the mode selector is opened @@ -166,22 +168,31 @@ export const ModeSelector = ({ setIsExporting(null) if (!message.success) { console.error("Failed to export mode:", message.error) + setExportError(message.error || t("prompts:exportMode.error")) + // Clear error after 5 seconds + setTimeout(() => setExportError(null), 5000) + } else { + setExportError(null) } } else if (message.type === "importModeResult") { setIsImporting(false) - setShowImportDialog(false) if (!message.success && message.error !== "cancelled") { console.error("Failed to import mode:", message.error) + setImportError(message.error || t("prompts:importMode.error")) + } else { + setImportError(null) + setShowImportDialog(false) } } } window.addEventListener("message", handler) return () => window.removeEventListener("message", handler) - }, []) + }, [t]) // Handle export mode const handleExportMode = React.useCallback((modeSlug: string) => { setIsExporting(modeSlug) + setExportError(null) vscode.postMessage({ type: "exportMode", slug: modeSlug, @@ -193,6 +204,7 @@ export const ModeSelector = ({ const selectedLevel = (document.querySelector('input[name="importLevel"]:checked') as HTMLInputElement) ?.value as "global" | "project" setIsImporting(true) + setImportError(null) vscode.postMessage({ type: "importMode", source: selectedLevel || "project", @@ -309,6 +321,7 @@ export const ModeSelector = ({ handleExportMode(mode.slug) }} disabled={isExporting === mode.slug} + aria-label={t("prompts:exportMode.title")} title={t("prompts:exportMode.title")}> @@ -320,6 +333,13 @@ export const ModeSelector = ({ )} + {/* Export error message */} + {exportError && ( +
+ {exportError} +
+ )} + {/* Bottom bar with buttons on left and title on right */}
@@ -349,28 +369,14 @@ export const ModeSelector = ({ setOpen(false) }} /> - {/* Import button - matching IconButton dimensions */} - - - + {/* Import button - using IconButton for consistency */} + setShowImportDialog(true)} + disabled={isImporting} + isLoading={isImporting} + />
{/* Info icon and title on the right - only show info icon when search bar is visible */} @@ -398,11 +404,12 @@ export const ModeSelector = ({ {t("prompts:importMode.selectLevel")}

-
-