diff --git a/packages/element/src/linearElementEditor.ts b/packages/element/src/linearElementEditor.ts index 3f666c412c..26e59a98ac 100644 --- a/packages/element/src/linearElementEditor.ts +++ b/packages/element/src/linearElementEditor.ts @@ -1040,10 +1040,12 @@ export class LinearElementEditor { if (lastPoint === lastUncommittedPoint) { LinearElementEditor.deletePoints(element, app, [points.length - 1]); } - return { - ...appState.editingLinearElement, - lastUncommittedPoint: null, - }; + return appState.editingLinearElement.lastUncommittedPoint + ? { + ...appState.editingLinearElement, + lastUncommittedPoint: null, + } + : appState.editingLinearElement; } let newPoint: LocalPoint; diff --git a/packages/element/tests/linearElementEditor.test.tsx b/packages/element/tests/linearElementEditor.test.tsx index 4b957022c6..a442afe6b5 100644 --- a/packages/element/tests/linearElementEditor.test.tsx +++ b/packages/element/tests/linearElementEditor.test.tsx @@ -367,7 +367,7 @@ describe("Test Linear Elements", () => { // drag line from midpoint drag(midpoint, pointFrom(midpoint[0] + delta, midpoint[1] + delta)); expect(renderInteractiveScene.mock.calls.length).toMatchInlineSnapshot( - `12`, + `11`, ); expect(renderStaticScene.mock.calls.length).toMatchInlineSnapshot(`6`); @@ -469,7 +469,7 @@ describe("Test Linear Elements", () => { drag(startPoint, endPoint); expect(renderInteractiveScene.mock.calls.length).toMatchInlineSnapshot( - `12`, + `11`, ); expect(renderStaticScene.mock.calls.length).toMatchInlineSnapshot(`7`); @@ -537,7 +537,7 @@ describe("Test Linear Elements", () => { ); expect(renderInteractiveScene.mock.calls.length).toMatchInlineSnapshot( - `16`, + `14`, ); expect(renderStaticScene.mock.calls.length).toMatchInlineSnapshot(`7`); @@ -588,7 +588,7 @@ describe("Test Linear Elements", () => { drag(hitCoords, pointFrom(hitCoords[0] - delta, hitCoords[1] - delta)); expect(renderInteractiveScene.mock.calls.length).toMatchInlineSnapshot( - `12`, + `11`, ); expect(renderStaticScene.mock.calls.length).toMatchInlineSnapshot(`6`); @@ -629,7 +629,7 @@ describe("Test Linear Elements", () => { drag(hitCoords, pointFrom(hitCoords[0] + delta, hitCoords[1] + delta)); expect(renderInteractiveScene.mock.calls.length).toMatchInlineSnapshot( - `12`, + `11`, ); expect(renderStaticScene.mock.calls.length).toMatchInlineSnapshot(`6`); @@ -677,7 +677,7 @@ describe("Test Linear Elements", () => { deletePoint(points[2]); expect(line.points.length).toEqual(3); expect(renderInteractiveScene.mock.calls.length).toMatchInlineSnapshot( - `18`, + `17`, ); expect(renderStaticScene.mock.calls.length).toMatchInlineSnapshot(`7`); @@ -735,7 +735,7 @@ describe("Test Linear Elements", () => { ), ); expect(renderInteractiveScene.mock.calls.length).toMatchInlineSnapshot( - `16`, + `14`, ); expect(renderStaticScene.mock.calls.length).toMatchInlineSnapshot(`7`); expect(line.points.length).toEqual(5); @@ -833,7 +833,7 @@ describe("Test Linear Elements", () => { drag(hitCoords, pointFrom(hitCoords[0] + delta, hitCoords[1] + delta)); expect(renderInteractiveScene.mock.calls.length).toMatchInlineSnapshot( - `12`, + `11`, ); expect(renderStaticScene.mock.calls.length).toMatchInlineSnapshot(`6`); diff --git a/packages/excalidraw/actions/actionDeleteSelected.tsx b/packages/excalidraw/actions/actionDeleteSelected.tsx index 20d7d129fd..c0e43d3dc1 100644 --- a/packages/excalidraw/actions/actionDeleteSelected.tsx +++ b/packages/excalidraw/actions/actionDeleteSelected.tsx @@ -225,8 +225,11 @@ export const actionDeleteSelected = register({ return false; } - // case: deleting last remaining point - if (element.points.length < 2) { + // case: deleting all points + if ( + element.points.length < 2 || + selectedPointsIndices.length === element.points.length + ) { const nextElements = elements.map((el) => { if (el.id === element.id) { return newElementWith(el, { isDeleted: true }); diff --git a/packages/excalidraw/components/App.tsx b/packages/excalidraw/components/App.tsx index 8bb76af45e..a7b6718f59 100644 --- a/packages/excalidraw/components/App.tsx +++ b/packages/excalidraw/components/App.tsx @@ -5868,6 +5868,9 @@ class App extends React.Component { scenePointerY, this, ); + const linearElement = editingLinearElement + ? this.scene.getElement(editingLinearElement.elementId) + : null; if ( editingLinearElement && @@ -5882,16 +5885,17 @@ class App extends React.Component { }); }); } - if (editingLinearElement?.lastUncommittedPoint != null) { + if ( + editingLinearElement?.lastUncommittedPoint != null && + linearElement && + isBindingElementType(linearElement.type) + ) { this.maybeSuggestBindingAtCursor( scenePointer, editingLinearElement.elbowed, ); - } else { - // causes stack overflow if not sync - flushSync(() => { - this.setState({ suggestedBindings: [] }); - }); + } else if (this.state.suggestedBindings.length) { + this.setState({ suggestedBindings: [] }); } } @@ -6155,15 +6159,6 @@ class App extends React.Component { setCursor(this.interactiveCanvas, CURSOR_TYPE.AUTO); } else if (isOverScrollBar) { setCursor(this.interactiveCanvas, CURSOR_TYPE.AUTO); - } else if ( - this.state.selectedLinearElement && - hitElement?.id === this.state.selectedLinearElement.elementId - ) { - this.handleHoverSelectedLinearElement( - this.state.selectedLinearElement, - scenePointerX, - scenePointerY, - ); } else if ( // if using cmd/ctrl, we're not dragging !event[KEYS.CTRL_OR_CMD] @@ -6205,6 +6200,14 @@ class App extends React.Component { } else { setCursor(this.interactiveCanvas, CURSOR_TYPE.AUTO); } + + if (this.state.selectedLinearElement) { + this.handleHoverSelectedLinearElement( + this.state.selectedLinearElement, + scenePointerX, + scenePointerY, + ); + } } if (this.state.openDialog?.name === "elementLinkSelector" && hitElement) {