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(layoutedNodes); const [edges, setEdges] = useState(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 (
{Object.keys(menu).length > 0 && ( )}
); } export default FlowCanvas;