import { useCallback } from 'react'; import ReactFlow, { Background, ConnectionMode, Controls, NodeMouseHandler, } from 'reactflow'; import 'reactflow/dist/style.css'; import ChatDrawer from '../chat/drawer'; import { Operator } from '../constant'; import FlowDrawer from '../flow-drawer'; import { useHandleDrop, useHandleKeyUp, useSelectCanvasData, useShowDrawer, useValidateConnection, useWatchNodeFormDataChange, } from '../hooks'; import { ButtonEdge } from './edge'; import styles from './index.less'; import { RagNode } from './node'; import { BeginNode } from './node/begin-node'; import { CategorizeNode } from './node/categorize-node'; import { GenerateNode } from './node/generate-node'; import { InvokeNode } from './node/invoke-node'; import { KeywordNode } from './node/keyword-node'; import { LogicNode } from './node/logic-node'; import { MessageNode } from './node/message-node'; import NoteNode from './node/note-node'; import { RelevantNode } from './node/relevant-node'; import { RetrievalNode } from './node/retrieval-node'; import { RewriteNode } from './node/rewrite-node'; import { SwitchNode } from './node/switch-node'; const nodeTypes = { ragNode: RagNode, categorizeNode: CategorizeNode, beginNode: BeginNode, relevantNode: RelevantNode, logicNode: LogicNode, noteNode: NoteNode, switchNode: SwitchNode, generateNode: GenerateNode, retrievalNode: RetrievalNode, messageNode: MessageNode, rewriteNode: RewriteNode, keywordNode: KeywordNode, invokeNode: InvokeNode, }; const edgeTypes = { buttonEdge: ButtonEdge, }; interface IProps { chatDrawerVisible: boolean; hideChatDrawer(): void; } function FlowCanvas({ chatDrawerVisible, hideChatDrawer }: IProps) { const { nodes, edges, onConnect, onEdgesChange, onNodesChange, onSelectionChange, } = useSelectCanvasData(); const isValidConnection = useValidateConnection(); const { drawerVisible, hideDrawer, showDrawer, clickedNode } = useShowDrawer(); const onNodeClick: NodeMouseHandler = useCallback( (e, node) => { if (node.data.label !== Operator.Note) { showDrawer(node); } }, [showDrawer], ); const onPaneClick = useCallback(() => { hideDrawer(); }, [hideDrawer]); const { onDrop, onDragOver, setReactFlowInstance } = useHandleDrop(); const { handleKeyUp } = useHandleKeyUp(); useWatchNodeFormDataChange(); return (