Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

index.tsx 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { useCallback, useEffect, useState } from 'react';
  2. import ReactFlow, {
  3. Background,
  4. Controls,
  5. Edge,
  6. Node,
  7. NodeMouseHandler,
  8. OnConnect,
  9. OnEdgesChange,
  10. OnNodesChange,
  11. addEdge,
  12. applyEdgeChanges,
  13. applyNodeChanges,
  14. } from 'reactflow';
  15. import 'reactflow/dist/style.css';
  16. import { NodeContextMenu, useHandleNodeContextMenu } from './context-menu';
  17. import FlowDrawer from '../flow-drawer';
  18. import {
  19. useHandleDrop,
  20. useHandleKeyUp,
  21. useHandleSelectionChange,
  22. useShowDrawer,
  23. } from '../hooks';
  24. import { dsl } from '../mock';
  25. import { TextUpdaterNode } from './node';
  26. const nodeTypes = { textUpdater: TextUpdaterNode };
  27. interface IProps {
  28. sideWidth: number;
  29. }
  30. function FlowCanvas({ sideWidth }: IProps) {
  31. const [nodes, setNodes] = useState<Node[]>(dsl.graph.nodes);
  32. const [edges, setEdges] = useState<Edge[]>(dsl.graph.edges);
  33. const { selectedEdges, selectedNodes } = useHandleSelectionChange();
  34. const { ref, menu, onNodeContextMenu, onPaneClick } =
  35. useHandleNodeContextMenu(sideWidth);
  36. const { drawerVisible, hideDrawer, showDrawer } = useShowDrawer();
  37. const onNodesChange: OnNodesChange = useCallback(
  38. (changes) => setNodes((nds) => applyNodeChanges(changes, nds)),
  39. [],
  40. );
  41. const onEdgesChange: OnEdgesChange = useCallback(
  42. (changes) => setEdges((eds) => applyEdgeChanges(changes, eds)),
  43. [],
  44. );
  45. const onConnect: OnConnect = useCallback(
  46. (params) => setEdges((eds) => addEdge(params, eds)),
  47. [],
  48. );
  49. const onNodeClick: NodeMouseHandler = useCallback(() => {
  50. showDrawer();
  51. }, [showDrawer]);
  52. const { onDrop, onDragOver, setReactFlowInstance } = useHandleDrop(setNodes);
  53. const { handleKeyUp } = useHandleKeyUp(selectedEdges, selectedNodes);
  54. useEffect(() => {
  55. console.info('nodes:', nodes);
  56. console.info('edges:', edges);
  57. }, [nodes, edges]);
  58. return (
  59. <div style={{ height: '100%', width: '100%' }}>
  60. <ReactFlow
  61. ref={ref}
  62. nodes={nodes}
  63. onNodesChange={onNodesChange}
  64. onNodeContextMenu={onNodeContextMenu}
  65. edges={edges}
  66. onEdgesChange={onEdgesChange}
  67. fitView
  68. onConnect={onConnect}
  69. nodeTypes={nodeTypes}
  70. onPaneClick={onPaneClick}
  71. onDrop={onDrop}
  72. onDragOver={onDragOver}
  73. onNodeClick={onNodeClick}
  74. onInit={setReactFlowInstance}
  75. onKeyUp={handleKeyUp}
  76. >
  77. <Background />
  78. <Controls />
  79. {Object.keys(menu).length > 0 && (
  80. <NodeContextMenu onClick={onPaneClick} {...(menu as any)} />
  81. )}
  82. </ReactFlow>
  83. <FlowDrawer visible={drawerVisible} hideModal={hideDrawer}></FlowDrawer>
  84. </div>
  85. );
  86. }
  87. export default FlowCanvas;