From 7a923bec4aafa56cfd94c71216ed9722d4b9d9cc Mon Sep 17 00:00:00 2001 From: moklick Date: Mon, 23 Sep 2024 16:27:41 +0200 Subject: [PATCH] fix(xydrag): handle deleted nodes while dragging #4677 --- packages/system/src/xydrag/XYDrag.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/system/src/xydrag/XYDrag.ts b/packages/system/src/xydrag/XYDrag.ts index c4c5600f..688d3e09 100644 --- a/packages/system/src/xydrag/XYDrag.ts +++ b/packages/system/src/xydrag/XYDrag.ts @@ -139,6 +139,12 @@ export function XYDrag voi } for (const [id, dragItem] of dragItems) { + if (!nodeLookup.has(id)) { + // if the node is not in the nodeLookup anymore, it was probably deleted while dragging + // and we don't need to update it anymore + continue; + } + let nextPosition = { x: x - dragItem.distance.x, y: y - dragItem.distance.y }; if (snapToGrid) { nextPosition = snapPosition(nextPosition, snapGrid); @@ -288,10 +294,14 @@ export function XYDrag voi mousePosition = getEventPosition(event.sourceEvent, containerBounds!); }) .on('drag', (event: UseDragEvent) => { - const { autoPanOnNodeDrag, transform, snapGrid, snapToGrid, nodeDragThreshold } = getStoreItems(); + const { autoPanOnNodeDrag, transform, snapGrid, snapToGrid, nodeDragThreshold, nodeLookup } = getStoreItems(); const pointerPos = getPointerPosition(event.sourceEvent, { transform, snapGrid, snapToGrid }); - if (event.sourceEvent.type === 'touchmove' && event.sourceEvent.touches.length > 1) { + if ( + (event.sourceEvent.type === 'touchmove' && event.sourceEvent.touches.length > 1) || + // if user deletes a node while dragging, we need to abort the drag to prevent errors + (nodeId && !nodeLookup.has(nodeId)) + ) { abortDrag = true; }