import React, { useContext } from "react";
import { motion } from "framer-motion";
import Node from "../Node";
import Edge from "../Edge";
import RightClickMenu from "../RightClickMenu";
import { useAppDispatch, useAppSelector } from "../hooks";
import {
setCanvasOffset,
setCanvasSize,
} from "../Controller/canvasConfigSlice";
import useAutoExplore from "../hooks/Graph/useAutoExplore";
import { useRightMenuEventDispatch } from "../Controller/RightMenuController";
import { ConfigContext } from "../Controller/ConfigController";
function CanvasContainer({ children }: { children: React.ReactNode }) {
const setEvent = useRightMenuEventDispatch();
const dispatch = useAppDispatch();
const canvasConfig = useAppSelector((state) => state.canvasConfig);
const { config } = useContext(ConfigContext)!;
const { dragRenderOptimization } = config;
return (
<>
{
e.preventDefault();
setEvent(e);
}}
drag
dragConstraints={{
top: 0,
left: 0,
bottom: 0,
right: 0,
}}
dragMomentum={false}
dragSnapToOrigin={false}
dragElastic={0}
dragTransition={{
bounceStiffness: 0,
bounceDamping: 0,
}}
className={"canvas"}
onDrag={(e, info) => {
requestAnimationFrame(() => {
// s2 更改state
if (dragRenderOptimization === "react") {
dispatch(setCanvasOffset({ dx: info.delta.x, dy: info.delta.y }));
} else {
// s1 直接修改dom
const dragElement = document.getElementById("graph-drag")!;
dragElement.style.transform = `translateX(${
canvasConfig.x + info.offset.x
}px) translateY(${canvasConfig.y + info.offset.y}px)`;
}
});
}}
onDragEnd={(e, info) => {
if (dragRenderOptimization === "react") {
// s2 更改state
dispatch(setCanvasOffset({ dx: info.delta.x, dy: info.delta.y }));
} else {
// s1
dispatch(
setCanvasOffset({
dx: info.offset.x,
dy: info.offset.y,
})
);
}
}}
onClick={() => {
setEvent(null);
}}
onWheel={(e) => {
requestAnimationFrame(() => {
if (e.deltaY < 0) {
dispatch(setCanvasSize("zoom-in"));
} else {
dispatch(setCanvasSize("zoom-out"));
}
});
}}
>
{children}
>
);
}
function Canvas() {
const graph = useAppSelector((state) => state.graph);
useAutoExplore();
return (
<>
{graph.edges.map((edge) => {
return ;
})}
{graph.nodes.map((node) => {
return ;
})}
>
);
}
export default React.memo(Canvas);