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 { // eslint-disable-next-line no-shadow, no-unused-vars handleDrop, ...passThroughProps } = 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(); handleDrop(e, { x, y }); }, [handleDrop] ); return (
); }; export default DropTarget;