| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | import { useEffect, useRef, useState } from 'react'type UploaderHookProps = {  onFileChange: (file: File | null) => void  containerRef: React.RefObject<HTMLDivElement>  enabled?: boolean}export const useUploader = ({ onFileChange, containerRef, enabled = true }: UploaderHookProps) => {  const [dragging, setDragging] = useState(false)  const fileUploader = useRef<HTMLInputElement>(null)  const handleDragEnter = (e: DragEvent) => {    e.preventDefault()    e.stopPropagation()    if (e.dataTransfer?.types.includes('Files'))      setDragging(true)  }  const handleDragOver = (e: DragEvent) => {    e.preventDefault()    e.stopPropagation()  }  const handleDragLeave = (e: DragEvent) => {    e.preventDefault()    e.stopPropagation()    if (e.relatedTarget === null || !containerRef.current?.contains(e.relatedTarget as Node))      setDragging(false)  }  const handleDrop = (e: DragEvent) => {    e.preventDefault()    e.stopPropagation()    setDragging(false)    if (!e.dataTransfer)      return    const files = [...e.dataTransfer.files]    if (files.length > 0)      onFileChange(files[0])  }  const fileChangeHandle = enabled    ? (e: React.ChangeEvent<HTMLInputElement>) => {      const file = e.target.files?.[0] || null      onFileChange(file)    }    : null  const removeFile = enabled    ? () => {      if (fileUploader.current)        fileUploader.current.value = ''      onFileChange(null)    }    : null  useEffect(() => {    if (!enabled)      return    const current = containerRef.current    if (current) {      current.addEventListener('dragenter', handleDragEnter)      current.addEventListener('dragover', handleDragOver)      current.addEventListener('dragleave', handleDragLeave)      current.addEventListener('drop', handleDrop)    }    return () => {      if (current) {        current.removeEventListener('dragenter', handleDragEnter)        current.removeEventListener('dragover', handleDragOver)        current.removeEventListener('dragleave', handleDragLeave)        current.removeEventListener('drop', handleDrop)      }    }  }, [containerRef, enabled])  return {    dragging: enabled ? dragging : false,    fileUploader,    fileChangeHandle,    removeFile,  }}
 |