You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.tsx 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { useCallback, useEffect, useState } from 'react';
  2. import ReactFlow, {
  3. Background,
  4. Controls,
  5. Edge,
  6. Node,
  7. OnConnect,
  8. OnEdgesChange,
  9. OnNodesChange,
  10. addEdge,
  11. applyEdgeChanges,
  12. applyNodeChanges,
  13. } from 'reactflow';
  14. import 'reactflow/dist/style.css';
  15. import { useHandleDrop } from '../hooks';
  16. import { TextUpdaterNode } from './node';
  17. const nodeTypes = { textUpdater: TextUpdaterNode };
  18. const initialNodes = [
  19. {
  20. id: 'node-1',
  21. type: 'textUpdater',
  22. position: { x: 200, y: 50 },
  23. data: { value: 123 },
  24. },
  25. {
  26. id: '1',
  27. data: { label: 'Hello' },
  28. position: { x: 0, y: 0 },
  29. type: 'input',
  30. },
  31. {
  32. id: '2',
  33. data: { label: 'World' },
  34. position: { x: 100, y: 100 },
  35. },
  36. ];
  37. const initialEdges = [
  38. { id: '1-2', source: '1', target: '2', label: 'to the', type: 'step' },
  39. ];
  40. function FlowCanvas() {
  41. const [nodes, setNodes] = useState<Node[]>(initialNodes);
  42. const [edges, setEdges] = useState<Edge[]>(initialEdges);
  43. const onNodesChange: OnNodesChange = useCallback(
  44. (changes) => setNodes((nds) => applyNodeChanges(changes, nds)),
  45. [],
  46. );
  47. const onEdgesChange: OnEdgesChange = useCallback(
  48. (changes) => setEdges((eds) => applyEdgeChanges(changes, eds)),
  49. [],
  50. );
  51. const onConnect: OnConnect = useCallback(
  52. (params) => setEdges((eds) => addEdge(params, eds)),
  53. [],
  54. );
  55. const { handleDrop, allowDrop } = useHandleDrop(setNodes);
  56. useEffect(() => {
  57. console.info('nodes:', nodes);
  58. console.info('edges:', edges);
  59. }, [nodes, edges]);
  60. return (
  61. <div
  62. style={{ height: '100%', width: '100%' }}
  63. onDrop={handleDrop}
  64. onDragOver={allowDrop}
  65. >
  66. <ReactFlow
  67. nodes={nodes}
  68. onNodesChange={onNodesChange}
  69. edges={edges}
  70. onEdgesChange={onEdgesChange}
  71. // fitView
  72. onConnect={onConnect}
  73. nodeTypes={nodeTypes}
  74. >
  75. <Background />
  76. <Controls />
  77. </ReactFlow>
  78. </div>
  79. );
  80. }
  81. export default FlowCanvas;