{"version":3,"sources":["../../src/use-clipboard-items/index.ts"],"sourcesContent":["import { useEventListener } from '../use-event-listener'\nimport { useLatest } from '../use-latest'\nimport { usePermission } from '../use-permission'\nimport { useStableFn } from '../use-stable-fn'\nimport { useSupported } from '../use-supported'\nimport { useTimeoutFn } from '../use-timeout-fn'\nimport { useTrackedRefState } from '../use-tracked-ref-state'\n\nimport type { UsePermissionReturns } from '../use-permission'\n\nexport interface UseClipboardItemsOptions<Source> {\n  /**\n   * Enabled reading for clipboard, need to request permission\n   *\n   * @defaultValue false\n   */\n  read?: boolean\n  /**\n   * Copy source\n   */\n  source?: Source\n  /**\n   * Milliseconds to reset state of `copied` state\n   *\n   * @defaultValue 1_500\n   */\n  copiedDuration?: number\n  /**\n   * Callback when the text is copied\n   */\n  onCopy?: (text: string) => void\n  /**\n   * Callback when the `copied` state is reset\n   */\n  onCopiedReset?: () => void\n}\n\nexport interface UseClipboardItemsReturns<Optional> {\n  /**\n   * Check if the browser supports clipboard API\n   */\n  isSupported: boolean\n  /**\n   * Clipboard items\n   */\n  content: ClipboardItems\n  /**\n   * Check if the content is copied\n   */\n  copied: boolean\n  /**\n   * Copy content to clipboard\n   */\n  copy: Optional extends true ? (content?: ClipboardItems) => Promise<void> : (text: ClipboardItems) => Promise<void>\n  /**\n   * Clear clipboard\n   */\n  clear(): void\n}\n\nfunction isAllowed(status: UsePermissionReturns<false>) {\n  return status.current && ['granted', 'prompt'].includes(status.current)\n}\n\n/**\n * Almost same as [useClipboard](https://sheinsight.github.io/react-use/reference/use-clipboard), but support multiple items via [ClipboardItem](https://developer.mozilla.org/en-US/docs/Web/API/ClipboardItem).\n */\nexport function useClipboardItems(options?: UseClipboardItemsOptions<undefined>): UseClipboardItemsReturns<false>\nexport function useClipboardItems(options: UseClipboardItemsOptions<ClipboardItems>): UseClipboardItemsReturns<true>\nexport function useClipboardItems(\n  options: UseClipboardItemsOptions<ClipboardItems | undefined> = {},\n): UseClipboardItemsReturns<boolean> {\n  const { read = false, source, onCopy, onCopiedReset, copiedDuration = 1500 } = options\n\n  const isSupported = useSupported(() => 'clipboard' in navigator)\n\n  const permissionRead = usePermission('clipboard-read')\n  const permissionWrite = usePermission('clipboard-write')\n\n  const latest = useLatest({ isSupported, onCopy, onCopiedReset })\n\n  const [refState, actions] = useTrackedRefState({\n    content: [] as ClipboardItems,\n    copied: false,\n  })\n\n  const { resume: startTimeout } = useTimeoutFn(() => {\n    actions.updateRefState('copied', false)\n    latest.current.onCopiedReset?.()\n  }, copiedDuration)\n\n  const updateContent = useStableFn(async () => {\n    if (latest.current.isSupported && isAllowed(permissionRead)) {\n      const items = (await navigator?.clipboard.read()) || []\n      actions.updateRefState('content', items)\n    }\n  })\n\n  useEventListener(isSupported && read ? ['copy', 'cut', 'focus'] : [], updateContent)\n\n  const copy = useStableFn(async (value = source) => {\n    if (latest.current.isSupported && value && isAllowed(permissionWrite)) {\n      await navigator.clipboard.write(value)\n      actions.updateRefState('content', value)\n      actions.updateRefState('copied', true)\n      startTimeout()\n      latest.current.onCopy?.(value)\n    }\n  })\n\n  const clear = useStableFn(async () => {\n    if (latest.current.isSupported && isAllowed(permissionWrite)) {\n      await navigator.clipboard.write([])\n      actions.updateRefState('content', [])\n    }\n  })\n\n  return {\n    isSupported,\n    copy,\n    clear,\n    get copied() {\n      return refState.copied\n    },\n    get content() {\n      return refState.content\n    },\n  }\n}\n"],"names":["useClipboardItems","isAllowed","status","current","includes","options","read","source","onCopy","onCopiedReset","copiedDuration","isSupported","useSupported","navigator","permissionRead","usePermission","permissionWrite","latest","useLatest","useTrackedRefState","content","copied","refState","actions","useTimeoutFn","updateRefState","resume","startTimeout","updateContent","useStableFn","items","clipboard","useEventListener","copy","value","write","clear"],"mappings":";;;;+BAqEgBA;;;eAAAA;;;gCArEiB;yBACP;6BACI;2BACF;4BACC;4BACA;kCACM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDnC,SAASC,UAAUC,MAAmC;IACpD,OAAOA,OAAOC,OAAO,IAAI;QAAC;QAAW;KAAS,CAACC,QAAQ,CAACF,OAAOC,OAAO;AACxE;AAOO,SAASH;QACdK,UAAAA,iEAAgE,CAAC;IAEjE,oBAA+EA,QAAvEC,MAAAA,kCAAO,uBAAOC,SAAyDF,QAAzDE,QAAQC,SAAiDH,QAAjDG,QAAQC,gBAAyCJ,QAAzCI,yCAAyCJ,QAA1BK,gBAAAA,sDAAiB;IAEtE,IAAMC,cAAcC,IAAAA,0BAAY,EAAC;eAAM,eAAeC;;IAEtD,IAAMC,iBAAiBC,IAAAA,4BAAa,EAAC;IACrC,IAAMC,kBAAkBD,IAAAA,4BAAa,EAAC;IAEtC,IAAME,SAASC,IAAAA,oBAAS,EAAC;QAAEP,aAAAA;QAAaH,QAAAA;QAAQC,eAAAA;IAAc;IAE9D,IAA4BU,uCAAAA,IAAAA,sCAAkB,EAAC;QAC7CC,SAAS,EAAE;QACXC,QAAQ;IACV,QAHOC,WAAqBH,wBAAXI,UAAWJ;IAK5B,IAAiCK,gBAAAA,IAAAA,0BAAY,EAAC;YAE5CP,+BAAAA;QADAM,QAAQE,cAAc,CAAC,UAAU;SACjCR,gCAAAA,CAAAA,kBAAAA,OAAOd,OAAO,EAACM,aAAa,cAA5BQ,oDAAAA,mCAAAA;IACF,GAAGP,iBAHKgB,AAAQC,eAAiBH,cAAzBE;IAKR,IAAME,gBAAgBC,IAAAA,wBAAW,EAAC;;gBAEThB,YAAfiB;;;;6BADJb,CAAAA,OAAOd,OAAO,CAACQ,WAAW,IAAIV,UAAUa,eAAc,GAAtDG;;;;wBACa;;6BAAMJ,aAAAA,uBAAAA,iCAAAA,WAAWkB,SAAS,CAACzB,IAAI;;;wBAAxCwB,QAAQ,AAAC;wBACfP,QAAQE,cAAc,CAAC,WAAWK;;;;;;;;QAEtC;;IAEAE,IAAAA,kCAAgB,EAACrB,eAAeL,OAAO;QAAC;QAAQ;QAAO;KAAQ,GAAG,EAAE,EAAEsB;IAEtE,IAAMK,OAAOJ,IAAAA,wBAAW,EAAC;YAAOK,yEAAQ3B;;gBAMpCU,wBAAAA;;;;6BALEA,CAAAA,OAAOd,OAAO,CAACQ,WAAW,IAAIuB,SAASjC,UAAUe,gBAAe,GAAhEC;;;;wBACF;;4BAAMJ,UAAUkB,SAAS,CAACI,KAAK,CAACD;;;wBAAhC;wBACAX,QAAQE,cAAc,CAAC,WAAWS;wBAClCX,QAAQE,cAAc,CAAC,UAAU;wBACjCE;yBACAV,yBAAAA,CAAAA,kBAAAA,OAAOd,OAAO,EAACK,MAAM,cAArBS,6CAAAA,4BAAAA,iBAAwBiB;;;;;;;;QAE5B;;IAEA,IAAME,QAAQP,IAAAA,wBAAW,EAAC;;;;;6BACpBZ,CAAAA,OAAOd,OAAO,CAACQ,WAAW,IAAIV,UAAUe,gBAAe,GAAvDC;;;;wBACF;;4BAAMJ,UAAUkB,SAAS,CAACI,KAAK;;;wBAA/B;wBACAZ,QAAQE,cAAc,CAAC;;;;;;;;QAE3B;;IAEA,OAAO;QACLd,aAAAA;QACAsB,MAAAA;QACAG,OAAAA;QACA,IAAIf,UAAS;YACX,OAAOC,SAASD,MAAM;QACxB;QACA,IAAID,WAAU;YACZ,OAAOE,SAASF,OAAO;QACzB;IACF;AACF"}