From ac555cd6c616e1aa1def42e0905fbcda8a0e9758 Mon Sep 17 00:00:00 2001 From: Steve Ruiz Date: Sat, 16 Oct 2021 23:17:41 +0100 Subject: [PATCH] Fix bug on arrow --- .../sessions/arrow/arrow.session.spec.ts | 24 +++++++++++++++++++ .../session/sessions/arrow/arrow.session.ts | 10 ++++---- packages/tldraw/src/state/tlstate.ts | 6 ++--- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/packages/tldraw/src/state/session/sessions/arrow/arrow.session.spec.ts b/packages/tldraw/src/state/session/sessions/arrow/arrow.session.spec.ts index 75f1968cd..4259a9e70 100644 --- a/packages/tldraw/src/state/session/sessions/arrow/arrow.session.spec.ts +++ b/packages/tldraw/src/state/session/sessions/arrow/arrow.session.spec.ts @@ -169,6 +169,30 @@ describe('When creating with an arrow session', () => { expect(tlstate.getShape('arrow1')).toBe(undefined) }) + it("Doesn't corrupt a shape after undoing", () => { + const tlstate = new TLDrawState() + .createShapes( + { type: TLDrawShapeType.Rectangle, id: 'rect1', point: [200, 200], size: [200, 200] }, + { type: TLDrawShapeType.Rectangle, id: 'rect2', point: [400, 200], size: [200, 200] }, + { type: TLDrawShapeType.Arrow, id: 'arrow1', point: [450, 250] } + ) + .select('arrow1') + .startSession(SessionType.Arrow, [250, 250], 'start', true) + .updateSession([55, 45]) + .completeSession() + + expect(tlstate.bindings.length).toBe(2) + + tlstate + .undo() + .select('rect1') + .startSession(SessionType.Translate, [250, 250]) + .updateSession([275, 275]) + .completeSession() + + expect(tlstate.bindings.length).toBe(0) + }) + it('Creates a start binding if possible', () => { const tlstate = new TLDrawState() .createShapes( diff --git a/packages/tldraw/src/state/session/sessions/arrow/arrow.session.ts b/packages/tldraw/src/state/session/sessions/arrow/arrow.session.ts index a9c5063d6..29907ad98 100644 --- a/packages/tldraw/src/state/session/sessions/arrow/arrow.session.ts +++ b/packages/tldraw/src/state/session/sessions/arrow/arrow.session.ts @@ -345,12 +345,12 @@ export class ArrowSession implements Session { const afterBindings: Partial> = {} - const afterShape = page.shapes[initialShape.id] as ArrowShape + let afterShape = page.shapes[initialShape.id] as ArrowShape const currentBindingId = afterShape.handles[handleId].bindingId if (initialBinding) { - beforeBindings[initialBinding.id] = initialBinding + beforeBindings[initialBinding.id] = this.isCreate ? undefined : initialBinding afterBindings[initialBinding.id] = undefined } @@ -364,6 +364,8 @@ export class ArrowSession implements Session { afterBindings[newStartBindingId] = page.bindings[newStartBindingId] } + afterShape = TLDR.onSessionComplete(afterShape) + return { id: 'arrow', before: { @@ -373,7 +375,7 @@ export class ArrowSession implements Session { shapes: { [initialShape.id]: this.isCreate ? undefined : initialShape, }, - bindings: this.isCreate ? {} : beforeBindings, + bindings: beforeBindings, }, }, pageStates: { @@ -391,7 +393,7 @@ export class ArrowSession implements Session { pages: { [data.appState.currentPageId]: { shapes: { - [initialShape.id]: TLDR.onSessionComplete(afterShape), + [initialShape.id]: afterShape, }, bindings: afterBindings, }, diff --git a/packages/tldraw/src/state/tlstate.ts b/packages/tldraw/src/state/tlstate.ts index caf5bdf5a..c0be0e7a8 100644 --- a/packages/tldraw/src/state/tlstate.ts +++ b/packages/tldraw/src/state/tlstate.ts @@ -213,10 +213,10 @@ export class TLDrawState extends StateManager { const toUtils = TLDR.getShapeUtils(toShape) - // We only need to update the binding's "from" shape - const util = TLDR.getShapeUtils(fromShape) + const fromUtils = TLDR.getShapeUtils(fromShape) - const fromDelta = util.onBindingChange( + // We only need to update the binding's "from" shape + const fromDelta = fromUtils.onBindingChange( fromShape, binding, toShape,