index.tsx 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import React from "react";
  2. import { Canvas, EdgeData, ElkRoot, NodeData } from "reaflow";
  3. import { CustomNode } from "src/components/CustomNode";
  4. import { useConfig } from "src/hocs/config";
  5. import { getEdgeNodes } from "src/containers/LiveEditor/helpers";
  6. export const Graph: React.FC = () => {
  7. const { json, settings } = useConfig();
  8. const [nodes, setNodes] = React.useState<NodeData[]>([]);
  9. const [edges, setEdges] = React.useState<EdgeData[]>([]);
  10. const [size, setSize] = React.useState({
  11. width: 2000,
  12. height: 2000,
  13. });
  14. React.useEffect(() => {
  15. const { nodes, edges } = getEdgeNodes(json, settings.expand);
  16. setNodes(nodes);
  17. setEdges(edges);
  18. }, [json, settings.expand]);
  19. const onCanvasClick = () => {
  20. const input = document.querySelector("input:focus") as HTMLInputElement;
  21. if (input) input.blur();
  22. };
  23. const onLayoutChange = (layout: ElkRoot) => {
  24. if (layout.width && layout.height)
  25. setSize({ width: layout.width, height: layout.height });
  26. };
  27. return (
  28. <Canvas
  29. nodes={nodes}
  30. edges={edges}
  31. maxWidth={size.width}
  32. maxHeight={size.height}
  33. direction={settings.layout}
  34. key={settings.layout}
  35. onCanvasClick={onCanvasClick}
  36. onLayoutChange={onLayoutChange}
  37. node={CustomNode}
  38. zoomable={false}
  39. readonly
  40. />
  41. );
  42. };