import React, { useCallback } from "react"; interface Coord { x: number; y: number; } interface Props extends React.HTMLAttributes { handleDrop(e: React.DragEvent, coord: Coord): void; } function supress(e: React.DragEvent) { e.stopPropagation(); e.preventDefault(); e.dataTransfer.dropEffect = "link"; e.dataTransfer.effectAllowed = "link"; } const DropTarget = (props: Props) => { const onDrop = useCallback((e: React.DragEvent) => { supress(e); // TODO: We could probably move this coordinate logic into the playlist. // I think that's the only place it gets used. const { currentTarget } = e; if (!(currentTarget instanceof Element)) { return; } const { left: x, top: y } = currentTarget.getBoundingClientRect(); props.handleDrop(e, { x, y }); }, [props.handleDrop]); const { // eslint-disable-next-line no-shadow, no-unused-vars handleDrop, ...passThroughProps } = props; return (
); }; export default DropTarget;