| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- import { useCallback, useEffect, useState } from 'react';
- import ReactFlow, {
- Background,
- Controls,
- Edge,
- Node,
- NodeMouseHandler,
- OnConnect,
- OnEdgesChange,
- OnNodesChange,
- addEdge,
- applyEdgeChanges,
- applyNodeChanges,
- } from 'reactflow';
- import 'reactflow/dist/style.css';
-
- import { NodeContextMenu, useHandleNodeContextMenu } from './context-menu';
-
- import FlowDrawer from '../flow-drawer';
- import { useHandleDrop, useShowDrawer } from '../hooks';
- import { initialEdges, initialNodes } from '../mock';
- import { getLayoutedElements } from '../utils';
- import { TextUpdaterNode } from './node';
-
- const nodeTypes = { textUpdater: TextUpdaterNode };
-
- interface IProps {
- sideWidth: number;
- }
-
- function FlowCanvas({ sideWidth }: IProps) {
- const { nodes: layoutedNodes, edges: layoutedEdges } = getLayoutedElements(
- initialNodes,
- initialEdges,
- 'LR',
- );
- const [nodes, setNodes] = useState<Node[]>(layoutedNodes);
- const [edges, setEdges] = useState<Edge[]>(layoutedEdges);
- const { ref, menu, onNodeContextMenu, onPaneClick } =
- useHandleNodeContextMenu(sideWidth);
- const { drawerVisible, hideDrawer, showDrawer } = useShowDrawer();
-
- const onNodesChange: OnNodesChange = useCallback(
- (changes) => setNodes((nds) => applyNodeChanges(changes, nds)),
- [],
- );
- const onEdgesChange: OnEdgesChange = useCallback(
- (changes) => setEdges((eds) => applyEdgeChanges(changes, eds)),
- [],
- );
-
- const onConnect: OnConnect = useCallback(
- (params) => setEdges((eds) => addEdge(params, eds)),
- [],
- );
-
- const onNodeClick: NodeMouseHandler = useCallback(() => {
- showDrawer();
- }, [showDrawer]);
-
- const { onDrop, onDragOver, setReactFlowInstance } = useHandleDrop(setNodes);
-
- useEffect(() => {
- console.info('nodes:', nodes);
- console.info('edges:', edges);
- }, [nodes, edges]);
-
- return (
- <div style={{ height: '100%', width: '100%' }}>
- <ReactFlow
- ref={ref}
- nodes={nodes}
- onNodesChange={onNodesChange}
- onNodeContextMenu={onNodeContextMenu}
- edges={edges}
- onEdgesChange={onEdgesChange}
- fitView
- onConnect={onConnect}
- nodeTypes={nodeTypes}
- onPaneClick={onPaneClick}
- onDrop={onDrop}
- onDragOver={onDragOver}
- onNodeClick={onNodeClick}
- onInit={setReactFlowInstance}
- >
- <Background />
- <Controls />
- {Object.keys(menu).length > 0 && (
- <NodeContextMenu onClick={onPaneClick} {...(menu as any)} />
- )}
- </ReactFlow>
- <FlowDrawer visible={drawerVisible} hideModal={hideDrawer}></FlowDrawer>
- </div>
- );
- }
-
- export default FlowCanvas;
|