UNPKG

@wordpress/compose

Version:
128 lines (127 loc) 4.07 kB
// 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