FlowWrapper.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import React from "react";
  2. import ReactFlow, {
  3. ControlButton,
  4. Controls,
  5. Elements,
  6. NodeExtent,
  7. } from "react-flow-renderer";
  8. import { useLocalStorage } from "usehooks-ts";
  9. import { defaultValue } from "../JsonEditor";
  10. import { getLayout, getLayoutPosition } from "./helpers";
  11. import { CustomNodeComponent } from "./Node";
  12. const nodeExtent: NodeExtent = [
  13. [0, 0],
  14. [1000, 1000],
  15. ];
  16. const nodeTypes = {
  17. special: CustomNodeComponent,
  18. };
  19. export const FlowWrapper: React.FC = () => {
  20. const [json] = useLocalStorage("json", JSON.stringify(defaultValue));
  21. const [layout] = useLocalStorage("layout", "RL");
  22. const [elements, setElements] = React.useState<Elements>([]);
  23. const [rfInstance, setRfInstance] = React.useState<any>(null);
  24. const [valid, setValid] = React.useState(true);
  25. React.useEffect(() => {
  26. if (rfInstance) rfInstance.fitView();
  27. }, [rfInstance]);
  28. React.useEffect(() => {
  29. try {
  30. const layoutedElements = getLayout(layout, json);
  31. setElements(layoutedElements);
  32. setValid(true);
  33. } catch (error) {
  34. setValid(false);
  35. }
  36. }, [rfInstance, json, layout]);
  37. if (!valid) return null;
  38. return (
  39. <ReactFlow
  40. nodeExtent={nodeExtent}
  41. elements={elements}
  42. nodeTypes={nodeTypes}
  43. onLoad={(rf: any) => setRfInstance(rf)}
  44. >
  45. <Controls>
  46. <ControlButton
  47. onClick={() => setElements(getLayoutPosition(layout, elements))}
  48. style={{ gridColumn: "1 / 3", width: "auto" }}
  49. >
  50. Format
  51. </ControlButton>
  52. </Controls>
  53. </ReactFlow>
  54. );
  55. };