import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from '@/components/ui/tooltip'; import { useSetModalState } from '@/hooks/common-hooks'; import { get } from 'lodash'; import { FolderInput, FolderOutput } from 'lucide-react'; import { useCallback, useEffect } from 'react'; import ReactFlow, { Background, ConnectionMode, ControlButton, Controls, NodeMouseHandler, } from 'reactflow'; import 'reactflow/dist/style.css'; import ChatDrawer from '../chat/drawer'; import { Operator } from '../constant'; import FormDrawer from '../flow-drawer'; import { useGetBeginNodeDataQuery, useHandleDrop, useHandleExportOrImportJsonFile, useSelectCanvasData, useShowFormDrawer, useShowSingleDebugDrawer, useValidateConnection, useWatchNodeFormDataChange, } from '../hooks'; import { BeginQuery } from '../interface'; import JsonUploadModal from '../json-upload-modal'; import RunDrawer from '../run-drawer'; 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 { EmailNode } from './node/email-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'; import { TemplateNode } from './node/template-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, templateNode: TemplateNode, emailNode: EmailNode, }; const edgeTypes = { buttonEdge: ButtonEdge, }; interface IProps { drawerVisible: boolean; hideDrawer(): void; } function FlowCanvas({ drawerVisible, hideDrawer }: IProps) { const { nodes, edges, onConnect, onEdgesChange, onNodesChange, onSelectionChange, } = useSelectCanvasData(); const isValidConnection = useValidateConnection(); const { visible: runVisible, showModal: showRunModal, hideModal: hideRunModal, } = useSetModalState(); const { visible: chatVisible, showModal: showChatModal, hideModal: hideChatModal, } = useSetModalState(); const { singleDebugDrawerVisible, showSingleDebugDrawer, hideSingleDebugDrawer, } = useShowSingleDebugDrawer(); const controlIconClassname = 'text-black'; const { formDrawerVisible, hideFormDrawer, showFormDrawer, clickedNode } = useShowFormDrawer(); const onPaneClick = useCallback(() => { hideFormDrawer(); }, [hideFormDrawer]); const { onDrop, onDragOver, setReactFlowInstance } = useHandleDrop(); useWatchNodeFormDataChange(); const hideRunOrChatDrawer = useCallback(() => { hideChatModal(); hideRunModal(); hideDrawer(); }, [hideChatModal, hideDrawer, hideRunModal]); const onNodeClick: NodeMouseHandler = useCallback( (e, node) => { if (node.data.label !== Operator.Note) { hideSingleDebugDrawer(); hideRunOrChatDrawer(); showFormDrawer(node); } // handle single debug icon click if ( get(e.target, 'dataset.play') === 'true' || get(e.target, 'parentNode.dataset.play') === 'true' ) { showSingleDebugDrawer(); } }, [ hideRunOrChatDrawer, hideSingleDebugDrawer, showFormDrawer, showSingleDebugDrawer, ], ); const getBeginNodeDataQuery = useGetBeginNodeDataQuery(); const { handleExportJson, handleImportJson, fileUploadVisible, onFileUploadOk, hideFileUploadModal, } = useHandleExportOrImportJsonFile(); useEffect(() => { if (drawerVisible) { const query: BeginQuery[] = getBeginNodeDataQuery(); if (query.length > 0) { showRunModal(); hideChatModal(); } else { showChatModal(); hideRunModal(); } } }, [ hideChatModal, hideRunModal, showChatModal, showRunModal, drawerVisible, getBeginNodeDataQuery, ]); return (
Import Export {formDrawerVisible && ( )} {chatVisible && ( )} {runVisible && ( )} {fileUploadVisible && ( )}
); } export default FlowCanvas;