1
- /**
2
- * WordPress dependencies
3
- */
4
- import { useRef } from '@wordpress/element' ;
5
-
6
1
/**
7
2
* Internal dependencies
8
3
*/
9
4
import useRefEffect from '../use-ref-effect' ;
10
-
11
- /* eslint-disable jsdoc/valid-types */
12
- /**
13
- * @template T
14
- * @param {T } value
15
- * @return {import('react').MutableRefObject<T|null> } A ref with the value.
16
- */
17
- function useFreshRef ( value ) {
18
- /* eslint-enable jsdoc/valid-types */
19
- /* eslint-disable jsdoc/no-undefined-types */
20
- /** @type {import('react').MutableRefObject<T> } */
21
- /* eslint-enable jsdoc/no-undefined-types */
22
- // Disable reason: We're doing something pretty JavaScript-y here where the
23
- // ref will always have a current value that is not null or undefined but it
24
- // needs to start as undefined. We don't want to change the return type so
25
- // it's easier to just ts-ignore this specific line that's complaining about
26
- // undefined not being part of T.
27
- // @ts -ignore
28
- const ref = useRef ( ) ;
29
- ref . current = value ;
30
- return ref ;
31
- }
5
+ import useEvent from '../use-event' ;
32
6
33
7
/**
34
8
* A hook to facilitate drag and drop handling.
@@ -55,12 +29,12 @@ export default function useDropZone( {
55
29
onDragEnd : _onDragEnd ,
56
30
onDragOver : _onDragOver ,
57
31
} ) {
58
- const onDropRef = useFreshRef ( _onDrop ) ;
59
- const onDragStartRef = useFreshRef ( _onDragStart ) ;
60
- const onDragEnterRef = useFreshRef ( _onDragEnter ) ;
61
- const onDragLeaveRef = useFreshRef ( _onDragLeave ) ;
62
- const onDragEndRef = useFreshRef ( _onDragEnd ) ;
63
- const onDragOverRef = useFreshRef ( _onDragOver ) ;
32
+ const onDropEvent = useEvent ( _onDrop ) ;
33
+ const onDragStartEvent = useEvent ( _onDragStart ) ;
34
+ const onDragEnterEvent = useEvent ( _onDragEnter ) ;
35
+ const onDragLeaveEvent = useEvent ( _onDragLeave ) ;
36
+ const onDragEndEvent = useEvent ( _onDragEnd ) ;
37
+ const onDragOverEvent = useEvent ( _onDragOver ) ;
64
38
65
39
return useRefEffect (
66
40
( elem ) => {
@@ -122,8 +96,8 @@ export default function useDropZone( {
122
96
ownerDocument . addEventListener ( 'dragend' , maybeDragEnd ) ;
123
97
ownerDocument . addEventListener ( 'mousemove' , maybeDragEnd ) ;
124
98
125
- if ( onDragStartRef . current ) {
126
- onDragStartRef . current ( event ) ;
99
+ if ( _onDragStart ) {
100
+ onDragStartEvent ( event ) ;
127
101
}
128
102
}
129
103
@@ -142,15 +116,15 @@ export default function useDropZone( {
142
116
return ;
143
117
}
144
118
145
- if ( onDragEnterRef . current ) {
146
- onDragEnterRef . current ( event ) ;
119
+ if ( _onDragEnter ) {
120
+ onDragEnterEvent ( event ) ;
147
121
}
148
122
}
149
123
150
124
function onDragOver ( /** @type {DragEvent } */ event ) {
151
125
// Only call onDragOver for the innermost hovered drop zones.
152
- if ( ! event . defaultPrevented && onDragOverRef . current ) {
153
- onDragOverRef . current ( event ) ;
126
+ if ( ! event . defaultPrevented && _onDragOver ) {
127
+ onDragOverEvent ( event ) ;
154
128
}
155
129
156
130
// Prevent the browser default while also signalling to parent
@@ -171,8 +145,8 @@ export default function useDropZone( {
171
145
return ;
172
146
}
173
147
174
- if ( onDragLeaveRef . current ) {
175
- onDragLeaveRef . current ( event ) ;
148
+ if ( _onDragLeave ) {
149
+ onDragLeaveEvent ( event ) ;
176
150
}
177
151
}
178
152
@@ -192,8 +166,8 @@ export default function useDropZone( {
192
166
// eslint-disable-next-line no-unused-expressions
193
167
event . dataTransfer && event . dataTransfer . files . length ;
194
168
195
- if ( onDropRef . current ) {
196
- onDropRef . current ( event ) ;
169
+ if ( _onDrop ) {
170
+ onDropEvent ( event ) ;
197
171
}
198
172
199
173
maybeDragEnd ( event ) ;
@@ -209,12 +183,12 @@ export default function useDropZone( {
209
183
ownerDocument . removeEventListener ( 'dragend' , maybeDragEnd ) ;
210
184
ownerDocument . removeEventListener ( 'mousemove' , maybeDragEnd ) ;
211
185
212
- if ( onDragEndRef . current ) {
213
- onDragEndRef . current ( event ) ;
186
+ if ( _onDragEnd ) {
187
+ onDragEndEvent ( event ) ;
214
188
}
215
189
}
216
190
217
- element . dataset . isDropZone = 'true' ;
191
+ element . setAttribute ( 'data-is-drop-zone' , 'true' ) ;
218
192
element . addEventListener ( 'drop' , onDrop ) ;
219
193
element . addEventListener ( 'dragenter' , onDragEnter ) ;
220
194
element . addEventListener ( 'dragover' , onDragOver ) ;
@@ -224,7 +198,7 @@ export default function useDropZone( {
224
198
ownerDocument . addEventListener ( 'dragenter' , maybeDragStart ) ;
225
199
226
200
return ( ) => {
227
- delete element . dataset . isDropZone ;
201
+ element . removeAttribute ( 'data-is-drop-zone' ) ;
228
202
element . removeEventListener ( 'drop' , onDrop ) ;
229
203
element . removeEventListener ( 'dragenter' , onDragEnter ) ;
230
204
element . removeEventListener ( 'dragover' , onDragOver ) ;
0 commit comments