import React, { useRef, useState } from "react"; import { useDrop } from "react-dnd"; import Rect from "./rect"; export default function Canvas(props) { const [dragging, setDragging] = useState(false); const [offset, setOffset] = useState({ x: 0, y: 0 }); const canvas = useRef(null); const handleMouseDown = (event, id) => { const { clientX, clientY } = event; const rectangle = props.rectangles.find((rect) => rect.id === id); setOffset({ x: clientX - rectangle.x, y: clientY - rectangle.y, }); setDragging(id); }; const handleMouseMove = (event) => { if (dragging === false) return; const { clientX, clientY } = event; const updatedRectangles = props.rectangles.map((rect) => { if (rect.id === dragging) { return { ...rect, x: clientX - offset.x, y: clientY - offset.y, }; } return rect; }); props.setRectangles(updatedRectangles); }; const handleMouseUp = () => { setDragging(false); }; const [, drop] = useDrop( () => ({ accept: "CARD", drop: (item, monitor) => { const offset = monitor.getClientOffset(); const canvasRect = canvas.current.getBoundingClientRect(); const x = offset.x - canvasRect.left - 100 * 0.5; const y = offset.y - canvasRect.top - 100 * 0.5; const newRectangle = { id: props.rectangles.length + 1, x, y, width: 100, height: 100, label: `rect ${props.rectangles.length + 1}`, }; props.setRectangles([...props.rectangles, newRectangle]); }, collect: (monitor) => ({ isOver: !!monitor.isOver(), }), }), [props.rectangles] ); return (