{"version":3,"file":"useClipboard.mjs","names":[],"sources":["../../../../package/common/hooks/useClipboard.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface UseClipboardOptions {\n  /** How long `copied` stays `true` after a successful copy, in ms. Default: 2000. */\n  timeout?: number;\n}\n\nexport interface UseClipboardResult {\n  /** Writes `text` to the clipboard. Resolves `true` on success, `false` on failure. */\n  copy: (text: string) => Promise<boolean>;\n  /** `true` for `timeout` ms after a successful copy. */\n  copied: boolean;\n  /** Why the last copy failed, until the next attempt. */\n  error: Error | null;\n  /** Clears `copied` and `error` early. */\n  reset: () => void;\n}\n\n// No `execCommand('copy')` fallback: it is deprecated, and where the async API is missing the\n// caller is better served by `error` than by a copy that may silently do nothing.\nexport function useClipboard({ timeout = 2000 }: UseClipboardOptions = {}): UseClipboardResult {\n  const [copied, setCopied] = useState(false);\n  const [error, setError] = useState<Error | null>(null);\n  const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n  const clearTimer = useCallback(() => {\n    if (timerRef.current) clearTimeout(timerRef.current);\n    timerRef.current = null;\n  }, []);\n\n  useEffect(() => clearTimer, [clearTimer]);\n\n  const reset = useCallback(() => {\n    clearTimer();\n    setCopied(false);\n    setError(null);\n  }, [clearTimer]);\n\n  const copy = useCallback(\n    async (text: string) => {\n      clearTimer();\n      try {\n        if (!navigator.clipboard?.writeText) throw new Error('Clipboard API unavailable');\n        await navigator.clipboard.writeText(text);\n        setError(null);\n        setCopied(true);\n        timerRef.current = setTimeout(() => setCopied(false), timeout);\n        return true;\n      } catch (e) {\n        setCopied(false);\n        setError(e instanceof Error ? e : new Error(String(e)));\n        return false;\n      }\n    },\n    [clearTimer, timeout],\n  );\n\n  return { copy, copied, error, reset };\n}\n\nexport default useClipboard;\n"],"mappings":"0FAoBA,SAAgB,EAAa,CAAE,UAAU,KAA8B,CAAC,EAAuB,CAC7F,GAAM,CAAC,EAAQ,GAAa,EAAS,EAAK,EACpC,CAAC,EAAO,GAAY,EAAuB,IAAI,EAC/C,EAAW,EAA6C,IAAI,EAE5D,EAAa,MAAkB,CAC/B,EAAS,SAAS,aAAa,EAAS,OAAO,EACnD,EAAS,QAAU,IACrB,EAAG,CAAC,CAAC,EAEL,MAAgB,EAAY,CAAC,CAAU,CAAC,EAExC,IAAM,EAAQ,MAAkB,CAC9B,EAAW,EACX,EAAU,EAAK,EACf,EAAS,IAAI,CACf,EAAG,CAAC,CAAU,CAAC,EAqBf,MAAO,CAAE,KAnBI,EACX,KAAO,IAAiB,CACtB,EAAW,EACX,GAAI,CACF,GAAI,CAAC,UAAU,WAAW,UAAW,MAAU,MAAM,2BAA2B,EAKhF,OAJA,MAAM,UAAU,UAAU,UAAU,CAAI,EACxC,EAAS,IAAI,EACb,EAAU,EAAI,EACd,EAAS,QAAU,eAAiB,EAAU,EAAK,EAAG,CAAO,EACtD,EACT,OAAS,EAAG,CAGV,OAFA,EAAU,EAAK,EACf,EAAS,aAAa,MAAQ,EAAQ,MAAM,OAAO,CAAC,CAAC,CAAC,EAC/C,EACT,CACF,EACA,CAAC,EAAY,CAAO,CAGb,EAAM,SAAQ,QAAO,OAAM,CACtC"}