diff --git a/.changeset/yellow-chicken-sparkle.md b/.changeset/yellow-chicken-sparkle.md new file mode 100644 index 00000000..f729cf0e --- /dev/null +++ b/.changeset/yellow-chicken-sparkle.md @@ -0,0 +1,5 @@ +--- +'@reactflow/core': minor +--- + +Add option to enable/disable replacing edge id when using `updateEdge` diff --git a/packages/core/src/types/general.ts b/packages/core/src/types/general.ts index a34f4a73..549228a8 100644 --- a/packages/core/src/types/general.ts +++ b/packages/core/src/types/general.ts @@ -281,3 +281,7 @@ export type SelectionRect = Rect & { }; export type OnError = (id: string, message: string) => void; + +export interface UpdateEdgeOptions { + shouldReplaceId?: boolean; +} \ No newline at end of file diff --git a/packages/core/src/utils/graph.ts b/packages/core/src/utils/graph.ts index c7772a1c..0d28d659 100644 --- a/packages/core/src/utils/graph.ts +++ b/packages/core/src/utils/graph.ts @@ -12,6 +12,7 @@ import { Rect, NodeInternals, NodeOrigin, + UpdateEdgeOptions, } from '../types'; import { errorMessages } from '../contants'; @@ -93,32 +94,34 @@ export const addEdge = (edgeParams: Edge | Connection, edges: Edge[]): Edge[] => return edges.concat(edge); }; -export const updateEdge = (oldEdge: Edge, newConnection: Connection, edges: Edge[]): Edge[] => { +export const updateEdge = (oldEdge: Edge, newConnection: Connection, edges: Edge[], options: UpdateEdgeOptions = { shouldReplaceId: true }): Edge[] => { + const { id: oldEdgeId, ...rest } = oldEdge; + if (!newConnection.source || !newConnection.target) { devWarn('006', errorMessages['006']()); return edges; } - const foundEdge = edges.find((e) => e.id === oldEdge.id) as Edge; + const foundEdge = edges.find((e) => e.id === oldEdgeId) as Edge; if (!foundEdge) { - devWarn('007', errorMessages['007'](oldEdge.id)); + devWarn('007', errorMessages['007'](oldEdgeId)); return edges; } // Remove old edge and create the new edge with parameters of old edge. const edge = { - ...oldEdge, - id: getEdgeId(newConnection), + ...rest, + id: options.shouldReplaceId ? getEdgeId(newConnection) : oldEdgeId, source: newConnection.source, target: newConnection.target, sourceHandle: newConnection.sourceHandle, targetHandle: newConnection.targetHandle, } as Edge; - return edges.filter((e) => e.id !== oldEdge.id).concat(edge); + return edges.filter((e) => e.id !== oldEdgeId).concat(edge); }; export const pointToRendererPoint = (