"use client"; import { IconCheck, IconCopy } from "@tabler/icons-react"; import * as React from "react"; import { Button } from "@/components/ui/button"; import { toast } from "@/components/ui/toast"; import { cn } from "@/lib/utils"; function CopyButton({ value, className, variant = "ghost", ...props }: React.ComponentProps & { value: string; }) { const [hasCopied, setHasCopied] = React.useState(false); const timeoutRef = React.useRef(undefined); React.useEffect( () => () => { if (timeoutRef.current) { clearTimeout(timeoutRef.current); } }, [], ); const handleCopy = async () => { if (hasCopied) return; try { await navigator.clipboard.writeText(value); setHasCopied(true); toast.add({ title: "Copied!", type: "success", timeout: 2000, id: "copy-button-toast-success", }); } catch (error) { console.error("Failed to copy:", error); toast.add({ title: "Failed to copy; see console for details.", type: "error", id: "copy-button-toast-error", }); } finally { if (timeoutRef.current) { clearTimeout(timeoutRef.current); } timeoutRef.current = setTimeout(() => setHasCopied(false), 2000); } }; return ( ); } export { CopyButton };