diff --git a/thoughts-frontend/components/copy-button.tsx b/thoughts-frontend/components/copy-button.tsx index 4e0b8fe..907f936 100644 --- a/thoughts-frontend/components/copy-button.tsx +++ b/thoughts-frontend/components/copy-button.tsx @@ -1,6 +1,6 @@ "use client"; -import { useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { Check, Copy } from "lucide-react"; import { cn } from "@/lib/utils"; @@ -11,17 +11,30 @@ interface CopyButtonProps { export function CopyButton({ text, className }: CopyButtonProps) { const [copied, setCopied] = useState(false); + const timeoutRef = useRef | null>(null); + + useEffect(() => { + return () => { + if (timeoutRef.current) clearTimeout(timeoutRef.current); + }; + }, []); const handleCopy = async () => { - await navigator.clipboard.writeText(text); - setCopied(true); - setTimeout(() => setCopied(false), 1500); + if (copied) return; + try { + await navigator.clipboard.writeText(text); + setCopied(true); + timeoutRef.current = setTimeout(() => setCopied(false), 1500); + } catch { + // clipboard unavailable — silently no-op + } }; return (