{"mappings":";;;;;;;;;;;;AAAA;;;;;;;;;;CAUC;;;;;AA4BD,MAAM,qCAAe,IAAI;AACzB,SAAS,6CAAuB,KAAK,EAAE,EAAE;IACvC,IAAI,YAAY,mCAAa,GAAG,CAAC;IACjC,IAAI,CAAC,WAAW;QACd,IAAI,WAAW,IAAI;QACnB,IAAI,WAAW,CAAC;YACd,KAAK,IAAI,WAAW,SAClB,QAAQ;QAEZ;QAEA,YAAY;sBAAC;sBAAU;QAAQ;QAC/B,mCAAa,GAAG,CAAC,OAAO;QAExB,SAAS,gBAAgB,CAAC,OAAO;IACnC;IAEA,UAAU,QAAQ,CAAC,GAAG,CAAC;IACvB,OAAO;QACL,UAAU,QAAQ,CAAC,MAAM,CAAC;QAC1B,IAAI,UAAU,QAAQ,CAAC,IAAI,KAAK,GAAG;YACjC,SAAS,mBAAmB,CAAC,OAAO,UAAU,QAAQ;YACtD,mCAAa,MAAM,CAAC;QACtB;IACF;AACF;AAMO,SAAS,0CAAa,OAAuB;IAClD,IAAI,cAAC,UAAU,EAAC,GAAG;IACnB,IAAI,eAAe,CAAA,GAAA,mBAAK,EAAE;IAC1B,IAAI,cAAC,UAAU,EAAC,GAAG,CAAA,GAAA,kCAAO,EAAE;QAC1B,eAAe,CAAC;YACd,aAAa,OAAO,GAAG;QACzB;IACF;IAEA,IAAI,eAAe,CAAA,GAAA,wCAAa,EAAE,CAAC;QACjC,6FAA6F;QAC7F,IAAI,aAAa,OAAO,IAAI,QAAQ,QAAQ,EAC1C,EAAE,cAAc;IAEpB;IAEA,IAAI,SAAS,CAAA,GAAA,wCAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,aAAa,OAAO,IAAI,CAAC,QAAQ,QAAQ,EAC5C;QAGF,EAAE,cAAc;QAChB,IAAI,EAAE,aAAa,EAAE;YACnB,CAAA,GAAA,6CAAkB,EAAE,EAAE,aAAa,EAAE,QAAQ,QAAQ,CAAC;gBAAC,QAAQ;YAAM;YACrE,QAAQ,MAAM;QAChB;IACF;IAEA,IAAI,cAAc,CAAA,GAAA,wCAAa,EAAE,CAAC;QAChC,IAAI,aAAa,OAAO,IAAI,QAAQ,KAAK,IAAI,QAAQ,QAAQ,EAC3D,EAAE,cAAc;IAEpB;IAEA,IAAI,QAAQ,CAAA,GAAA,wCAAa,EAAE,CAAC;QAC1B,IAAI,CAAC,aAAa,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,QAAQ,EAC9D;QAGF,EAAE,cAAc;QAChB,IAAI,EAAE,aAAa,EAAE;YACnB,CAAA,GAAA,6CAAkB,EAAE,EAAE,aAAa,EAAE,QAAQ,QAAQ,CAAC;gBAAC,QAAQ;YAAK;YACpE,QAAQ,KAAK;QACf;IACF;IAEA,IAAI,gBAAgB,CAAA,GAAA,wCAAa,EAAE,CAAC;QAClC,mFAAmF;QACnF,8EAA8E;QAC9E,IAAI,aAAa,OAAO,IAAI,QAAQ,OAAO,EACzC,EAAE,cAAc;IAEpB;IAEA,IAAI,UAAU,CAAA,GAAA,wCAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,aAAa,OAAO,IAAI,CAAC,QAAQ,OAAO,EAC3C;QAGF,EAAE,cAAc;QAChB,IAAI,EAAE,aAAa,EAAE;YACnB,IAAI,QAAQ,CAAA,GAAA,8CAAmB,EAAE,EAAE,aAAa;YAChD,QAAQ,OAAO,CAAC;QAClB;IACF;IAEA,CAAA,GAAA,sBAAQ,EAAE;QACR,IAAI,YACF;QAEF,OAAO,CAAA,GAAA,+BAAI,EACT,6CAAuB,cAAc,eACrC,6CAAuB,QAAQ,SAC/B,6CAAuB,aAAa,cACpC,6CAAuB,OAAO,QAC9B,6CAAuB,eAAe,gBACtC,6CAAuB,SAAS;IAEpC,GAAG;QAAC;KAAW;IAEf,OAAO;QACL,gBAAgB;IAClB;AACF","sources":["packages/react-aria/src/dnd/useClipboard.ts"],"sourcesContent":["/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {chain} from '../utils/chain';\n\nimport {DOMAttributes, DragItem, DropItem} from '@react-types/shared';\nimport {readFromDataTransfer, writeToDataTransfer} from './utils';\nimport {useEffect, useRef} from 'react';\nimport {useEffectEvent} from '../utils/useEffectEvent';\nimport {useFocus} from '../interactions/useFocus';\n\nexport interface ClipboardProps {\n  /** A function that returns the items to copy. */\n  getItems?: (details: {action: 'cut' | 'copy'}) => DragItem[],\n  /** Handler that is called when the user triggers a copy interaction. */\n  onCopy?: () => void,\n  /** Handler that is called when the user triggers a cut interaction. */\n  onCut?: () => void,\n  /** Handler that is called when the user triggers a paste interaction. */\n  onPaste?: (items: DropItem[]) => void,\n  /** Whether the clipboard is disabled. */\n  isDisabled?: boolean\n}\n\nexport interface ClipboardResult {\n  /** Props for the element that will handle clipboard events. */\n  clipboardProps: DOMAttributes\n}\n\nconst globalEvents = new Map();\nfunction addGlobalEventListener(event, fn) {\n  let eventData = globalEvents.get(event);\n  if (!eventData) {\n    let handlers = new Set<(e: Event) => void>();\n    let listener = (e) => {\n      for (let handler of handlers) {\n        handler(e);\n      }\n    };\n\n    eventData = {listener, handlers};\n    globalEvents.set(event, eventData);\n\n    document.addEventListener(event, listener);\n  }\n\n  eventData.handlers.add(fn);\n  return () => {\n    eventData.handlers.delete(fn);\n    if (eventData.handlers.size === 0) {\n      document.removeEventListener(event, eventData.listener);\n      globalEvents.delete(event);\n    }\n  };\n}\n\n/**\n * Handles clipboard interactions for a focusable element. Supports items of multiple\n * data types, and integrates with the operating system native clipboard.\n */\nexport function useClipboard(options: ClipboardProps): ClipboardResult {\n  let {isDisabled} = options;\n  let isFocusedRef = useRef(false);\n  let {focusProps} = useFocus({\n    onFocusChange: (isFocused) => {\n      isFocusedRef.current = isFocused;\n    }\n  });\n\n  let onBeforeCopy = useEffectEvent((e: ClipboardEvent) => {\n    // Enable the \"Copy\" menu item in Safari if this element is focused and copying is supported.\n    if (isFocusedRef.current && options.getItems) {\n      e.preventDefault();\n    }\n  });\n\n  let onCopy = useEffectEvent((e: ClipboardEvent) => {\n    if (!isFocusedRef.current || !options.getItems) {\n      return;\n    }\n\n    e.preventDefault();\n    if (e.clipboardData) {\n      writeToDataTransfer(e.clipboardData, options.getItems({action: 'copy'}));\n      options.onCopy?.();\n    }\n  });\n\n  let onBeforeCut = useEffectEvent((e: ClipboardEvent) => {\n    if (isFocusedRef.current && options.onCut && options.getItems) {\n      e.preventDefault();\n    }\n  });\n\n  let onCut = useEffectEvent((e: ClipboardEvent) => {\n    if (!isFocusedRef.current || !options.onCut || !options.getItems) {\n      return;\n    }\n\n    e.preventDefault();\n    if (e.clipboardData) {\n      writeToDataTransfer(e.clipboardData, options.getItems({action: 'cut'}));\n      options.onCut();\n    }\n  });\n\n  let onBeforePaste = useEffectEvent((e: ClipboardEvent) => {\n    // Unfortunately, e.clipboardData.types is not available in this event so we always\n    // have to enable the Paste menu item even if the type of data is unsupported.\n    if (isFocusedRef.current && options.onPaste) {\n      e.preventDefault();\n    }\n  });\n\n  let onPaste = useEffectEvent((e: ClipboardEvent) => {\n    if (!isFocusedRef.current || !options.onPaste) {\n      return;\n    }\n\n    e.preventDefault();\n    if (e.clipboardData) {\n      let items = readFromDataTransfer(e.clipboardData);\n      options.onPaste(items);\n    }\n  });\n\n  useEffect(() => {\n    if (isDisabled) {\n      return;\n    }\n    return chain(\n      addGlobalEventListener('beforecopy', onBeforeCopy),\n      addGlobalEventListener('copy', onCopy),\n      addGlobalEventListener('beforecut', onBeforeCut),\n      addGlobalEventListener('cut', onCut),\n      addGlobalEventListener('beforepaste', onBeforePaste),\n      addGlobalEventListener('paste', onPaste)\n    );\n  }, [isDisabled]);\n\n  return {\n    clipboardProps: focusProps\n  };\n}\n"],"names":[],"version":3,"file":"useClipboard.cjs.map"}