|
1 |
| -import {closest, distance} from 'shared/utils'; |
| 1 | +import {closest, distance as euclideanDistance} from 'shared/utils'; |
2 | 2 | import Sensor from '../Sensor';
|
3 | 3 | import {DragStartSensorEvent, DragMoveSensorEvent, DragStopSensorEvent} from '../SensorEvent';
|
4 | 4 |
|
@@ -63,28 +63,27 @@ export default class MouseSensor extends Sensor {
|
63 | 63 | if (event.button !== 0 || event.ctrlKey || event.metaKey) {
|
64 | 64 | return;
|
65 | 65 | }
|
66 |
| - |
67 |
| - this.startEvent = event; |
68 |
| - |
69 |
| - document.addEventListener('mouseup', this[onMouseUp]); |
70 |
| - document.addEventListener('mousemove', this[onDistanceChange]); |
71 |
| - |
72 | 66 | const container = closest(event.target, this.containers);
|
73 | 67 |
|
74 | 68 | if (!container) {
|
75 | 69 | return;
|
76 | 70 | }
|
77 | 71 |
|
78 |
| - document.addEventListener('dragstart', preventNativeDragStart); |
| 72 | + const {delay = 0} = this.options; |
| 73 | + const {pageX, pageY} = event; |
| 74 | + |
| 75 | + Object.assign(this, {pageX, pageY}); |
| 76 | + this.onMouseDownAt = Date.now(); |
| 77 | + this.startEvent = event; |
79 | 78 |
|
80 | 79 | this.currentContainer = container;
|
81 |
| - this.mouseDownTimeout = setTimeout(() => { |
82 |
| - this.delayOver = true; |
83 |
| - if (this.distance < this.options.distance) { |
84 |
| - return; |
85 |
| - } |
86 |
| - this[startDrag](); |
87 |
| - }, this.options.delay); |
| 80 | + document.addEventListener('mouseup', this[onMouseUp]); |
| 81 | + document.addEventListener('dragstart', preventNativeDragStart); |
| 82 | + document.addEventListener('mousemove', this[onDistanceChange]); |
| 83 | + |
| 84 | + this.mouseDownTimeout = window.setTimeout(() => { |
| 85 | + this[onDistanceChange]({pageX: this.pageX, pageY: this.pageY}); |
| 86 | + }, delay); |
88 | 87 | }
|
89 | 88 |
|
90 | 89 | /**
|
@@ -114,15 +113,28 @@ export default class MouseSensor extends Sensor {
|
114 | 113 | }
|
115 | 114 |
|
116 | 115 | /**
|
117 |
| - * Detect change in distance |
| 116 | + * Detect change in distance, starting drag when both |
| 117 | + * delay and distance requirements are met |
118 | 118 | * @private
|
119 | 119 | * @param {Event} event - Mouse move event
|
120 | 120 | */
|
121 | 121 | [onDistanceChange](event) {
|
122 |
| - if (this.dragging) return; |
123 |
| - this.distance = distance(this.startEvent.pageX, this.startEvent.pageY, event.pageX, event.pageY); |
| 122 | + const {pageX, pageY} = event; |
| 123 | + const {delay, distance} = this.options; |
| 124 | + const {startEvent} = this; |
| 125 | + |
| 126 | + Object.assign(this, {pageX, pageY}); |
| 127 | + |
| 128 | + if (!this.currentContainer) { |
| 129 | + return; |
| 130 | + } |
| 131 | + |
| 132 | + const timeElapsed = Date.now() - this.onMouseDownAt; |
| 133 | + const distanceTravelled = euclideanDistance(startEvent.pageX, startEvent.pageY, pageX, pageY) || 0; |
124 | 134 |
|
125 |
| - if (this.delayOver && this.distance >= this.options.distance) { |
| 135 | + if (timeElapsed >= delay && distanceTravelled >= distance) { |
| 136 | + window.clearTimeout(this.mouseDownTimeout); |
| 137 | + document.removeEventListener('mousemove', this[onDistanceChange]); |
126 | 138 | this[startDrag]();
|
127 | 139 | }
|
128 | 140 | }
|
@@ -187,8 +199,6 @@ export default class MouseSensor extends Sensor {
|
187 | 199 |
|
188 | 200 | this.currentContainer = null;
|
189 | 201 | this.dragging = false;
|
190 |
| - this.distance = 0; |
191 |
| - this.delayOver = false; |
192 | 202 | this.startEvent = null;
|
193 | 203 | }
|
194 | 204 |
|
|
0 commit comments