@wordpress/compose
Version:
WordPress higher-order components (HOCs).
128 lines (127 loc) • 4.07 kB
JavaScript
// packages/compose/src/hooks/use-drop-zone/index.js
import useRefEffect from "../use-ref-effect";
import useEvent from "../use-event";
function useDropZone({
dropZoneElement,
isDisabled,
onDrop: _onDrop,
onDragStart: _onDragStart,
onDragEnter: _onDragEnter,
onDragLeave: _onDragLeave,
onDragEnd: _onDragEnd,
onDragOver: _onDragOver
}) {
const onDropEvent = useEvent(_onDrop);
const onDragStartEvent = useEvent(_onDragStart);
const onDragEnterEvent = useEvent(_onDragEnter);
const onDragLeaveEvent = useEvent(_onDragLeave);
const onDragEndEvent = useEvent(_onDragEnd);
const onDragOverEvent = useEvent(_onDragOver);
return useRefEffect(
(elem) => {
if (isDisabled) {
return;
}
const element = dropZoneElement ?? elem;
let isDragging = false;
const { ownerDocument } = element;
function isElementInZone(targetToCheck) {
const { defaultView } = ownerDocument;
if (!targetToCheck || !defaultView || !(targetToCheck instanceof defaultView.HTMLElement) || !element.contains(targetToCheck)) {
return false;
}
let elementToCheck = targetToCheck;
do {
if (elementToCheck.dataset.isDropZone) {
return elementToCheck === element;
}
} while (elementToCheck = elementToCheck.parentElement);
return false;
}
function maybeDragStart(event) {
if (isDragging) {
return;
}
isDragging = true;
ownerDocument.addEventListener("dragend", maybeDragEnd);
ownerDocument.addEventListener("mousemove", maybeDragEnd);
if (_onDragStart) {
onDragStartEvent(event);
}
}
function onDragEnter(event) {
event.preventDefault();
if (element.contains(
/** @type {Node} */
event.relatedTarget
)) {
return;
}
if (_onDragEnter) {
onDragEnterEvent(event);
}
}
function onDragOver(event) {
if (!event.defaultPrevented && _onDragOver) {
onDragOverEvent(event);
}
event.preventDefault();
}
function onDragLeave(event) {
if (isElementInZone(event.relatedTarget)) {
return;
}
if (_onDragLeave) {
onDragLeaveEvent(event);
}
}
function onDrop(event) {
if (event.defaultPrevented) {
return;
}
event.preventDefault();
event.dataTransfer && event.dataTransfer.files.length;
if (_onDrop) {
onDropEvent(event);
}
maybeDragEnd(event);
}
function maybeDragEnd(event) {
if (!isDragging) {
return;
}
isDragging = false;
ownerDocument.removeEventListener("dragend", maybeDragEnd);
ownerDocument.removeEventListener("mousemove", maybeDragEnd);
if (_onDragEnd) {
onDragEndEvent(event);
}
}
element.setAttribute("data-is-drop-zone", "true");
element.addEventListener("drop", onDrop);
element.addEventListener("dragenter", onDragEnter);
element.addEventListener("dragover", onDragOver);
element.addEventListener("dragleave", onDragLeave);
ownerDocument.addEventListener("dragenter", maybeDragStart);
return () => {
element.removeAttribute("data-is-drop-zone");
element.removeEventListener("drop", onDrop);
element.removeEventListener("dragenter", onDragEnter);
element.removeEventListener("dragover", onDragOver);
element.removeEventListener("dragleave", onDragLeave);
ownerDocument.removeEventListener("dragend", maybeDragEnd);
ownerDocument.removeEventListener("mousemove", maybeDragEnd);
ownerDocument.removeEventListener(
"dragenter",
maybeDragStart
);
};
},
[isDisabled, dropZoneElement]
// Refresh when the passed in dropZoneElement changes.
);
}
export {
useDropZone as default
};
//# sourceMappingURL=index.js.map