{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "use-copy-feedback",
  "type": "registry:lib",
  "title": "Copy feedback hook",
  "description": "Copies text and reports a short-lived copied state.",
  "categories": [
    "foundation"
  ],
  "registryDependencies": [],
  "files": [
    {
      "path": "src/lib/use-copy-feedback.ts",
      "content": "\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport type CopyFeedbackState = \"idle\" | \"copied\" | \"error\";\n\n/** Shared clipboard state for actions that render their own button or menu. */\nexport function useCopyFeedback(duration = 1900) {\n  const [state, setState] = useState<CopyFeedbackState>(\"idle\");\n  const [activeKey, setActiveKey] = useState<string | null>(null);\n  const timeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  const reset = useCallback(() => {\n    if (timeout.current) clearTimeout(timeout.current);\n    timeout.current = null;\n    setState(\"idle\");\n    setActiveKey(null);\n  }, []);\n\n  useEffect(\n    () => () => {\n      if (timeout.current) clearTimeout(timeout.current);\n    },\n    [],\n  );\n\n  const copy = useCallback(\n    async (value: string, key = \"default\") => {\n      if (timeout.current) clearTimeout(timeout.current);\n      setActiveKey(key);\n      try {\n        await navigator.clipboard.writeText(value);\n        setState(\"copied\");\n        timeout.current = setTimeout(reset, duration);\n        return true;\n      } catch {\n        setState(\"error\");\n        timeout.current = setTimeout(reset, duration);\n        return false;\n      }\n    },\n    [duration, reset],\n  );\n\n  return { state, activeKey, copy, reset };\n}\n",
      "type": "registry:lib",
      "target": "@components/iris/lib/use-copy-feedback.ts"
    }
  ],
  "docs": "Docs and live preview: https://irisui.dev/components/use-copy-feedback",
  "meta": {
    "kind": "lib",
    "docs": "https://irisui.dev/components/use-copy-feedback"
  }
}
