import React, { useState } from "react"; import { WidgetProps } from "../widgets/BaseWidget"; import { useDrop, XYCoord } from "react-dnd"; import { ContainerProps } from "./ContainerComponent"; import WidgetFactory from "../utils/WidgetFactory"; type DropTargetComponentProps = ContainerProps & { onDrop: Function }; export const DropTargetComponent = (props: DropTargetComponentProps) => { const [isOver, setIsOver] = useState(false); const [, drop] = useDrop({ accept: Object.values(WidgetFactory.getWidgetTypes()), drop(item: WidgetProps, monitor) { if (monitor.isOver({ shallow: true })) { const item = monitor.getItem(); const delta = monitor.getDifferenceFromInitialOffset() as XYCoord; const left = Math.round(item.left + delta.x); const top = Math.round(item.top + delta.y); props.onDrop && props.onDrop({ item, left, top }); } return undefined; }, collect: monitor => ({ isOver: monitor.isOver({ shallow: true }), }), hover: (item, monitor) => { setIsOver(monitor.isOver({ shallow: true })); }, canDrop() { return true; }, }); return (
{isOver ? undefined : props.children}
); }; export default DropTargetComponent;