4 changed files with 121 additions and 11 deletions
@ -0,0 +1,51 @@
@@ -0,0 +1,51 @@
|
||||
import { useEffect, useState } from "react"; |
||||
import type { DragEvent, ReactNode } from "react"; |
||||
|
||||
interface FileDropHandlerProps { |
||||
children: ReactNode; |
||||
className: string; |
||||
onDrop: (event: DragEvent<HTMLDivElement>) => void; |
||||
onDraggingChange: (isDragging: boolean) => void; |
||||
} |
||||
|
||||
export function FileDropHandler(props: FileDropHandlerProps) { |
||||
const [dragging, setDragging] = useState(false); |
||||
|
||||
const handleDragEnter = (event: DragEvent<HTMLDivElement>) => { |
||||
event.preventDefault(); |
||||
setDragging(true); |
||||
}; |
||||
|
||||
const handleDragLeave = (event: DragEvent<HTMLDivElement>) => { |
||||
if (!event.currentTarget.contains(event.relatedTarget as Node)) { |
||||
setDragging(false); |
||||
} |
||||
}; |
||||
|
||||
const handleDragOver = (event: DragEvent<HTMLDivElement>) => { |
||||
event.preventDefault(); |
||||
}; |
||||
|
||||
const handleDrop = (event: DragEvent<HTMLDivElement>) => { |
||||
event.preventDefault(); |
||||
setDragging(false); |
||||
|
||||
props.onDrop(event); |
||||
}; |
||||
|
||||
useEffect(() => { |
||||
props.onDraggingChange(dragging); |
||||
}, [dragging, props]); |
||||
|
||||
return ( |
||||
<div |
||||
onDragEnter={handleDragEnter} |
||||
onDragLeave={handleDragLeave} |
||||
onDragOver={handleDragOver} |
||||
onDrop={handleDrop} |
||||
className={props.className} |
||||
> |
||||
{props.children} |
||||
</div> |
||||
); |
||||
} |
Loading…
Reference in new issue