{"version":3,"sources":["../../src/use-drop-zone/index.ts"],"sourcesContent":["import { useRef } from 'react'\nimport { useEventListener } from '../use-event-listener'\nimport { useLatest } from '../use-latest'\nimport { useSetState } from '../use-set-state'\nimport { useTargetElement } from '../use-target-element'\nimport { isFunction, noNullish } from '../utils/basic'\n\nimport type { ElementTarget } from '../use-target-element'\n\nexport interface UseDropZoneOptions {\n  /**\n   * The file types that are accepted by the drop zone.\n   */\n  dataTypes?: string[] | ((types: readonly string[]) => boolean)\n  /**\n   * A callback that is called when the user drops files in the drop zone.\n   */\n  onDrop?: (files: File[] | null, event: DragEvent) => void\n  /**\n   * A callback that is called when the user drags files over the drop zone.\n   */\n  onEnter?: (files: File[] | null, event: DragEvent) => void\n  /**\n   * A callback that is called when the user drags files out of the drop zone.\n   */\n  onLeave?: (files: File[] | null, event: DragEvent) => void\n  /**\n   * A callback that is called when the user drags files over the drop zone.\n   */\n  onOver?: (files: File[] | null, event: DragEvent) => void\n}\n\nexport interface UseDropZoneReturns {\n  /**\n   * The files that were dropped in the drop zone.\n   */\n  files: File[] | null\n  /**\n   * Whether the user is currently dragging files over the drop zone.\n   */\n  isOverDropZone: boolean\n}\n\n/**\n * A React Hook that allows you to create a dropzone.\n */\nexport function useDropZone(\n  target: ElementTarget,\n  options: UseDropZoneOptions | UseDropZoneOptions['onDrop'] = {},\n): UseDropZoneReturns {\n  const el = useTargetElement(target)\n\n  const [state, setState] = useSetState({\n    files: null as File[] | null,\n    isOverDropZone: false,\n  })\n\n  const countRef = useRef(0)\n  const isTypeAcceptedRef = useRef(true)\n\n  const latest = useLatest({\n    options: isFunction(options) ? { onDrop: options } : options,\n  })\n\n  useEventListener<DragEvent>(el, 'dragenter', (event) => {\n    event.preventDefault()\n\n    const types = Array.from(event?.dataTransfer?.items || [])\n      .map((i) => (i.kind === 'file' ? i.type : null))\n      .filter(noNullish)\n\n    const { dataTypes } = latest.current.options\n\n    if (dataTypes && event.dataTransfer) {\n      const isTypeAccepted = isFunction(dataTypes) ? dataTypes(types) : dataTypes.some((item) => types.includes(item))\n\n      isTypeAcceptedRef.current = isTypeAccepted\n\n      if (!isTypeAccepted) return\n    }\n\n    countRef.current++\n\n    if (countRef.current > 0) {\n      setState({ isOverDropZone: true })\n    }\n\n    latest.current.options.onEnter?.(getFiles(event), event)\n  })\n\n  useEventListener<DragEvent>(el, 'dragover', (event) => {\n    if (!isTypeAcceptedRef.current) return\n    event.preventDefault()\n    latest.current.options.onOver?.(getFiles(event), event)\n  })\n\n  useEventListener<DragEvent>(el, 'dragleave', (event) => {\n    if (!isTypeAcceptedRef.current) return\n    event.preventDefault()\n    countRef.current--\n    if (countRef.current === 0) setState({ isOverDropZone: false })\n    latest.current.options.onLeave?.(getFiles(event), event)\n  })\n\n  useEventListener<DragEvent>(el, 'drop', (event) => {\n    if (!isTypeAcceptedRef.current) return\n    event.preventDefault()\n    countRef.current = 0\n    setState({ isOverDropZone: false, files: getFiles(event) })\n    latest.current.options.onDrop?.(getFiles(event), event)\n  })\n\n  return state\n}\n\nfunction getFiles(event: DragEvent) {\n  const list = Array.from(event.dataTransfer?.files ?? [])\n  return list.length === 0 ? null : list\n}\n"],"names":["useDropZone","target","options","el","useTargetElement","useSetState","files","isOverDropZone","state","setState","countRef","useRef","isTypeAcceptedRef","latest","useLatest","isFunction","onDrop","useEventListener","event","preventDefault","types","Array","from","dataTransfer","items","map","i","kind","type","filter","noNullish","dataTypes","current","isTypeAccepted","some","item","includes","onEnter","getFiles","onOver","onLeave","list","length"],"mappings":"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"}