"use client" import * as React from "react" import { IconCheck, IconCopy } from "@tabler/icons-react" import { trackEvent, type Event } from "@/lib/events" import { cn } from "@/lib/utils" import { Button } from "@/registry/new-york-v4/ui/button" function legacyCopyToClipboard(value: string) { const textArea = document.createElement("textarea") textArea.value = value textArea.setAttribute("readonly", "") textArea.style.position = "fixed" textArea.style.opacity = "0" textArea.style.pointerEvents = "none" document.body.appendChild(textArea) textArea.focus() textArea.select() textArea.setSelectionRange(0, value.length) let hasCopied = false try { hasCopied = document.execCommand("copy") } catch { hasCopied = false } document.body.removeChild(textArea) return hasCopied } export async function copyToClipboardWithMeta(value: string, event?: Event) { if (typeof window === "undefined") { return false } if (!value) { return false } let hasCopied = false if (navigator.clipboard?.writeText) { try { await navigator.clipboard.writeText(value) hasCopied = true } catch { hasCopied = legacyCopyToClipboard(value) } } else { hasCopied = legacyCopyToClipboard(value) } if (!hasCopied) { return false } if (event) { trackEvent(event) } return true } export function CopyButton({ value, className, variant = "ghost", event, ...props }: React.ComponentProps & { value: string src?: string event?: Event["name"] tooltip?: string }) { const [hasCopied, setHasCopied] = React.useState(false) React.useEffect(() => { if (hasCopied) { const timer = setTimeout(() => setHasCopied(false), 2000) return () => clearTimeout(timer) } }, [hasCopied]) return ( ) }