drawDB/src/components/diagram.jsx

49 lines
1.3 KiB
React
Raw Normal View History

2023-09-19 20:46:43 +08:00
import React, { useEffect, useRef } from "react";
import { dia, shapes } from "jointjs";
import { useDrop } from "react-dnd";
2023-09-19 20:46:43 +08:00
function Diagram(props) {
2023-09-19 20:46:43 +08:00
const canvas = useRef(null);
const [{ isOver }, drop] = useDrop(() => ({
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
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
},
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,
});
}, [props.graph]);
2023-09-19 20:46:43 +08:00
return (
<div ref={drop} className="flex-grow">
<div id="canvas" ref={canvas}></div>
</div>
);
2023-09-19 20:46:43 +08:00
}
export default Diagram;