pstream is dead; long live pstream taciturnaxolotl.github.io/pstream-ng/
at main 51 lines 1.3 kB view raw
1import { useEffect, useState } from "react"; 2import type { DragEvent, ReactNode } from "react"; 3 4interface FileDropHandlerProps { 5 children: ReactNode; 6 className: string; 7 onDrop: (event: DragEvent<HTMLDivElement>) => void; 8 onDraggingChange: (isDragging: boolean) => void; 9} 10 11export function FileDropHandler(props: FileDropHandlerProps) { 12 const [dragging, setDragging] = useState(false); 13 14 const handleDragEnter = (event: DragEvent<HTMLDivElement>) => { 15 event.preventDefault(); 16 setDragging(true); 17 }; 18 19 const handleDragLeave = (event: DragEvent<HTMLDivElement>) => { 20 if (!event.currentTarget.contains(event.relatedTarget as Node)) { 21 setDragging(false); 22 } 23 }; 24 25 const handleDragOver = (event: DragEvent<HTMLDivElement>) => { 26 event.preventDefault(); 27 }; 28 29 const handleDrop = (event: DragEvent<HTMLDivElement>) => { 30 event.preventDefault(); 31 setDragging(false); 32 33 props.onDrop(event); 34 }; 35 36 useEffect(() => { 37 props.onDraggingChange(dragging); 38 }, [dragging, props]); 39 40 return ( 41 <div 42 onDragEnter={handleDragEnter} 43 onDragLeave={handleDragLeave} 44 onDragOver={handleDragOver} 45 onDrop={handleDrop} 46 className={props.className} 47 > 48 {props.children} 49 </div> 50 ); 51}