2023-09-19 20:46:43 +08:00
|
|
|
import React, { useEffect, useRef } from "react";
|
|
|
|
import { dia, shapes } from "jointjs";
|
2023-09-19 20:46:58 +08:00
|
|
|
import { useDrop } from "react-dnd";
|
2023-09-19 20:46:43 +08:00
|
|
|
|
2023-09-19 20:47:01 +08:00
|
|
|
export default function DrawArea(props) {
|
2023-09-19 20:46:43 +08:00
|
|
|
const canvas = useRef(null);
|
|
|
|
|
2023-09-19 20:47:01 +08:00
|
|
|
const [, drop] = useDrop(() => ({
|
2023-09-19 20:46:58 +08:00
|
|
|
accept: "CARD",
|
|
|
|
drop: (item, monitor) => {
|
|
|
|
const offset = monitor.getClientOffset();
|
|
|
|
const canvasRect = canvas.current.getBoundingClientRect();
|
|
|
|
const x = offset.x - canvasRect.left - item.size.width * 0.5;
|
|
|
|
const y = offset.y - canvasRect.top - item.size.height * 0.5;
|
|
|
|
if (item.type === "rect") {
|
|
|
|
const rect = new shapes.standard.Rectangle();
|
|
|
|
rect.position(x, y);
|
|
|
|
rect.resize(item.size.width, item.size.height);
|
|
|
|
rect.attr(item.attrs);
|
|
|
|
rect.addTo(props.graph);
|
|
|
|
props.setCode((prevCode) => `create table hi\n\n${prevCode}`);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
collect: (monitor) => ({
|
|
|
|
isOver: !!monitor.isOver(),
|
|
|
|
}),
|
|
|
|
}));
|
2023-09-19 20:46:43 +08:00
|
|
|
|
2023-09-19 20:46:58 +08:00
|
|
|
useEffect(() => {
|
2023-09-19 20:46:43 +08:00
|
|
|
new dia.Paper({
|
|
|
|
el: document.getElementById("canvas"),
|
|
|
|
background: {
|
2023-09-19 20:46:48 +08:00
|
|
|
color: "#aec3b0",
|
2023-09-19 20:46:43 +08:00
|
|
|
},
|
2023-09-19 20:46:54 +08:00
|
|
|
model: props.graph,
|
2023-09-19 20:46:44 +08:00
|
|
|
width: "100%",
|
2023-09-19 20:46:43 +08:00
|
|
|
gridSize: 1,
|
|
|
|
interactive: true,
|
|
|
|
});
|
2023-09-19 20:46:54 +08:00
|
|
|
}, [props.graph]);
|
2023-09-19 20:46:43 +08:00
|
|
|
|
2023-09-19 20:46:58 +08:00
|
|
|
return (
|
|
|
|
<div ref={drop} className="flex-grow">
|
|
|
|
<div id="canvas" ref={canvas}></div>
|
|
|
|
</div>
|
|
|
|
);
|
2023-09-19 20:46:43 +08:00
|
|
|
}
|