diff --git a/web/app/components/workflow/hooks.ts b/web/app/components/workflow/hooks.ts
index e9ecf65fb2..2439f1306e 100644
--- a/web/app/components/workflow/hooks.ts
+++ b/web/app/components/workflow/hooks.ts
@@ -70,7 +70,7 @@ export const useWorkflow = () => {
const nodesInitialData = useNodesInitialData()
const featuresStore = useFeaturesStore()
- const shouldDebouncedSyncWorkflowDraft = () => {
+ const shouldDebouncedSyncWorkflowDraft = useCallback(() => {
const {
getNodes,
edges,
@@ -111,13 +111,20 @@ export const useWorkflow = () => {
useStore.setState({ draftUpdatedAt: res.updated_at })
})
}
- }
+ }, [store, reactFlow, featuresStore])
- const { run: handleSyncWorkflowDraft } = useDebounceFn(shouldDebouncedSyncWorkflowDraft, {
+ const { run: debouncedSyncWorkflowDraft } = useDebounceFn(shouldDebouncedSyncWorkflowDraft, {
wait: 2000,
trailing: true,
})
+ const handleSyncWorkflowDraft = useCallback((shouldDelay?: boolean) => {
+ if (shouldDelay)
+ debouncedSyncWorkflowDraft()
+ else
+ shouldDebouncedSyncWorkflowDraft()
+ }, [debouncedSyncWorkflowDraft, shouldDebouncedSyncWorkflowDraft])
+
const handleLayout = useCallback(async () => {
const {
getNodes,
@@ -332,11 +339,11 @@ export const useWorkflow = () => {
if (!cancelSelection && selectedNode?.id === nodeId)
return
- const newNodes = produce(getNodes(), (draft) => {
+ const newNodes = produce(nodes, (draft) => {
draft.forEach(node => node.data.selected = false)
const selectedNode = draft.find(node => node.id === nodeId)!
- if (!cancelSelection)
+ if (!cancelSelection && selectedNode)
selectedNode.data.selected = true
})
setNodes(newNodes)
@@ -433,7 +440,7 @@ export const useWorkflow = () => {
currentNode.data = { ...currentNode.data, ...data }
})
setNodes(newNodes)
- handleSyncWorkflowDraft()
+ handleSyncWorkflowDraft(true)
}, [store, handleSyncWorkflowDraft])
const handleNodeAddNext = useCallback((
diff --git a/web/app/components/workflow/nodes/_base/components/next-step/index.tsx b/web/app/components/workflow/nodes/_base/components/next-step/index.tsx
index c892fb6a73..f34b5d8e60 100644
--- a/web/app/components/workflow/nodes/_base/components/next-step/index.tsx
+++ b/web/app/components/workflow/nodes/_base/components/next-step/index.tsx
@@ -1,4 +1,4 @@
-import { memo, useMemo } from 'react'
+import { memo } from 'react'
import {
getConnectedEdges,
getOutgoers,
@@ -10,10 +10,10 @@ import type {
Branch,
Node,
} from '../../../../types'
+import { BlockEnum } from '../../../../types'
import Add from './add'
import Item from './item'
import Line from './line'
-import { BlockEnum } from '@/app/components/workflow/types'
type NextStepProps = {
selectedNode: Node
@@ -22,15 +22,8 @@ const NextStep = ({
selectedNode,
}: NextStepProps) => {
const store = useStoreApi()
- const branches = useMemo(() => {
- const nodeData = selectedNode.data
-
- if (nodeData.type === BlockEnum.IfElse)
- return nodeData._targetBranches
-
- if (nodeData.type === BlockEnum.QuestionClassifier)
- return (nodeData as any).classes
- }, [selectedNode])
+ const branches = selectedNode.data._targetBranches
+ const nodeWithBranches = selectedNode.data.type === BlockEnum.IfElse || selectedNode.data.type === BlockEnum.QuestionClassifier
const edges = useEdges()
const outgoers = getOutgoers(selectedNode as Node, store.getState().getNodes(), edges)
const connectedEdges = getConnectedEdges([selectedNode] as Node[], edges).filter(edge => edge.source === selectedNode!.id)
@@ -46,7 +39,7 @@ const NextStep = ({