-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathonDragDrop.js
99 lines (72 loc) · 2.42 KB
/
onDragDrop.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import { onPointerDown } from "./onPointerDown.js";
import { onPointerMove } from "./onPointerMove.js";
import { onPointerUp } from "./onPointerUp.js";
import { onMouseLeave } from "./onMouseLeave.js";
import { onClick } from "./onClick.js";
import { now } from "./now.js";
export function onDragDrop(element, fn, { outsideElement = document } = {}) {
let dragged = false;
let dragging = false;
let startX = 0;
let startY = 0;
let currentX = 0;
let currentY = 0;
let deltaX = 0;
let deltaY = 0;
let startTime = 0;
let offPointerMove = onPointerMove(outsideElement, (moveEvent) => {
if (!dragging) return;
moveEvent.preventDefault();
const isTouchMove = moveEvent.touches && moveEvent.touches.length > 0;
dragged = true;
currentX = isTouchMove ? moveEvent.touches[0].clientX : moveEvent.clientX;
currentY = isTouchMove ? moveEvent.touches[0].clientY : moveEvent.clientY;
deltaX = currentX - startX;
deltaY = currentY - startY;
trigger();
}, { passive: true });
let offPointerDown = onPointerDown(element, (downEvent) => {
const isTouchDown = downEvent.touches && downEvent.touches.length > 0;
startX = isTouchDown ? downEvent.touches[0].clientX : downEvent.clientX;
startY = isTouchDown ? downEvent.touches[0].clientY : downEvent.clientY;
startTime = now();
currentX = startX;
currentY = startY;
deltaX = 0;
deltaY = 0;
dragging = true;
trigger();
});
let offClick = onClick(element, (event) => {
let deltaTime = now() - startTime;
if (deltaTime > 150) {
event.preventDefault();
event.stopPropagation();
}
});
let offMouseLeave = onMouseLeave(element, (event) => {
dragging = false;
trigger();
});
let offPointerUp = onPointerUp(outsideElement, (event) => {
if (dragging) {
dragging = false;
trigger();
}
})
function trigger() {
fn({ dragged, dragging, deltaX, deltaY, startX, startY, currentX, currentY });
}
return () => {
offPointerDown();
offPointerDown = null;
offPointerMove();
offPointerMove = null;
offPointerUp();
offPointerUp = null;
offMouseLeave();
offMouseLeave = null;
offClick();
offClick = null;
};
}