@@ -20,6 +20,13 @@ interface MoveResult {
20
20
moveProps : HTMLAttributes < HTMLElement >
21
21
}
22
22
23
+ interface EventBase {
24
+ shiftKey : boolean ,
25
+ ctrlKey : boolean ,
26
+ metaKey : boolean ,
27
+ altKey : boolean
28
+ }
29
+
23
30
/**
24
31
* Handles move interactions across mouse, touch, and keyboard, including dragging with
25
32
* the mouse or touch, and using the arrow keys. Normalizes behavior across browsers and
@@ -43,7 +50,7 @@ export function useMove(props: MoveEvents): MoveResult {
43
50
disableTextSelection ( ) ;
44
51
state . current . didMove = false ;
45
52
} ;
46
- let move = ( pointerType : PointerType , deltaX : number , deltaY : number ) => {
53
+ let move = ( originalEvent : EventBase , pointerType : PointerType , deltaX : number , deltaY : number ) => {
47
54
if ( deltaX === 0 && deltaY === 0 ) {
48
55
return ;
49
56
}
@@ -52,36 +59,48 @@ export function useMove(props: MoveEvents): MoveResult {
52
59
state . current . didMove = true ;
53
60
onMoveStart ?.( {
54
61
type : 'movestart' ,
55
- pointerType
62
+ pointerType,
63
+ shiftKey : originalEvent . shiftKey ,
64
+ metaKey : originalEvent . metaKey ,
65
+ ctrlKey : originalEvent . ctrlKey ,
66
+ altKey : originalEvent . altKey
56
67
} ) ;
57
68
}
58
69
onMove ( {
59
70
type : 'move' ,
60
71
pointerType,
61
72
deltaX : deltaX ,
62
- deltaY : deltaY
73
+ deltaY : deltaY ,
74
+ shiftKey : originalEvent . shiftKey ,
75
+ metaKey : originalEvent . metaKey ,
76
+ ctrlKey : originalEvent . ctrlKey ,
77
+ altKey : originalEvent . altKey
63
78
} ) ;
64
79
} ;
65
- let end = ( pointerType : PointerType ) => {
80
+ let end = ( originalEvent : EventBase , pointerType : PointerType ) => {
66
81
restoreTextSelection ( ) ;
67
82
if ( state . current . didMove ) {
68
83
onMoveEnd ?.( {
69
84
type : 'moveend' ,
70
- pointerType
85
+ pointerType,
86
+ shiftKey : originalEvent . shiftKey ,
87
+ metaKey : originalEvent . metaKey ,
88
+ ctrlKey : originalEvent . ctrlKey ,
89
+ altKey : originalEvent . altKey
71
90
} ) ;
72
91
}
73
92
} ;
74
93
75
94
if ( typeof PointerEvent === 'undefined' ) {
76
95
let onMouseMove = ( e : MouseEvent ) => {
77
96
if ( e . button === 0 ) {
78
- move ( 'mouse' , e . pageX - state . current . lastPosition . pageX , e . pageY - state . current . lastPosition . pageY ) ;
97
+ move ( e , 'mouse' , e . pageX - state . current . lastPosition . pageX , e . pageY - state . current . lastPosition . pageY ) ;
79
98
state . current . lastPosition = { pageX : e . pageX , pageY : e . pageY } ;
80
99
}
81
100
} ;
82
101
let onMouseUp = ( e : MouseEvent ) => {
83
102
if ( e . button === 0 ) {
84
- end ( 'mouse' ) ;
103
+ end ( e , 'mouse' ) ;
85
104
removeGlobalListener ( window , 'mousemove' , onMouseMove , false ) ;
86
105
removeGlobalListener ( window , 'mouseup' , onMouseUp , false ) ;
87
106
}
@@ -98,19 +117,17 @@ export function useMove(props: MoveEvents): MoveResult {
98
117
} ;
99
118
100
119
let onTouchMove = ( e : TouchEvent ) => {
101
- // @ts -ignore
102
120
let touch = [ ...e . changedTouches ] . findIndex ( ( { identifier} ) => identifier === state . current . id ) ;
103
121
if ( touch >= 0 ) {
104
122
let { pageX, pageY} = e . changedTouches [ touch ] ;
105
- move ( 'touch' , pageX - state . current . lastPosition . pageX , pageY - state . current . lastPosition . pageY ) ;
123
+ move ( e , 'touch' , pageX - state . current . lastPosition . pageX , pageY - state . current . lastPosition . pageY ) ;
106
124
state . current . lastPosition = { pageX, pageY} ;
107
125
}
108
126
} ;
109
127
let onTouchEnd = ( e : TouchEvent ) => {
110
- // @ts -ignore
111
128
let touch = [ ...e . changedTouches ] . findIndex ( ( { identifier} ) => identifier === state . current . id ) ;
112
129
if ( touch >= 0 ) {
113
- end ( 'touch' ) ;
130
+ end ( e , 'touch' ) ;
114
131
state . current . id = null ;
115
132
removeGlobalListener ( window , 'touchmove' , onTouchMove ) ;
116
133
removeGlobalListener ( window , 'touchend' , onTouchEnd ) ;
@@ -135,22 +152,20 @@ export function useMove(props: MoveEvents): MoveResult {
135
152
} else {
136
153
let onPointerMove = ( e : PointerEvent ) => {
137
154
if ( e . pointerId === state . current . id ) {
138
- // @ts -ignore
139
- let pointerType : PointerType = e . pointerType || 'mouse' ;
155
+ let pointerType = ( e . pointerType || 'mouse' ) as PointerType ;
140
156
141
157
// Problems with PointerEvent#movementX/movementY:
142
158
// 1. it is always 0 on macOS Safari.
143
159
// 2. On Chrome Android, it's scaled by devicePixelRatio, but not on Chrome macOS
144
- move ( pointerType , e . pageX - state . current . lastPosition . pageX , e . pageY - state . current . lastPosition . pageY ) ;
160
+ move ( e , pointerType , e . pageX - state . current . lastPosition . pageX , e . pageY - state . current . lastPosition . pageY ) ;
145
161
state . current . lastPosition = { pageX : e . pageX , pageY : e . pageY } ;
146
162
}
147
163
} ;
148
164
149
165
let onPointerUp = ( e : PointerEvent ) => {
150
166
if ( e . pointerId === state . current . id ) {
151
- // @ts -ignore
152
- let pointerType : PointerType = e . pointerType || 'mouse' ;
153
- end ( pointerType ) ;
167
+ let pointerType = ( e . pointerType || 'mouse' ) as PointerType ;
168
+ end ( e , pointerType ) ;
154
169
state . current . id = null ;
155
170
removeGlobalListener ( window , 'pointermove' , onPointerMove , false ) ;
156
171
removeGlobalListener ( window , 'pointerup' , onPointerUp , false ) ;
@@ -172,41 +187,37 @@ export function useMove(props: MoveEvents): MoveResult {
172
187
} ;
173
188
}
174
189
175
- let triggerKeyboardMove = ( deltaX : number , deltaY : number ) => {
190
+ let triggerKeyboardMove = ( e : EventBase , deltaX : number , deltaY : number ) => {
176
191
start ( ) ;
177
- move ( 'keyboard' , deltaX , deltaY ) ;
178
- end ( 'keyboard' ) ;
192
+ move ( e , 'keyboard' , deltaX , deltaY ) ;
193
+ end ( e , 'keyboard' ) ;
179
194
} ;
180
195
181
196
moveProps . onKeyDown = ( e ) => {
182
- // don't want useMove to handle shift key + arrow events because it doesn't do anything
183
- if ( e . shiftKey ) {
184
- return ;
185
- }
186
197
switch ( e . key ) {
187
198
case 'Left' :
188
199
case 'ArrowLeft' :
189
200
e . preventDefault ( ) ;
190
201
e . stopPropagation ( ) ;
191
- triggerKeyboardMove ( - 1 , 0 ) ;
202
+ triggerKeyboardMove ( e , - 1 , 0 ) ;
192
203
break ;
193
204
case 'Right' :
194
205
case 'ArrowRight' :
195
206
e . preventDefault ( ) ;
196
207
e . stopPropagation ( ) ;
197
- triggerKeyboardMove ( 1 , 0 ) ;
208
+ triggerKeyboardMove ( e , 1 , 0 ) ;
198
209
break ;
199
210
case 'Up' :
200
211
case 'ArrowUp' :
201
212
e . preventDefault ( ) ;
202
213
e . stopPropagation ( ) ;
203
- triggerKeyboardMove ( 0 , - 1 ) ;
214
+ triggerKeyboardMove ( e , 0 , - 1 ) ;
204
215
break ;
205
216
case 'Down' :
206
217
case 'ArrowDown' :
207
218
e . preventDefault ( ) ;
208
219
e . stopPropagation ( ) ;
209
- triggerKeyboardMove ( 0 , 1 ) ;
220
+ triggerKeyboardMove ( e , 0 , 1 ) ;
210
221
break ;
211
222
}
212
223
} ;
0 commit comments