From 08cd1d6ae9fb6328531a9058a8d143d0d61f6ea1 Mon Sep 17 00:00:00 2001 From: Emir Karabeg Date: Thu, 13 Feb 2025 14:46:02 -0800 Subject: [PATCH] Fix: edge connection logic (self-connect and duplicate connections) --- .../sub-block/components/condition-input.tsx | 5 +++++ .../components/workflow-block/workflow-block.tsx | 2 ++ stores/workflow/store.ts | 14 ++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/app/w/[id]/components/workflow-block/components/sub-block/components/condition-input.tsx b/app/w/[id]/components/workflow-block/components/sub-block/components/condition-input.tsx index 65a4c1b0dd..eb3afafc0e 100644 --- a/app/w/[id]/components/workflow-block/components/sub-block/components/condition-input.tsx +++ b/app/w/[id]/components/workflow-block/components/sub-block/components/condition-input.tsx @@ -440,6 +440,11 @@ export function ConditionInput({ blockId, subBlockId, isConnecting }: ConditionI }} isConnectableStart={true} isConnectableEnd={false} + isValidConnection={(connection) => { + const sourceNodeId = connection.source?.split('-')[0] + const targetNodeId = connection.target?.split('-')[0] + return sourceNodeId !== targetNodeId + }} />
diff --git a/app/w/[id]/components/workflow-block/workflow-block.tsx b/app/w/[id]/components/workflow-block/workflow-block.tsx index 482091a916..d617fb05eb 100644 --- a/app/w/[id]/components/workflow-block/workflow-block.tsx +++ b/app/w/[id]/components/workflow-block/workflow-block.tsx @@ -191,6 +191,7 @@ export function WorkflowBlock({ id, data, selected }: NodeProps connection.source !== id} /> {/* Block Header */} @@ -284,6 +285,7 @@ export function WorkflowBlock({ id, data, selected }: NodeProps connection.target !== id} /> )} diff --git a/stores/workflow/store.ts b/stores/workflow/store.ts index 883e7a7188..d39efc30dc 100644 --- a/stores/workflow/store.ts +++ b/stores/workflow/store.ts @@ -186,6 +186,20 @@ export const useWorkflowStore = create()( }, addEdge: (edge: Edge) => { + // Check for duplicate connections + const isDuplicate = get().edges.some( + (existingEdge) => + existingEdge.source === edge.source && + existingEdge.target === edge.target && + existingEdge.sourceHandle === edge.sourceHandle && + existingEdge.targetHandle === edge.targetHandle + ) + + // If it's a duplicate connection, return early without adding the edge + if (isDuplicate) { + return + } + const newEdge = { id: edge.id || crypto.randomUUID(), source: edge.source,