Skip to content

Commit 9b12e77

Browse files
authored
Update useDropZone.ts
Добавил controller для возможности аборта сразу всех слушателей, убрал у функции параметр type, так-как есть event.type, убрал вложенную проверку if (counterRef.current !== 0) и переместил ее в основное условие, так-как dragleave всегда должен вычитать counter.
1 parent f16597c commit 9b12e77

1 file changed

Lines changed: 14 additions & 21 deletions

File tree

packages/core/src/hooks/useDropZone/useDropZone.ts

Lines changed: 14 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,11 @@ export const useDropZone = ((...params: any[]) => {
155155
const element = target ? isTarget.getElement(target) : internalRef.current;
156156

157157
if (!element) return;
158-
159-
const onEvent = (event: DragEvent, type: 'drop' | 'enter' | 'leave' | 'over') => {
158+
159+
const controller = new AbortController();
160+
const options = { signal: controller.signal };
161+
162+
const onEvent = (event: DragEvent) => {
160163
if (!event.dataTransfer) return;
161164

162165
const isValid = checkValidity(event.dataTransfer.items);
@@ -170,47 +173,37 @@ export const useDropZone = ((...params: any[]) => {
170173

171174
const currentFiles = getFiles(event);
172175

173-
if (type === 'drop') {
176+
if (event.type === 'drop') {
174177
counterRef.current = 0;
175178
setOvered(false);
176179
setFiles(currentFiles);
177180
options.onDrop?.(currentFiles, event);
178181
return;
179182
}
180183

181-
if (type === 'enter') {
184+
if (event.type === 'dragenter') {
182185
counterRef.current += 1;
183186
setOvered(true);
184187
options.onEnter?.(event);
185188
return;
186189
}
187190

188-
if (type === 'leave') {
189-
counterRef.current -= 1;
190-
if (counterRef.current !== 0) return;
191+
if (event.type === 'dragleave' && (counterRef.current -= 1) === 0) {
191192
setOvered(false);
192193
options.onLeave?.(event);
193194
return;
194195
}
195196

196-
if (type === 'over') options.onOver?.(event);
197+
if (event.type === 'dragover') options.onOver?.(event);
197198
};
198199

199-
const onDrop = ((event: DragEvent) => onEvent(event, 'drop')) as EventListener;
200-
const onDragOver = ((event: DragEvent) => onEvent(event, 'over')) as EventListener;
201-
const onDragEnter = ((event: DragEvent) => onEvent(event, 'enter')) as EventListener;
202-
const onDragLeave = ((event: DragEvent) => onEvent(event, 'leave')) as EventListener;
203-
204-
element.addEventListener('dragenter', onDragEnter);
205-
element.addEventListener('dragover', onDragOver);
206-
element.addEventListener('dragleave', onDragLeave);
207-
element.addEventListener('drop', onDrop);
200+
element.addEventListener('dragenter', onEvent, options);
201+
element.addEventListener('dragover', onEvent, options);
202+
element.addEventListener('dragleave', onEvent, options);
203+
element.addEventListener('drop', onEvent, options);
208204

209205
return () => {
210-
element.removeEventListener('dragenter', onDragEnter);
211-
element.removeEventListener('dragover', onDragOver);
212-
element.removeEventListener('dragleave', onDragLeave);
213-
element.removeEventListener('drop', onDrop);
206+
controller.abort();
214207
};
215208
}, [target, internalRef.current]);
216209

0 commit comments

Comments
 (0)