{"version":3,"file":"dropZone.mjs","names":[],"sources":["../../../../package/common/dropZone/dropZone.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport cx from 'classnames';\n\nimport {\n  DropZoneProps,\n  DropZoneReturnType,\n  DropZoneStatus,\n  DropZoneRejection,\n  DropZoneRenderState,\n  LoadedFile,\n} from './dropZone.types';\n\nimport styles from './dropZone.module.pcss';\nimport { isSelfActivation } from '../utils/activationKey';\n\n// ── Pure helpers ──────────────────────────────────────────────────────────────\n\n/** True when a file matches one of the accepted tokens (extension, mime, or wildcard). */\nfunction matchesAccepted(file: File, acceptedTypes: string[]): boolean {\n  if (!acceptedTypes.length) return true;\n  const name = file.name.toLowerCase();\n  const type = file.type.toLowerCase();\n  return acceptedTypes.some((raw) => {\n    const accept = raw.trim().toLowerCase();\n    if (!accept) return false;\n    if (accept.startsWith('.')) return name.endsWith(accept); // extension\n    if (accept.endsWith('/*')) return type.startsWith(accept.slice(0, -1)); // wildcard e.g. image/\n    return type === accept; // exact mime type\n  });\n}\n\ntype ReadResult = { ok: true; value: File | LoadedFile } | { ok: false };\n\n/** Read a single file into the requested return shape. Never rejects — failures resolve to `{ ok: false }`. */\nfunction readFile(file: File, returnType: DropZoneReturnType): Promise<ReadResult> {\n  if (returnType === DropZoneReturnType.File) {\n    return Promise.resolve({ ok: true, value: file });\n  }\n  return new Promise<ReadResult>((resolve) => {\n    const reader = new FileReader();\n    reader.onload = (event) => {\n      const data = event.target?.result;\n      if (typeof data !== 'string') {\n        resolve({ ok: false });\n        return;\n      }\n      resolve({\n        ok: true,\n        value: { name: file.name, size: file.size, type: file.type, lastModified: file.lastModified, data },\n      });\n    };\n    reader.onerror = () => resolve({ ok: false });\n    if (returnType === DropZoneReturnType.Base64) reader.readAsDataURL(file);\n    else reader.readAsText(file);\n  });\n}\n\n/** Recursively flatten a dropped file-system entry into a list of Files. */\nfunction readEntry(entry: FileSystemEntry): Promise<File[]> {\n  return new Promise((resolve) => {\n    if (entry.isFile) {\n      (entry as FileSystemFileEntry).file(\n        (file) => resolve([file]),\n        () => resolve([]),\n      );\n    } else if (entry.isDirectory) {\n      const reader = (entry as FileSystemDirectoryEntry).createReader();\n      const collected: FileSystemEntry[] = [];\n      const readBatch = () => {\n        // readEntries yields entries in chunks — keep calling until it returns empty.\n        reader.readEntries(\n          (batch) => {\n            if (!batch.length) {\n              Promise.all(collected.map(readEntry)).then((nested) => resolve(nested.flat()));\n            } else {\n              collected.push(...batch);\n              readBatch();\n            }\n          },\n          () => resolve([]),\n        );\n      };\n      readBatch();\n    } else {\n      resolve([]);\n    }\n  });\n}\n\n/**\n * Extract Files from a drop's DataTransfer. `webkitGetAsEntry()` must be called\n * synchronously within the drop handler, so all entries are captured before any await.\n */\nfunction gatherFiles(dataTransfer: DataTransfer, allowDirectories: boolean): Promise<File[]> {\n  const items = dataTransfer.items;\n  if (items && items.length) {\n    if (allowDirectories && typeof items[0].webkitGetAsEntry === 'function') {\n      const entries: FileSystemEntry[] = [];\n      for (let i = 0; i < items.length; i += 1) {\n        if (items[i].kind === 'file') {\n          const entry = items[i].webkitGetAsEntry();\n          if (entry) entries.push(entry);\n        }\n      }\n      if (entries.length) {\n        return Promise.all(entries.map(readEntry)).then((nested) => nested.flat());\n      }\n    }\n    const files: File[] = [];\n    for (let i = 0; i < items.length; i += 1) {\n      if (items[i].kind === 'file') {\n        const file = items[i].getAsFile();\n        if (file) files.push(file);\n      }\n    }\n    return Promise.resolve(files);\n  }\n  return Promise.resolve(Array.from(dataTransfer.files || []));\n}\n\n// ── Component ───────────────────────────────────────────────────────────────\n\nfunction DropZone({\n  children,\n  acceptedTypes = [],\n  returnType = DropZoneReturnType.File,\n  openPickerOnClick = false,\n  multiple = true,\n  maxFiles,\n  maxSize,\n  enablePaste = false,\n  allowDirectories = true,\n  capture,\n  disabled = false,\n  unstyled = false,\n  showFileNames = false,\n  files,\n  onFilesChanged,\n  onReject,\n  onStatusChanged,\n  className,\n  style,\n  classNames,\n  styles: slotStyles,\n  ...rest\n}: DropZoneProps) {\n  const [status, setStatus] = useState<DropZoneStatus>(DropZoneStatus.Idle);\n\n  const inputRef = useRef<HTMLInputElement>(null);\n  const inputId = useId();\n  const statusRef = useRef(status);\n  const windowDragDepth = useRef(0);\n  const zoneDragDepth = useRef(0);\n\n  // Latest props/callbacks, so the once-mounted window listeners never read stale values.\n  const cfg = useRef({\n    acceptedTypes,\n    returnType,\n    multiple,\n    maxFiles,\n    maxSize,\n    allowDirectories,\n    disabled,\n    onFilesChanged,\n    onReject,\n    onStatusChanged,\n  });\n  useEffect(() => {\n    cfg.current = {\n      acceptedTypes,\n      returnType,\n      multiple,\n      maxFiles,\n      maxSize,\n      allowDirectories,\n      disabled,\n      onFilesChanged,\n      onReject,\n      onStatusChanged,\n    };\n  });\n\n  const changeStatus = useCallback((next: DropZoneStatus) => {\n    if (statusRef.current === next) return;\n    statusRef.current = next;\n    setStatus(next);\n    cfg.current.onStatusChanged?.(next);\n  }, []);\n\n  const processFiles = useCallback(\n    async (incoming: File[]) => {\n      const c = cfg.current;\n      const rejections: DropZoneRejection[] = [];\n      let accepted: File[] = [];\n\n      for (const file of incoming) {\n        if (!matchesAccepted(file, c.acceptedTypes)) {\n          rejections.push({ file, reason: 'unacceptedType' });\n        } else if (c.maxSize != null && file.size > c.maxSize) {\n          rejections.push({ file, reason: 'tooLarge' });\n        } else {\n          accepted.push(file);\n        }\n      }\n\n      if (!c.multiple) accepted = accepted.slice(0, 1);\n      if (c.maxFiles != null && accepted.length > c.maxFiles) {\n        accepted.slice(c.maxFiles).forEach((file) => rejections.push({ file, reason: 'tooMany' }));\n        accepted = accepted.slice(0, c.maxFiles);\n      }\n\n      // Read in input order — Promise.all preserves index regardless of completion order.\n      const results = await Promise.all(accepted.map((file) => readFile(file, c.returnType)));\n      const loaded: (File | LoadedFile)[] = [];\n      results.forEach((result, index) => {\n        if (result.ok) loaded.push(result.value);\n        else rejections.push({ file: accepted[index], reason: 'readError' });\n      });\n\n      if (rejections.length) c.onReject?.(rejections);\n      changeStatus(rejections.length && !loaded.length ? DropZoneStatus.Error : DropZoneStatus.Idle);\n      if (loaded.length) c.onFilesChanged?.(loaded);\n    },\n    [changeStatus],\n  );\n\n  // Window-level drag tracking via an enter/leave depth counter (robust against bubbling).\n  useEffect(() => {\n    const hasFiles = (dt: DataTransfer | null) => !dt || Array.from(dt.types || []).includes('Files');\n\n    const onWindowDragEnter = (e: DragEvent) => {\n      if (cfg.current.disabled || !hasFiles(e.dataTransfer)) return;\n      windowDragDepth.current += 1;\n      if (statusRef.current === DropZoneStatus.Idle || statusRef.current === DropZoneStatus.Error) {\n        changeStatus(DropZoneStatus.Dragging);\n      }\n    };\n    const onWindowDragLeave = () => {\n      windowDragDepth.current = Math.max(0, windowDragDepth.current - 1);\n      if (windowDragDepth.current === 0 && statusRef.current === DropZoneStatus.Dragging) {\n        changeStatus(DropZoneStatus.Idle);\n      }\n    };\n    const onWindowDrop = () => {\n      windowDragDepth.current = 0;\n      zoneDragDepth.current = 0;\n      if (statusRef.current === DropZoneStatus.Dragging) changeStatus(DropZoneStatus.Idle);\n    };\n\n    window.addEventListener('dragenter', onWindowDragEnter);\n    window.addEventListener('dragleave', onWindowDragLeave);\n    window.addEventListener('drop', onWindowDrop);\n    return () => {\n      window.removeEventListener('dragenter', onWindowDragEnter);\n      window.removeEventListener('dragleave', onWindowDragLeave);\n      window.removeEventListener('drop', onWindowDrop);\n    };\n  }, [changeStatus]);\n\n  const onDragOver = useCallback(\n    (e: React.DragEvent<HTMLDivElement>) => {\n      e.preventDefault();\n      e.stopPropagation();\n      if (e.dataTransfer) e.dataTransfer.dropEffect = disabled ? 'none' : 'copy';\n    },\n    [disabled],\n  );\n\n  const onDragEnter = useCallback(\n    (e: React.DragEvent<HTMLDivElement>) => {\n      e.preventDefault();\n      e.stopPropagation();\n      if (disabled) return;\n      zoneDragDepth.current += 1;\n      changeStatus(DropZoneStatus.Active);\n    },\n    [disabled, changeStatus],\n  );\n\n  const onDragLeave = useCallback(\n    (e: React.DragEvent<HTMLDivElement>) => {\n      e.preventDefault();\n      e.stopPropagation();\n      zoneDragDepth.current = Math.max(0, zoneDragDepth.current - 1);\n      if (zoneDragDepth.current === 0) {\n        // Left the zone, but a drag may still be active elsewhere in the window.\n        changeStatus(windowDragDepth.current > 0 ? DropZoneStatus.Dragging : DropZoneStatus.Idle);\n      }\n    },\n    [changeStatus],\n  );\n\n  const onDrop = useCallback(\n    (e: React.DragEvent<HTMLDivElement>) => {\n      e.preventDefault();\n      e.stopPropagation();\n      zoneDragDepth.current = 0;\n      windowDragDepth.current = 0;\n      if (disabled || !e.dataTransfer) {\n        changeStatus(DropZoneStatus.Idle);\n        return;\n      }\n      changeStatus(DropZoneStatus.Idle);\n      // gatherFiles captures any directory entries synchronously before awaiting.\n      gatherFiles(e.dataTransfer, cfg.current.allowDirectories).then((collected) => {\n        if (collected.length) processFiles(collected);\n      });\n    },\n    [disabled, changeStatus, processFiles],\n  );\n\n  const openPicker = useCallback(() => {\n    if (disabled || !openPickerOnClick) return;\n    inputRef.current?.click();\n  }, [disabled, openPickerOnClick]);\n\n  const onInputChange = useCallback(\n    (e: React.ChangeEvent<HTMLInputElement>) => {\n      const selected = Array.from(e.target.files || []);\n      // Reset so picking the same file again still fires onChange.\n      e.target.value = '';\n      if (selected.length) processFiles(selected);\n    },\n    [processFiles],\n  );\n\n  const onPaste = useCallback(\n    (e: React.ClipboardEvent<HTMLDivElement>) => {\n      if (!enablePaste || disabled) return;\n      const pasted = Array.from(e.clipboardData?.files || []);\n      if (pasted.length) {\n        e.preventDefault();\n        processFiles(pasted);\n      }\n    },\n    [enablePaste, disabled, processFiles],\n  );\n\n  const onKeyDown = useCallback(\n    (e: React.KeyboardEvent<HTMLDivElement>) => {\n      if (!openPickerOnClick || disabled) return;\n      if (!isSelfActivation(e)) return;\n      e.preventDefault();\n      openPicker();\n    },\n    [openPickerOnClick, disabled, openPicker],\n  );\n\n  const isDragging = status === DropZoneStatus.Dragging || status === DropZoneStatus.Active;\n  const renderState: DropZoneRenderState = {\n    status,\n    isDragging,\n    isActive: status === DropZoneStatus.Active,\n    disabled,\n  };\n\n  const acceptAttr = acceptedTypes.length ? acceptedTypes.join(',') : undefined;\n\n  return (\n    <div\n      {...rest}\n      className={cx(\n        styles.dropZone,\n        openPickerOnClick && styles.dropZoneClickable,\n        disabled && styles.dropZoneDisabled,\n        !unstyled && styles.dropZoneDefault,\n        !unstyled && status === DropZoneStatus.Dragging && styles.dropZoneDragging,\n        !unstyled && status === DropZoneStatus.Active && styles.dropZoneActive,\n        !unstyled && status === DropZoneStatus.Error && styles.dropZoneError,\n        classNames?.root,\n        className,\n      )}\n      style={{ ...slotStyles?.root, ...style }}\n      onDragEnter={onDragEnter}\n      onDragLeave={onDragLeave}\n      onDragOver={onDragOver}\n      onDrop={onDrop}\n      onClick={openPicker}\n      onKeyDown={onKeyDown}\n      onPaste={enablePaste ? onPaste : undefined}\n      role={openPickerOnClick ? 'button' : undefined}\n      tabIndex={openPickerOnClick && !disabled ? 0 : undefined}\n      aria-disabled={disabled || undefined}\n    >\n      <div\n        className={cx(styles.dropZoneContent, isDragging && styles.dropZoneContentDragging, classNames?.content)}\n        style={slotStyles?.content}\n      >\n        {typeof children === 'function' ? children(renderState) : children}\n      </div>\n\n      {showFileNames && files && files.length > 0 && (\n        <div className={cx(styles.dropZoneFileList, classNames?.fileList)} style={slotStyles?.fileList}>\n          {files.map((file, index) => (\n            <div\n              key={`${file.name}-${index}`}\n              className={cx(styles.dropZoneFileItem, classNames?.fileItem)}\n              style={slotStyles?.fileItem}\n            >\n              {file.name}\n            </div>\n          ))}\n        </div>\n      )}\n\n      <input\n        ref={inputRef}\n        id={inputId}\n        type='file'\n        className={cx(styles.dropZoneInput, classNames?.input)}\n        style={slotStyles?.input}\n        accept={acceptAttr}\n        multiple={multiple}\n        capture={capture}\n        disabled={disabled}\n        onChange={onInputChange}\n        tabIndex={-1}\n        aria-hidden='true'\n      />\n    </div>\n  );\n}\n\nexport default DropZone;\n"],"mappings":"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"}