Parcourir la source

deal with mid-dragging destroy better

Adam Shaw il y a 6 ans
Parent
commit
daf01c8dc6

+ 10 - 3
packages/interaction/src/dnd/FeaturefulElementDragging.ts

@@ -43,6 +43,10 @@ export default class FeaturefulElementDragging extends ElementDragging {
 
   destroy() {
     this.pointer.destroy()
+
+    // HACK: simulate a pointer-up to end the current drag
+    // TODO: fire 'dragend' directly and stop interaction. discourage use of pointerup event (b/c might not fire)
+    this.onPointerUp({} as any)
   }
 
   onPointerDown = (ev: PointerDragEvent) => {
@@ -64,7 +68,10 @@ export default class FeaturefulElementDragging extends ElementDragging {
 
       this.emitter.trigger('pointerdown', ev)
 
-      if (!this.pointer.shouldIgnoreMove) {
+      if (
+        this.isInteracting && // not destroyed via pointerdown handler
+        !this.pointer.shouldIgnoreMove
+      ) {
         // actions related to initiating dragstart+dragmove+dragend...
 
         this.mirror.setIsVisible(false) // reset. caller must set-visible
@@ -80,7 +87,7 @@ export default class FeaturefulElementDragging extends ElementDragging {
   }
 
   onPointerMove = (ev: PointerDragEvent) => {
-    if (this.isInteracting) { // if false, still waiting for previous drag's revert
+    if (this.isInteracting) {
 
       this.emitter.trigger('pointermove', ev)
 
@@ -109,7 +116,7 @@ export default class FeaturefulElementDragging extends ElementDragging {
   }
 
   onPointerUp = (ev: PointerDragEvent) => {
-    if (this.isInteracting) { // if false, still waiting for previous drag's revert
+    if (this.isInteracting) {
       this.isInteracting = false
 
       allowSelection(document.body)

+ 4 - 1
packages/interaction/src/interactions/HitDragging.ts

@@ -164,7 +164,10 @@ export default class HitDragging {
       let component = droppableStore[id].component
       let offsetTracker = offsetTrackers[id]
 
-      if (offsetTracker.isWithinClipping(offsetLeft, offsetTop)) {
+      if (
+        offsetTracker && // wasn't destroyed mid-drag
+        offsetTracker.isWithinClipping(offsetLeft, offsetTop)
+      ) {
         let originLeft = offsetTracker.computeLeft()
         let originTop = offsetTracker.computeTop()
         let positionLeft = offsetLeft - originLeft