diff --git a/web/app/components/workflow/nodes/_base/components/node-control.tsx b/web/app/components/workflow/nodes/_base/components/node-control.tsx index 0e3f54f108..57f252bc01 100644 --- a/web/app/components/workflow/nodes/_base/components/node-control.tsx +++ b/web/app/components/workflow/nodes/_base/components/node-control.tsx @@ -9,7 +9,6 @@ import { RiPlayLargeLine, } from '@remixicon/react' import { - useNodeDataUpdate, useNodesInteractions, } from '../../../hooks' import { type Node, NodeRunningStatus } from '../../../types' @@ -19,6 +18,7 @@ import { Stop, } from '@/app/components/base/icons/src/vender/line/mediaAndDevices' import Tooltip from '@/app/components/base/tooltip' +import { useWorkflowStore } from '@/app/components/workflow/store' type NodeControlProps = Pick const NodeControl: FC = ({ @@ -27,8 +27,8 @@ const NodeControl: FC = ({ }) => { const { t } = useTranslation() const [open, setOpen] = useState(false) - const { handleNodeDataUpdate } = useNodeDataUpdate() const { handleNodeSelect } = useNodesInteractions() + const workflowStore = useWorkflowStore() const isSingleRunning = data._singleRunningStatus === NodeRunningStatus.Running const handleOpenChange = useCallback((newOpen: boolean) => { setOpen(newOpen) @@ -52,15 +52,12 @@ const NodeControl: FC = ({
{ - const nextData: Record = { - _isSingleRun: !isSingleRunning, - } - if(isSingleRunning) - nextData._singleRunningStatus = undefined - - handleNodeDataUpdate({ - id, - data: nextData, + const action = isSingleRunning ? 'stop' : 'run' + const store = workflowStore.getState() + store.setInitShowLastRunTab(true) + store.setPendingSingleRun({ + nodeId: id, + action, }) handleNodeSelect(id) }} diff --git a/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx b/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx index fb6decbb32..4d24f6af22 100644 --- a/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx +++ b/web/app/components/workflow/nodes/_base/components/workflow-panel/index.tsx @@ -111,6 +111,13 @@ const BasePanel: FC = ({ const nodePanelWidth = useStore(s => s.nodePanelWidth) const otherPanelWidth = useStore(s => s.otherPanelWidth) const setNodePanelWidth = useStore(s => s.setNodePanelWidth) + const { + pendingSingleRun, + setPendingSingleRun, + } = useStore(s => ({ + pendingSingleRun: s.pendingSingleRun, + setPendingSingleRun: s.setPendingSingleRun, + })) const reservedCanvasWidth = 400 // Reserve the minimum visible width for the canvas @@ -256,6 +263,18 @@ const BasePanel: FC = ({ setIsPaused(false) }, [tabType]) + useEffect(() => { + if (!pendingSingleRun || pendingSingleRun.nodeId !== id) + return + + if (pendingSingleRun.action === 'run') + handleSingleRun() + else + handleStop() + + setPendingSingleRun(undefined) + }, [pendingSingleRun, id, handleSingleRun, handleStop, setPendingSingleRun]) + const logParams = useLogs() const passedLogParams = (() => { if ([BlockEnum.Tool, BlockEnum.Agent, BlockEnum.Iteration, BlockEnum.Loop].includes(data.type)) diff --git a/web/app/components/workflow/store/workflow/node-slice.ts b/web/app/components/workflow/store/workflow/node-slice.ts index 2068ee0ba1..3463fdee57 100644 --- a/web/app/components/workflow/store/workflow/node-slice.ts +++ b/web/app/components/workflow/store/workflow/node-slice.ts @@ -48,6 +48,11 @@ export type NodeSliceShape = { setLoopTimes: (loopTimes: number) => void iterParallelLogMap: Map> setIterParallelLogMap: (iterParallelLogMap: Map>) => void + pendingSingleRun?: { + nodeId: string + action: 'run' | 'stop' + } + setPendingSingleRun: (payload?: NodeSliceShape['pendingSingleRun']) => void } export const createNodeSlice: StateCreator = set => ({ @@ -73,4 +78,6 @@ export const createNodeSlice: StateCreator = set => ({ setLoopTimes: loopTimes => set(() => ({ loopTimes })), iterParallelLogMap: new Map>(), setIterParallelLogMap: iterParallelLogMap => set(() => ({ iterParallelLogMap })), + pendingSingleRun: undefined, + setPendingSingleRun: payload => set(() => ({ pendingSingleRun: payload })), })