Skip to content

Instantly share code, notes, and snippets.

@nickytonline
Last active August 31, 2020 21:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nickytonline/9af2bbd95fb0c28cbb1ee7fd83fe24c3 to your computer and use it in GitHub Desktop.
Save nickytonline/9af2bbd95fb0c28cbb1ee7fd83fe24c3 to your computer and use it in GitHub Desktop.
A (P)React hook for attaching drag and drop events to an element.
/**
* Hook for drag attaching drag and drop functionality to a DOM element
*
* @param {object} props
* @param {Function} props.onDragOver The handler that runs when the dragover event is fired.
* @param {Function} props.onDragExit The handler that runs when the dragexit/dragleave events are fired.
* @param {Function} props.onDrop The handler that runs when the drop event is fired.
*/
export function useDragAndDrop({ onDragOver, onDragExit, onDrop }) {
const [element, setElement] = useState(null);
useEffect(() => {
if (!element) {
return;
}
const noDragAndDropHandler = (event) => event.preventDefault();
document.addEventListener('dragover', noDragAndDropHandler);
document.addEventListener('drop', noDragAndDropHandler);
element.addEventListener('dragover', onDragOver);
element.addEventListener('dragexit', onDragExit);
element.addEventListener('dragleave', onDragExit);
element.addEventListener('drop', onDrop);
return () => {
document.removeEventListener('dragover', noDragAndDropHandler);
document.removeEventListener('drop', noDragAndDropHandler);
element.removeEventListener('dragover', onDragOver);
element.removeEventListener('dragexit', onDragExit);
element.addEventListener('dragleave', onDragExit);
element.removeEventListener('drop', onDrop);
};
}, [element, onDragOver, onDragExit, onDrop, allowDropOnDocument]);
return { setElement };
}
@nickytonline
Copy link
Author

The element would be set via setElement in the component consuming the hook. The value passed in to setElement would be a DOM element from a ref.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment