History

Add copy-to-clipboard action for proposed plan card (#1620)

Julius Marminge committed 7 months ago

Commit 60f7ae81 parent 867cf4c1 file · +17 −0Browse files

Unified · Split

apps/web/src/components/chat/ProposedPlanCard.tsx+17−0
@@ -25,6 +25,7 @@ import { · 24 unmodified lines
2525 } from "../ui/dialog";
2626 import { toastManager } from "../ui/toast";
2727 import { readNativeApi } from "~/nativeApi";
28+import { useCopyToClipboard } from "~/hooks/useCopyToClipboard";
2829
2930 export const ProposedPlanCard = memo(function ProposedPlanCard({
3031 planMarkdown,
@@ -39,6 +40,15 @@ export const ProposedPlanCard = memo(function ProposedPlanCard({ · 8 unmodified lines
3940 const [isSaveDialogOpen, setIsSaveDialogOpen] = useState(false);
4041 const [savePath, setSavePath] = useState("");
4142 const [isSavingToWorkspace, setIsSavingToWorkspace] = useState(false);
43+ const { copyToClipboard, isCopied } = useCopyToClipboard({
44+ onError: (error) => {
45+ toastManager.add({
46+ type: "error",
47+ title: "Could not copy plan",
48+ description: error instanceof Error ? error.message : "An error occurred while copying.",
49+ });
50+ },
51+ });
4252 const savePathInputId = useId();
4353 const title = proposedPlanTitle(planMarkdown) ?? "Proposed plan";
4454 const lineCount = planMarkdown.split("\n").length;
@@ -54,6 +64,10 @@ export const ProposedPlanCard = memo(function ProposedPlanCard({ · 9 unmodified lines
5464 downloadPlanAsTextFile(downloadFilename, saveContents);
5565 };
5666
67+ const handleCopyPlan = () => {
68+ copyToClipboard(saveContents);
69+ };
70+
5771 const openSaveDialog = () => {
5872 if (!workspaceRoot) {
5973 toastManager.add({
@@ -127,6 +141,9 @@ export const ProposedPlanCard = memo(function ProposedPlanCard({ · 67 unmodified lines
127141 <EllipsisIcon aria-hidden="true" className="size-4" />
128142 </MenuTrigger>
129143 <MenuPopup align="end">
144+ <MenuItem onClick={handleCopyPlan}>
145+ {isCopied ? "Copied!" : "Copy to clipboard"}
146+ </MenuItem>
130147 <MenuItem onClick={handleDownload}>Download as markdown</MenuItem>
131148 <MenuItem onClick={openSaveDialog} disabled={!workspaceRoot || isSavingToWorkspace}>
132149 Save to workspace