diff --git a/web/app/components/workflow/custom-edge.tsx b/web/app/components/workflow/custom-edge.tsx index 24ba08bee7..9fb652e2ac 100644 --- a/web/app/components/workflow/custom-edge.tsx +++ b/web/app/components/workflow/custom-edge.tsx @@ -7,17 +7,17 @@ import { getSimpleBezierPath, } from 'reactflow' import BlockSelector from './block-selector' -import { useStore } from './store' const CustomEdge = ({ id, + data, sourceX, sourceY, targetX, targetY, selected, }: EdgeProps) => { - const hoveringEdgeId = useStore(state => state.hoveringEdgeId) + console.log() const [ edgePath, labelX, @@ -43,7 +43,7 @@ const CustomEdge = ({ /> { - hoveringEdgeId === id && ( + data?.hovering && (
{ - const { mode } = useWorkflowContext() + const mode = useStore(state => state.mode) return (
((_, edge) => { + setEdges((oldEdges) => { + return produce(oldEdges, (draft) => { + const currentEdge = draft.find(e => e.id === edge.id) + if (currentEdge) + currentEdge.data = { ...currentEdge.data, hovering: true } + }) + }) + }, [setEdges]) + const handleLeaveEdge = useCallback((_, edge) => { + setEdges((oldEdges) => { + return produce(oldEdges, (draft) => { + const currentEdge = draft.find(e => e.id === edge.id) + if (currentEdge) + currentEdge.data = { ...currentEdge.data, hovering: false } + }) + }) + }, [setEdges]) return { handleAddNextNode, handleUpdateNodeData, + handleEnterEdge, + handleLeaveEdge, } } diff --git a/web/app/components/workflow/index.tsx b/web/app/components/workflow/index.tsx index 2c9c075dc4..270057cc48 100644 --- a/web/app/components/workflow/index.tsx +++ b/web/app/components/workflow/index.tsx @@ -1,5 +1,5 @@ import type { FC } from 'react' -import { memo } from 'react' +import { memo, useEffect } from 'react' import type { Edge } from 'reactflow' import ReactFlow, { Background, @@ -71,17 +71,26 @@ const WorkflowWrap: FC = memo(({ selectedNodeId: initialSelectedNodeId, }) => { const [nodes, setNodes] = useNodesState(initialNodes) - const [edges, setEdges] = useEdgesState(initialEdges) + const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges) const { handleAddNextNode, handleUpdateNodeData, + handleEnterEdge, + handleLeaveEdge, } = useWorkflow( nodes, edges, setNodes, setEdges, ) + const handleSelectedNodeId = useStore(state => state.handleSelectedNodeId) + useEffect(() => { + if (initialSelectedNodeId) + handleSelectedNodeId(initialSelectedNodeId) + }, [initialSelectedNodeId, handleSelectedNodeId]) + // const handleEnterEdge = useStore(state => state.handleEnterEdge) + // const handleLeaveEdge = useStore(state => state.handleLeaveEdge) return ( = memo(({ handleAddNextNode, handleUpdateNodeData, }}> - +
+
+ + + + + +
) }) diff --git a/web/app/components/workflow/nodes/_base/node.tsx b/web/app/components/workflow/nodes/_base/node.tsx index bd864237b7..1d6bad7081 100644 --- a/web/app/components/workflow/nodes/_base/node.tsx +++ b/web/app/components/workflow/nodes/_base/node.tsx @@ -17,11 +17,12 @@ import NodeControl from './components/node-control' type BaseNodeProps = { children: ReactElement -} & Pick +} & NodeProps const BaseNode: FC = ({ id: nodeId, data, + selected, children, }) => { const nodes = useNodes() diff --git a/web/app/components/workflow/nodes/index.tsx b/web/app/components/workflow/nodes/index.tsx index c3197ed628..9b954b5487 100644 --- a/web/app/components/workflow/nodes/index.tsx +++ b/web/app/components/workflow/nodes/index.tsx @@ -14,11 +14,9 @@ import { import BaseNode from './_base/node' import BasePanel from './_base/panel' -const CustomNode = ({ - id, - data, -}: NodeProps) => { - const NodeComponent = NodeComponentMap[data.type] +const CustomNode = (props: NodeProps) => { + const nodeData = props.data + const NodeComponent = NodeComponentMap[nodeData.type] return ( <> @@ -28,14 +26,11 @@ const CustomNode = ({ className={` !top-[17px] !left-0 !w-4 !h-4 !bg-transparent !rounded-none !outline-none !border-none !translate-y-0 z-[1] after:absolute after:w-0.5 after:h-2 after:-left-0.5 after:top-1 after:bg-primary-500 - ${data.type === BlockEnum.Start && 'opacity-0'} + ${nodeData.type === BlockEnum.Start && 'opacity-0'} `} - isConnectable={data.type !== BlockEnum.Start} + isConnectable={nodeData.type !== BlockEnum.Start} /> - + (set => ({ + mode: 'workflow', selectedNodeId: '', handleSelectedNodeId: selectedNodeId => set(() => ({ selectedNodeId })), hoveringEdgeId: '',