{"version":3,"file":"useDragAndDrop.cjs","sources":["../../../../src/components/FileUpload/useDragAndDrop.ts"],"sourcesContent":["import {\n  useState,\n  useRef,\n  useCallback,\n  useEffect,\n  type DragEvent,\n  type RefObject,\n  type ChangeEvent,\n} from 'react';\n\nexport interface UseDragAndDropOptions {\n  onFilesProcessed: (files: File[]) => void;\n  supportedFileTypes: string[];\n  onFileFailure?: () => void;\n  multiple?: boolean;\n}\n\nexport interface UseDragAndDropReturn {\n  isDragging: boolean;\n  isNotSupported: boolean;\n  fileInputRef: RefObject<HTMLInputElement>;\n  handleDragEnter: (e: DragEvent<HTMLDivElement>) => void;\n  handleDragLeave: (e: DragEvent<HTMLDivElement>) => void;\n  handleDragOver: (e: DragEvent<HTMLDivElement>) => void;\n  handleDrop: (e: DragEvent<HTMLDivElement>) => void;\n  handleFileSelect: (e: ChangeEvent<HTMLInputElement>) => void;\n  handleBrowseClick: () => void;\n}\n\nconst isFiletypeSupported = (filename: string, supportedTypes: string[]): boolean => {\n  if (!supportedTypes.length) {\n    return true;\n  }\n\n  const extension = filename.toLowerCase().slice(filename.lastIndexOf('.'));\n  return supportedTypes.some(type => type.toLowerCase() === extension.toLowerCase());\n};\n\nexport const useDragAndDrop = ({\n  onFilesProcessed,\n  supportedFileTypes,\n  onFileFailure,\n  multiple = false,\n}: UseDragAndDropOptions): UseDragAndDropReturn => {\n  const [isDragging, setIsDragging] = useState(false);\n  const [isNotSupported, setIsNotSupported] = useState(false);\n  const fileInputRef = useRef<HTMLInputElement>(null);\n  const dragCounterRef = useRef(0);\n\n  useEffect(() => {\n    let timeoutId: NodeJS.Timeout;\n    if (isNotSupported) {\n      timeoutId = setTimeout(() => {\n        setIsNotSupported(false);\n      }, 2000);\n    }\n    return () => {\n      if (timeoutId) {\n        clearTimeout(timeoutId);\n      }\n    };\n  }, [isNotSupported]);\n\n  const handleDragEnter = useCallback((e: DragEvent<HTMLDivElement>) => {\n    e.preventDefault();\n    e.stopPropagation();\n    dragCounterRef.current += 1;\n    setIsDragging(true);\n  }, []);\n\n  const handleDragLeave = useCallback((e: DragEvent<HTMLDivElement>) => {\n    e.preventDefault();\n    e.stopPropagation();\n\n    dragCounterRef.current -= 1;\n\n    // Only set to false when left the container\n    if (dragCounterRef.current <= 0) {\n      setIsDragging(false);\n      dragCounterRef.current = 0;\n    }\n  }, []);\n\n  const handleDragOver = useCallback((e: DragEvent<HTMLDivElement>) => {\n    e.preventDefault();\n    e.stopPropagation();\n  }, []);\n\n  // Reset state when drag ends anywhere in the document\n  useEffect(() => {\n    const handleDragEnd = () => {\n      setIsDragging(false);\n      dragCounterRef.current = 0;\n    };\n\n    window.addEventListener('dragend', handleDragEnd);\n    document.addEventListener('drop', handleDragEnd);\n    document.addEventListener('mouseleave', handleDragEnd);\n\n    return () => {\n      window.removeEventListener('dragend', handleDragEnd);\n      document.removeEventListener('drop', handleDragEnd);\n      document.removeEventListener('mouseleave', handleDragEnd);\n    };\n  }, []);\n\n  const processFiles = useCallback(\n    (files: File[]) => {\n      const validFiles: File[] = [];\n      let hasInvalidFile = false;\n\n      files.forEach(file => {\n        if (isFiletypeSupported(file.name, supportedFileTypes)) {\n          validFiles.push(file);\n        } else {\n          hasInvalidFile = true;\n        }\n      });\n\n      if (hasInvalidFile) {\n        setIsNotSupported(true);\n        if (onFileFailure) {\n          onFileFailure();\n        }\n      }\n\n      if (validFiles.length > 0) {\n        setIsNotSupported(false);\n        onFilesProcessed(validFiles);\n      }\n    },\n    [onFilesProcessed, supportedFileTypes, onFileFailure]\n  );\n\n  const handleDrop = useCallback(\n    (e: DragEvent<HTMLDivElement>) => {\n      e.preventDefault();\n      e.stopPropagation();\n      setIsDragging(false);\n      dragCounterRef.current = 0;\n\n      if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n        const files = Array.from(e.dataTransfer.files);\n        processFiles(multiple ? files : [files[0]]);\n      }\n    },\n    [processFiles, multiple]\n  );\n\n  const handleFileSelect = useCallback(\n    (e: ChangeEvent<HTMLInputElement>) => {\n      if (e.target.files && e.target.files.length > 0) {\n        const files = Array.from(e.target.files);\n        processFiles(files);\n      }\n    },\n    [processFiles]\n  );\n\n  const handleBrowseClick = useCallback(() => {\n    if (fileInputRef.current) {\n      fileInputRef.current.click();\n    }\n  }, []);\n\n  return {\n    isDragging,\n    isNotSupported,\n    fileInputRef,\n    handleDragEnter,\n    handleDragLeave,\n    handleDragOver,\n    handleDrop,\n    handleFileSelect,\n    handleBrowseClick,\n  };\n};\n"],"names":["useState","useRef","useEffect","useCallback"],"mappings":"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"}