{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"use-copy-to-clipboard","type":"registry:hook","description":"Use copy to clipboard hook.","files":[{"path":"hooks/use-copy-to-clipboard.ts","type":"registry:hook","content":"\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\ntype UseCopyToClipboardReturn = {\n\tcopied: boolean;\n\tcopy: (text: string) => Promise<boolean>;\n};\n\n// Fallback to old browsers\nfunction fallbackCopy(str: string): boolean {\n\tconst textarea = document.createElement(\"textarea\");\n\tlet success = false;\n\n\ttextarea.value = str;\n\ttextarea.setAttribute(\"readonly\", \"\");\n\n\ttextarea.style.position = \"absolute\";\n\ttextarea.style.left = \"-9999px\";\n\n\tdocument.body.appendChild(textarea);\n\n\ttextarea.select();\n\n\ttry {\n\t\tsuccess = document.execCommand(\"copy\");\n\t} catch {\n\t\tsuccess = false;\n\t} finally {\n\t\tdocument.body.removeChild(textarea);\n\t}\n\n\treturn success;\n}\n\nexport function useCopyToClipboard(duration = 1500): UseCopyToClipboardReturn {\n\tconst [copied, setCopied] = useState<boolean>(false);\n\tconst timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n\tconst copy = useCallback(\n\t\tasync (text: string): Promise<boolean> => {\n\t\t\ttry {\n\t\t\t\tlet success = false;\n\n\t\t\t\tif (navigator.clipboard && navigator.clipboard.writeText) {\n\t\t\t\t\tawait navigator.clipboard.writeText(text);\n\t\t\t\t\tsuccess = true;\n\t\t\t\t} else {\n\t\t\t\t\tsuccess = fallbackCopy(text);\n\t\t\t\t}\n\n\t\t\t\tif (success) {\n\t\t\t\t\tsetCopied(true);\n\t\t\t\t\tif (timeoutRef.current) clearTimeout(timeoutRef.current);\n\t\t\t\t\ttimeoutRef.current = setTimeout(() => setCopied(false), duration);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Copy command failed\");\n\t\t\t} catch (err: unknown) {\n\t\t\t\tconsole.error(\"Failed to copy text: \", err);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\t[duration]\n\t);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (timeoutRef.current) {\n\t\t\t\tclearTimeout(timeoutRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn {\n\t\tcopied,\n\t\tcopy,\n\t};\n}\n"}]}