diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.js b/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.js index 5f00e3f0..0cac4983 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.js +++ b/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.js @@ -2,6 +2,7 @@ import { useState } from "react"; import { Card, ModelSelectModal } from "@/shared/components"; +import { useCopyToClipboard } from "@/shared/hooks/useCopyToClipboard"; import Image from "next/image"; export default function DefaultToolCard({ toolId, tool, isExpanded, onToggle, baseUrl, apiKeys, activeProviders = [], cloudEnabled = false, tunnelEnabled = false }) { @@ -31,8 +32,10 @@ export default function DefaultToolCard({ toolId, tool, isExpanded, onToggle, ba .replace(/\{\{model\}\}/g, modelValue || "provider/model-id"); }; + const { copy: copyToClipboard } = useCopyToClipboard(); + const handleCopy = async (text, field) => { - await navigator.clipboard.writeText(replaceVars(text)); + await copyToClipboard(replaceVars(text), `toolcard-${field}`); setCopiedField(field); setTimeout(() => setCopiedField(null), 2000); }; diff --git a/src/app/(dashboard)/dashboard/translator/page.js b/src/app/(dashboard)/dashboard/translator/page.js index 0e44e1b8..df6b7438 100644 --- a/src/app/(dashboard)/dashboard/translator/page.js +++ b/src/app/(dashboard)/dashboard/translator/page.js @@ -2,6 +2,7 @@ import { useState } from "react"; import { Card, Button } from "@/shared/components"; +import { useCopyToClipboard } from "@/shared/hooks/useCopyToClipboard"; import dynamic from "next/dynamic"; const Editor = dynamic(() => import("@monaco-editor/react"), { ssr: false }); @@ -187,9 +188,11 @@ export default function TranslatorPage() { } }; + const { copy } = useCopyToClipboard(); + const handleCopy = async (id) => { if (!contents[id]) return; - await navigator.clipboard.writeText(contents[id]); + copy(contents[id], `translator-step-${id}`); }; const handleFormat = (id) => { diff --git a/src/app/landing/components/GetStarted.js b/src/app/landing/components/GetStarted.js index 4f37bbe7..1a7ca9d2 100644 --- a/src/app/landing/components/GetStarted.js +++ b/src/app/landing/components/GetStarted.js @@ -1,13 +1,11 @@ "use client"; -import { useState } from "react"; +import { useCopyToClipboard } from "@/shared/hooks/useCopyToClipboard"; export default function GetStarted() { - const [copied, setCopied] = useState(false); + const { copied, copy } = useCopyToClipboard(); const handleCopy = (text) => { - navigator.clipboard.writeText(text); - setCopied(true); - setTimeout(() => setCopied(false), 2000); + copy(text, "landing"); }; return ( @@ -68,7 +66,7 @@ export default function GetStarted() { $ npx 9router - {copied ? "✓ Copied" : "Copy"} + {copied === "landing" ? "✓ Copied" : "Copy"} diff --git a/src/shared/components/ManualConfigModal.js b/src/shared/components/ManualConfigModal.js index c52618f1..6f2b1d36 100644 --- a/src/shared/components/ManualConfigModal.js +++ b/src/shared/components/ManualConfigModal.js @@ -3,18 +3,16 @@ import { useState } from "react"; import Modal from "./Modal"; import Button from "./Button"; +import { useCopyToClipboard } from "@/shared/hooks/useCopyToClipboard"; export default function ManualConfigModal({ isOpen, onClose, title = "Manual Configuration", configs = [] }) { + const { copy } = useCopyToClipboard(); const [copiedIndex, setCopiedIndex] = useState(null); - const copyToClipboard = async (text, index) => { - try { - await navigator.clipboard.writeText(text); - setCopiedIndex(index); - setTimeout(() => setCopiedIndex(null), 2000); - } catch (err) { - console.log("Failed to copy:", err); - } + const copyConfig = (text, index) => { + copy(text, `manualconfig-${index}`); + setCopiedIndex(index); + setTimeout(() => setCopiedIndex(null), 2000); }; return ( @@ -27,7 +25,7 @@ export default function ManualConfigModal({ isOpen, onClose, title = "Manual Con