mirror of
https://github.com/OpenCut-app/OpenCut.git
synced 2026-07-13 21:52:53 +02:00
53 lines
1.2 KiB
TypeScript
53 lines
1.2 KiB
TypeScript
import { useState, useRef } from "react";
|
|||
|
|
|
||
|
|
interface UseDragDropOptions {
|
||
|
|
onDrop?: (files: FileList) => void;
|
||
|
|
}
|
||
|
|
|
||
|
|
export function useDragDrop(options: UseDragDropOptions = {}) {
|
||
|
|
const [isDragOver, setIsDragOver] = useState(false);
|
||
|
|
const dragCounterRef = useRef(0);
|
||
|
|
|
||
|
|
const handleDragEnter = (e: React.DragEvent) => {
|
||
|
|
e.preventDefault();
|
||
|
|
dragCounterRef.current += 1;
|
||
|
|
if (!isDragOver) {
|
||
|
|
setIsDragOver(true);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
const handleDragOver = (e: React.DragEvent) => {
|
||
|
|
e.preventDefault();
|
||
|
|
};
|
||
|
|
|
||
|
|
const handleDragLeave = (e: React.DragEvent) => {
|
||
|
|
e.preventDefault();
|
||
|
|
dragCounterRef.current -= 1;
|
||
|
|
if (dragCounterRef.current === 0) {
|
||
|
|
setIsDragOver(false);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
const handleDrop = (e: React.DragEvent) => {
|
||
|
|
e.preventDefault();
|
||
|
|
setIsDragOver(false);
|
||
|
|
dragCounterRef.current = 0;
|
||
|
|
|
||
|
|
if (options.onDrop && e.dataTransfer.files) {
|
||
|
|
options.onDrop(e.dataTransfer.files);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
const dragProps = {
|
||
|
|
onDragEnter: handleDragEnter,
|
||
|
|
onDragOver: handleDragOver,
|
||
|
|
onDragLeave: handleDragLeave,
|
||
|
|
onDrop: handleDrop,
|
||
|
|
};
|
||
|
|
|
||
|
|
return {
|
||
|
|
isDragOver,
|
||
|
|
dragProps,
|
||
|
|
};
|
||
|
|
}
|