react-dropzone 11.5.3 → 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +1 -3
- package/.eslintrc +2 -4
- package/.husky/commit-msg +5 -0
- package/.husky/pre-commit +5 -0
- package/.nvmrc +1 -1
- package/README.md +78 -29
- package/commitlint.config.js +1 -1
- package/dist/es/index.js +195 -151
- package/dist/es/utils/index.js +53 -17
- package/dist/index.js +16 -2
- package/examples/events/README.md +3 -1
- package/examples/no-jsx/README.md +32 -0
- package/package.json +80 -76
- package/rollup.config.js +22 -19
- package/src/.eslintrc +7 -4
- package/src/__snapshots__/index.spec.js.snap +1 -1
- package/src/index.js +372 -288
- package/src/index.spec.js +1837 -1369
- package/src/utils/index.js +117 -56
- package/src/utils/index.spec.js +414 -254
- package/styleguide.config.js +57 -50
- package/testSetup.js +1 -1
- package/typings/.eslintrc +28 -0
- package/typings/react-dropzone.d.ts +24 -14
- package/typings/tests/accept.tsx +10 -9
- package/typings/tests/all.tsx +6 -5
- package/typings/tests/basic.tsx +8 -7
- package/typings/tests/events.tsx +8 -6
- package/typings/tests/file-dialog.tsx +4 -3
- package/typings/tests/hook.tsx +6 -6
- package/typings/tests/plugin.tsx +11 -22
- package/typings/tests/refs.tsx +4 -4
- package/tslint.json +0 -101
package/dist/es/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var _excluded = ["children"],
|
|
2
2
|
_excluded2 = ["open"],
|
|
3
|
-
_excluded3 = ["refKey", "onKeyDown", "onFocus", "onBlur", "onClick", "onDragEnter", "onDragOver", "onDragLeave", "onDrop"],
|
|
3
|
+
_excluded3 = ["refKey", "role", "onKeyDown", "onFocus", "onBlur", "onClick", "onDragEnter", "onDragOver", "onDragLeave", "onDrop"],
|
|
4
4
|
_excluded4 = ["refKey", "onChange", "onClick"];
|
|
5
5
|
|
|
6
6
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
@@ -23,9 +23,9 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
|
|
|
23
23
|
|
|
24
24
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
25
25
|
|
|
26
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object);
|
|
26
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
27
27
|
|
|
28
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]
|
|
28
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
29
29
|
|
|
30
30
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
31
31
|
|
|
@@ -34,10 +34,10 @@ function _objectWithoutProperties(source, excluded) { if (source == null) return
|
|
|
34
34
|
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
35
35
|
|
|
36
36
|
/* eslint prefer-template: 0 */
|
|
37
|
-
import React, { forwardRef, Fragment, useCallback, useEffect, useImperativeHandle, useMemo, useReducer, useRef } from
|
|
38
|
-
import PropTypes from
|
|
39
|
-
import { fromEvent } from
|
|
40
|
-
import { allFilesAccepted, composeEventHandlers, fileAccepted, fileMatchSize, isEvtWithFiles, isIeOrEdge, isPropagationStopped, onDocumentDragOver, TOO_MANY_FILES_REJECTION } from
|
|
37
|
+
import React, { forwardRef, Fragment, useCallback, useEffect, useImperativeHandle, useMemo, useReducer, useRef } from "react";
|
|
38
|
+
import PropTypes from "prop-types";
|
|
39
|
+
import { fromEvent } from "file-selector";
|
|
40
|
+
import { allFilesAccepted, composeEventHandlers, fileAccepted, fileMatchSize, filePickerOptionsTypes, canUseFileSystemAccessAPI, isEvtWithFiles, isIeOrEdge, isPropagationStopped, onDocumentDragOver, TOO_MANY_FILES_REJECTION } from "./utils/index";
|
|
41
41
|
/**
|
|
42
42
|
* Convenience wrapper component for the `useDropzone` hook
|
|
43
43
|
*
|
|
@@ -71,7 +71,7 @@ var Dropzone = /*#__PURE__*/forwardRef(function (_ref, ref) {
|
|
|
71
71
|
open: open
|
|
72
72
|
})));
|
|
73
73
|
});
|
|
74
|
-
Dropzone.displayName =
|
|
74
|
+
Dropzone.displayName = "Dropzone"; // Add default props for react-docgen
|
|
75
75
|
|
|
76
76
|
var defaultProps = {
|
|
77
77
|
disabled: false,
|
|
@@ -85,7 +85,8 @@ var defaultProps = {
|
|
|
85
85
|
noKeyboard: false,
|
|
86
86
|
noDrag: false,
|
|
87
87
|
noDragEventsBubbling: false,
|
|
88
|
-
validator: null
|
|
88
|
+
validator: null,
|
|
89
|
+
useFsAccessApi: true
|
|
89
90
|
};
|
|
90
91
|
Dropzone.defaultProps = defaultProps;
|
|
91
92
|
Dropzone.propTypes = {
|
|
@@ -186,6 +187,12 @@ Dropzone.propTypes = {
|
|
|
186
187
|
*/
|
|
187
188
|
onFileDialogOpen: PropTypes.func,
|
|
188
189
|
|
|
190
|
+
/**
|
|
191
|
+
* Set to true to use the https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API
|
|
192
|
+
* to open the file picker instead of using an `<input type="file">` click event.
|
|
193
|
+
*/
|
|
194
|
+
useFsAccessApi: PropTypes.bool,
|
|
195
|
+
|
|
189
196
|
/**
|
|
190
197
|
* Cb for when the `dragenter` event occurs.
|
|
191
198
|
*
|
|
@@ -379,6 +386,8 @@ var initialState = {
|
|
|
379
386
|
* @param {boolean} [props.disabled=false] Enable/disable the dropzone
|
|
380
387
|
* @param {getFilesFromEvent} [props.getFilesFromEvent] Use this to provide a custom file aggregator
|
|
381
388
|
* @param {Function} [props.onFileDialogCancel] Cb for when closing the file dialog with no selection
|
|
389
|
+
* @param {boolean} [props.useFsAccessApi] Set to true to use the https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API
|
|
390
|
+
* to open the file picker instead of using an `<input type="file">` click event.
|
|
382
391
|
* @param {Function} [props.onFileDialogOpen] Cb for when opening the file dialog
|
|
383
392
|
* @param {dragCb} [props.onDragEnter] Cb for when the `dragenter` event occurs.
|
|
384
393
|
* @param {dragCb} [props.onDragLeave] Cb for when the `dragleave` event occurs
|
|
@@ -432,6 +441,7 @@ export function useDropzone() {
|
|
|
432
441
|
onDropRejected = _defaultProps$options.onDropRejected,
|
|
433
442
|
onFileDialogCancel = _defaultProps$options.onFileDialogCancel,
|
|
434
443
|
onFileDialogOpen = _defaultProps$options.onFileDialogOpen,
|
|
444
|
+
useFsAccessApi = _defaultProps$options.useFsAccessApi,
|
|
435
445
|
preventDropOnDocument = _defaultProps$options.preventDropOnDocument,
|
|
436
446
|
noClick = _defaultProps$options.noClick,
|
|
437
447
|
noKeyboard = _defaultProps$options.noKeyboard,
|
|
@@ -439,6 +449,12 @@ export function useDropzone() {
|
|
|
439
449
|
noDragEventsBubbling = _defaultProps$options.noDragEventsBubbling,
|
|
440
450
|
validator = _defaultProps$options.validator;
|
|
441
451
|
|
|
452
|
+
var onFileDialogOpenCb = useMemo(function () {
|
|
453
|
+
return typeof onFileDialogOpen === "function" ? onFileDialogOpen : noop;
|
|
454
|
+
}, [onFileDialogOpen]);
|
|
455
|
+
var onFileDialogCancelCb = useMemo(function () {
|
|
456
|
+
return typeof onFileDialogCancel === "function" ? onFileDialogCancel : noop;
|
|
457
|
+
}, [onFileDialogCancel]);
|
|
442
458
|
var rootRef = useRef(null);
|
|
443
459
|
var inputRef = useRef(null);
|
|
444
460
|
|
|
@@ -449,22 +465,7 @@ export function useDropzone() {
|
|
|
449
465
|
|
|
450
466
|
var isFocused = state.isFocused,
|
|
451
467
|
isFileDialogActive = state.isFileDialogActive,
|
|
452
|
-
draggedFiles = state.draggedFiles; //
|
|
453
|
-
|
|
454
|
-
var openFileDialog = useCallback(function () {
|
|
455
|
-
if (inputRef.current) {
|
|
456
|
-
dispatch({
|
|
457
|
-
type: 'openDialog'
|
|
458
|
-
});
|
|
459
|
-
|
|
460
|
-
if (typeof onFileDialogOpen === 'function') {
|
|
461
|
-
onFileDialogOpen();
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
inputRef.current.value = null;
|
|
465
|
-
inputRef.current.click();
|
|
466
|
-
}
|
|
467
|
-
}, [dispatch, onFileDialogOpen]); // Update file dialog active state when the window is focused on
|
|
468
|
+
draggedFiles = state.draggedFiles; // Update file dialog active state when the window is focused on
|
|
468
469
|
|
|
469
470
|
var onWindowFocus = function onWindowFocus() {
|
|
470
471
|
// Execute the timeout only if the file dialog is opened in the browser
|
|
@@ -475,12 +476,9 @@ export function useDropzone() {
|
|
|
475
476
|
|
|
476
477
|
if (!files.length) {
|
|
477
478
|
dispatch({
|
|
478
|
-
type:
|
|
479
|
+
type: "closeDialog"
|
|
479
480
|
});
|
|
480
|
-
|
|
481
|
-
if (typeof onFileDialogCancel === 'function') {
|
|
482
|
-
onFileDialogCancel();
|
|
483
|
-
}
|
|
481
|
+
onFileDialogCancelCb();
|
|
484
482
|
}
|
|
485
483
|
}
|
|
486
484
|
}, 300);
|
|
@@ -488,49 +486,15 @@ export function useDropzone() {
|
|
|
488
486
|
};
|
|
489
487
|
|
|
490
488
|
useEffect(function () {
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
window.removeEventListener('focus', onWindowFocus, false);
|
|
494
|
-
};
|
|
495
|
-
}, [inputRef, isFileDialogActive, onFileDialogCancel]); // Cb to open the file dialog when SPACE/ENTER occurs on the dropzone
|
|
496
|
-
|
|
497
|
-
var onKeyDownCb = useCallback(function (event) {
|
|
498
|
-
// Ignore keyboard events bubbling up the DOM tree
|
|
499
|
-
if (!rootRef.current || !rootRef.current.isEqualNode(event.target)) {
|
|
500
|
-
return;
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
if (event.keyCode === 32 || event.keyCode === 13) {
|
|
504
|
-
event.preventDefault();
|
|
505
|
-
openFileDialog();
|
|
489
|
+
if (useFsAccessApi && canUseFileSystemAccessAPI()) {
|
|
490
|
+
return function () {};
|
|
506
491
|
}
|
|
507
|
-
}, [rootRef, inputRef, openFileDialog]); // Update focus state for the dropzone
|
|
508
|
-
|
|
509
|
-
var onFocusCb = useCallback(function () {
|
|
510
|
-
dispatch({
|
|
511
|
-
type: 'focus'
|
|
512
|
-
});
|
|
513
|
-
}, []);
|
|
514
|
-
var onBlurCb = useCallback(function () {
|
|
515
|
-
dispatch({
|
|
516
|
-
type: 'blur'
|
|
517
|
-
});
|
|
518
|
-
}, []); // Cb to open the file dialog when click occurs on the dropzone
|
|
519
492
|
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
}
|
|
524
|
-
|
|
525
|
-
// See: https://github.com/react-dropzone/react-dropzone/issues/450
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
if (isIeOrEdge()) {
|
|
529
|
-
setTimeout(openFileDialog, 0);
|
|
530
|
-
} else {
|
|
531
|
-
openFileDialog();
|
|
532
|
-
}
|
|
533
|
-
}, [inputRef, noClick, openFileDialog]);
|
|
493
|
+
window.addEventListener("focus", onWindowFocus, false);
|
|
494
|
+
return function () {
|
|
495
|
+
window.removeEventListener("focus", onWindowFocus, false);
|
|
496
|
+
};
|
|
497
|
+
}, [inputRef, isFileDialogActive, onFileDialogCancelCb, useFsAccessApi]);
|
|
534
498
|
var dragTargetsRef = useRef([]);
|
|
535
499
|
|
|
536
500
|
var onDocumentDrop = function onDocumentDrop(event) {
|
|
@@ -545,14 +509,14 @@ export function useDropzone() {
|
|
|
545
509
|
|
|
546
510
|
useEffect(function () {
|
|
547
511
|
if (preventDropOnDocument) {
|
|
548
|
-
document.addEventListener(
|
|
549
|
-
document.addEventListener(
|
|
512
|
+
document.addEventListener("dragover", onDocumentDragOver, false);
|
|
513
|
+
document.addEventListener("drop", onDocumentDrop, false);
|
|
550
514
|
}
|
|
551
515
|
|
|
552
516
|
return function () {
|
|
553
517
|
if (preventDropOnDocument) {
|
|
554
|
-
document.removeEventListener(
|
|
555
|
-
document.removeEventListener(
|
|
518
|
+
document.removeEventListener("dragover", onDocumentDragOver);
|
|
519
|
+
document.removeEventListener("drop", onDocumentDrop);
|
|
556
520
|
}
|
|
557
521
|
};
|
|
558
522
|
}, [rootRef, preventDropOnDocument]);
|
|
@@ -572,7 +536,7 @@ export function useDropzone() {
|
|
|
572
536
|
dispatch({
|
|
573
537
|
draggedFiles: draggedFiles,
|
|
574
538
|
isDragActive: true,
|
|
575
|
-
type:
|
|
539
|
+
type: "setDraggedFiles"
|
|
576
540
|
});
|
|
577
541
|
|
|
578
542
|
if (onDragEnter) {
|
|
@@ -589,7 +553,7 @@ export function useDropzone() {
|
|
|
589
553
|
|
|
590
554
|
if (hasFiles && event.dataTransfer) {
|
|
591
555
|
try {
|
|
592
|
-
event.dataTransfer.dropEffect =
|
|
556
|
+
event.dataTransfer.dropEffect = "copy";
|
|
593
557
|
} catch (_unused) {}
|
|
594
558
|
/* eslint-disable-line no-empty */
|
|
595
559
|
|
|
@@ -625,7 +589,7 @@ export function useDropzone() {
|
|
|
625
589
|
|
|
626
590
|
dispatch({
|
|
627
591
|
isDragActive: false,
|
|
628
|
-
type:
|
|
592
|
+
type: "setDraggedFiles",
|
|
629
593
|
draggedFiles: []
|
|
630
594
|
});
|
|
631
595
|
|
|
@@ -633,6 +597,69 @@ export function useDropzone() {
|
|
|
633
597
|
onDragLeave(event);
|
|
634
598
|
}
|
|
635
599
|
}, [rootRef, onDragLeave, noDragEventsBubbling]);
|
|
600
|
+
var setFiles = useCallback(function (files, event) {
|
|
601
|
+
var acceptedFiles = [];
|
|
602
|
+
var fileRejections = [];
|
|
603
|
+
files.forEach(function (file) {
|
|
604
|
+
var _fileAccepted = fileAccepted(file, accept),
|
|
605
|
+
_fileAccepted2 = _slicedToArray(_fileAccepted, 2),
|
|
606
|
+
accepted = _fileAccepted2[0],
|
|
607
|
+
acceptError = _fileAccepted2[1];
|
|
608
|
+
|
|
609
|
+
var _fileMatchSize = fileMatchSize(file, minSize, maxSize),
|
|
610
|
+
_fileMatchSize2 = _slicedToArray(_fileMatchSize, 2),
|
|
611
|
+
sizeMatch = _fileMatchSize2[0],
|
|
612
|
+
sizeError = _fileMatchSize2[1];
|
|
613
|
+
|
|
614
|
+
var customErrors = validator ? validator(file) : null;
|
|
615
|
+
|
|
616
|
+
if (accepted && sizeMatch && !customErrors) {
|
|
617
|
+
acceptedFiles.push(file);
|
|
618
|
+
} else {
|
|
619
|
+
var errors = [acceptError, sizeError];
|
|
620
|
+
|
|
621
|
+
if (customErrors) {
|
|
622
|
+
errors = errors.concat(customErrors);
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
fileRejections.push({
|
|
626
|
+
file: file,
|
|
627
|
+
errors: errors.filter(function (e) {
|
|
628
|
+
return e;
|
|
629
|
+
})
|
|
630
|
+
});
|
|
631
|
+
}
|
|
632
|
+
});
|
|
633
|
+
|
|
634
|
+
if (!multiple && acceptedFiles.length > 1 || multiple && maxFiles >= 1 && acceptedFiles.length > maxFiles) {
|
|
635
|
+
// Reject everything and empty accepted files
|
|
636
|
+
acceptedFiles.forEach(function (file) {
|
|
637
|
+
fileRejections.push({
|
|
638
|
+
file: file,
|
|
639
|
+
errors: [TOO_MANY_FILES_REJECTION]
|
|
640
|
+
});
|
|
641
|
+
});
|
|
642
|
+
acceptedFiles.splice(0);
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
dispatch({
|
|
646
|
+
acceptedFiles: acceptedFiles,
|
|
647
|
+
fileRejections: fileRejections,
|
|
648
|
+
type: "setFiles"
|
|
649
|
+
});
|
|
650
|
+
|
|
651
|
+
if (onDrop) {
|
|
652
|
+
onDrop(acceptedFiles, fileRejections, event);
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
if (fileRejections.length > 0 && onDropRejected) {
|
|
656
|
+
onDropRejected(fileRejections, event);
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
if (acceptedFiles.length > 0 && onDropAccepted) {
|
|
660
|
+
onDropAccepted(acceptedFiles, event);
|
|
661
|
+
}
|
|
662
|
+
}, [dispatch, multiple, accept, minSize, maxSize, maxFiles, onDrop, onDropAccepted, onDropRejected, validator]);
|
|
636
663
|
var onDropCb = useCallback(function (event) {
|
|
637
664
|
event.preventDefault(); // Persist here because we need the event later after getFilesFromEvent() is done
|
|
638
665
|
|
|
@@ -646,74 +673,87 @@ export function useDropzone() {
|
|
|
646
673
|
return;
|
|
647
674
|
}
|
|
648
675
|
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
var _fileAccepted = fileAccepted(file, accept),
|
|
653
|
-
_fileAccepted2 = _slicedToArray(_fileAccepted, 2),
|
|
654
|
-
accepted = _fileAccepted2[0],
|
|
655
|
-
acceptError = _fileAccepted2[1];
|
|
656
|
-
|
|
657
|
-
var _fileMatchSize = fileMatchSize(file, minSize, maxSize),
|
|
658
|
-
_fileMatchSize2 = _slicedToArray(_fileMatchSize, 2),
|
|
659
|
-
sizeMatch = _fileMatchSize2[0],
|
|
660
|
-
sizeError = _fileMatchSize2[1];
|
|
661
|
-
|
|
662
|
-
var customErrors = validator ? validator(file) : null;
|
|
663
|
-
|
|
664
|
-
if (accepted && sizeMatch && !customErrors) {
|
|
665
|
-
acceptedFiles.push(file);
|
|
666
|
-
} else {
|
|
667
|
-
var errors = [acceptError, sizeError];
|
|
668
|
-
|
|
669
|
-
if (customErrors) {
|
|
670
|
-
errors = errors.concat(customErrors);
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
fileRejections.push({
|
|
674
|
-
file: file,
|
|
675
|
-
errors: errors.filter(function (e) {
|
|
676
|
-
return e;
|
|
677
|
-
})
|
|
678
|
-
});
|
|
679
|
-
}
|
|
680
|
-
});
|
|
676
|
+
setFiles(files, event);
|
|
677
|
+
});
|
|
678
|
+
}
|
|
681
679
|
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
file: file,
|
|
687
|
-
errors: [TOO_MANY_FILES_REJECTION]
|
|
688
|
-
});
|
|
689
|
-
});
|
|
690
|
-
acceptedFiles.splice(0);
|
|
691
|
-
}
|
|
680
|
+
dispatch({
|
|
681
|
+
type: "reset"
|
|
682
|
+
});
|
|
683
|
+
}, [getFilesFromEvent, setFiles, noDragEventsBubbling]); // Fn for opening the file dialog programmatically
|
|
692
684
|
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
685
|
+
var openFileDialog = useCallback(function () {
|
|
686
|
+
if (useFsAccessApi && canUseFileSystemAccessAPI()) {
|
|
687
|
+
dispatch({
|
|
688
|
+
type: "openDialog"
|
|
689
|
+
});
|
|
690
|
+
onFileDialogOpenCb(); // https://developer.mozilla.org/en-US/docs/Web/API/window/showOpenFilePicker
|
|
691
|
+
|
|
692
|
+
var opts = {
|
|
693
|
+
multiple: multiple,
|
|
694
|
+
types: filePickerOptionsTypes(accept)
|
|
695
|
+
};
|
|
696
|
+
window.showOpenFilePicker(opts).then(function (handles) {
|
|
697
|
+
return getFilesFromEvent(handles);
|
|
698
|
+
}).then(function (files) {
|
|
699
|
+
return setFiles(files, null);
|
|
700
|
+
}).catch(function (e) {
|
|
701
|
+
return onFileDialogCancelCb(e);
|
|
702
|
+
}).finally(function () {
|
|
703
|
+
return dispatch({
|
|
704
|
+
type: "closeDialog"
|
|
697
705
|
});
|
|
706
|
+
});
|
|
707
|
+
return;
|
|
708
|
+
}
|
|
698
709
|
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
710
|
+
if (inputRef.current) {
|
|
711
|
+
dispatch({
|
|
712
|
+
type: "openDialog"
|
|
713
|
+
});
|
|
714
|
+
onFileDialogOpenCb();
|
|
715
|
+
inputRef.current.value = null;
|
|
716
|
+
inputRef.current.click();
|
|
717
|
+
}
|
|
718
|
+
}, [dispatch, onFileDialogOpenCb, onFileDialogCancelCb, useFsAccessApi, setFiles, accept, multiple]); // Cb to open the file dialog when SPACE/ENTER occurs on the dropzone
|
|
702
719
|
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
720
|
+
var onKeyDownCb = useCallback(function (event) {
|
|
721
|
+
// Ignore keyboard events bubbling up the DOM tree
|
|
722
|
+
if (!rootRef.current || !rootRef.current.isEqualNode(event.target)) {
|
|
723
|
+
return;
|
|
724
|
+
}
|
|
706
725
|
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
});
|
|
726
|
+
if (event.keyCode === 32 || event.keyCode === 13) {
|
|
727
|
+
event.preventDefault();
|
|
728
|
+
openFileDialog();
|
|
711
729
|
}
|
|
730
|
+
}, [rootRef, inputRef, openFileDialog]); // Update focus state for the dropzone
|
|
712
731
|
|
|
732
|
+
var onFocusCb = useCallback(function () {
|
|
733
|
+
dispatch({
|
|
734
|
+
type: "focus"
|
|
735
|
+
});
|
|
736
|
+
}, []);
|
|
737
|
+
var onBlurCb = useCallback(function () {
|
|
713
738
|
dispatch({
|
|
714
|
-
type:
|
|
739
|
+
type: "blur"
|
|
715
740
|
});
|
|
716
|
-
}, [
|
|
741
|
+
}, []); // Cb to open the file dialog when click occurs on the dropzone
|
|
742
|
+
|
|
743
|
+
var onClickCb = useCallback(function () {
|
|
744
|
+
if (noClick) {
|
|
745
|
+
return;
|
|
746
|
+
} // In IE11/Edge the file-browser dialog is blocking, therefore, use setTimeout()
|
|
747
|
+
// to ensure React can handle state changes
|
|
748
|
+
// See: https://github.com/react-dropzone/react-dropzone/issues/450
|
|
749
|
+
|
|
750
|
+
|
|
751
|
+
if (isIeOrEdge()) {
|
|
752
|
+
setTimeout(openFileDialog, 0);
|
|
753
|
+
} else {
|
|
754
|
+
openFileDialog();
|
|
755
|
+
}
|
|
756
|
+
}, [inputRef, noClick, openFileDialog]);
|
|
717
757
|
|
|
718
758
|
var composeHandler = function composeHandler(fn) {
|
|
719
759
|
return disabled ? null : fn;
|
|
@@ -737,7 +777,8 @@ export function useDropzone() {
|
|
|
737
777
|
return function () {
|
|
738
778
|
var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
739
779
|
_ref2$refKey = _ref2.refKey,
|
|
740
|
-
refKey = _ref2$refKey === void 0 ?
|
|
780
|
+
refKey = _ref2$refKey === void 0 ? "ref" : _ref2$refKey,
|
|
781
|
+
role = _ref2.role,
|
|
741
782
|
onKeyDown = _ref2.onKeyDown,
|
|
742
783
|
onFocus = _ref2.onFocus,
|
|
743
784
|
onBlur = _ref2.onBlur,
|
|
@@ -756,7 +797,8 @@ export function useDropzone() {
|
|
|
756
797
|
onDragEnter: composeDragHandler(composeEventHandlers(onDragEnter, onDragEnterCb)),
|
|
757
798
|
onDragOver: composeDragHandler(composeEventHandlers(onDragOver, onDragOverCb)),
|
|
758
799
|
onDragLeave: composeDragHandler(composeEventHandlers(onDragLeave, onDragLeaveCb)),
|
|
759
|
-
onDrop: composeDragHandler(composeEventHandlers(onDrop, onDropCb))
|
|
800
|
+
onDrop: composeDragHandler(composeEventHandlers(onDrop, onDropCb)),
|
|
801
|
+
role: typeof role === "string" && role !== "" ? role : "button"
|
|
760
802
|
}, refKey, rootRef), !disabled && !noKeyboard ? {
|
|
761
803
|
tabIndex: 0
|
|
762
804
|
} : {}), rest);
|
|
@@ -769,7 +811,7 @@ export function useDropzone() {
|
|
|
769
811
|
return function () {
|
|
770
812
|
var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
|
|
771
813
|
_ref3$refKey = _ref3.refKey,
|
|
772
|
-
refKey = _ref3$refKey === void 0 ?
|
|
814
|
+
refKey = _ref3$refKey === void 0 ? "ref" : _ref3$refKey,
|
|
773
815
|
onChange = _ref3.onChange,
|
|
774
816
|
onClick = _ref3.onClick,
|
|
775
817
|
rest = _objectWithoutProperties(_ref3, _excluded4);
|
|
@@ -777,13 +819,13 @@ export function useDropzone() {
|
|
|
777
819
|
var inputProps = _defineProperty({
|
|
778
820
|
accept: accept,
|
|
779
821
|
multiple: multiple,
|
|
780
|
-
type:
|
|
822
|
+
type: "file",
|
|
781
823
|
style: {
|
|
782
|
-
display:
|
|
824
|
+
display: "none"
|
|
783
825
|
},
|
|
784
826
|
onChange: composeHandler(composeEventHandlers(onChange, onDropCb)),
|
|
785
827
|
onClick: composeHandler(composeEventHandlers(onClick, onInputElementClick)),
|
|
786
|
-
autoComplete:
|
|
828
|
+
autoComplete: "off",
|
|
787
829
|
tabIndex: -1
|
|
788
830
|
}, refKey, inputRef);
|
|
789
831
|
|
|
@@ -815,27 +857,27 @@ export function useDropzone() {
|
|
|
815
857
|
function reducer(state, action) {
|
|
816
858
|
/* istanbul ignore next */
|
|
817
859
|
switch (action.type) {
|
|
818
|
-
case
|
|
860
|
+
case "focus":
|
|
819
861
|
return _objectSpread(_objectSpread({}, state), {}, {
|
|
820
862
|
isFocused: true
|
|
821
863
|
});
|
|
822
864
|
|
|
823
|
-
case
|
|
865
|
+
case "blur":
|
|
824
866
|
return _objectSpread(_objectSpread({}, state), {}, {
|
|
825
867
|
isFocused: false
|
|
826
868
|
});
|
|
827
869
|
|
|
828
|
-
case
|
|
829
|
-
return _objectSpread(_objectSpread({},
|
|
870
|
+
case "openDialog":
|
|
871
|
+
return _objectSpread(_objectSpread({}, initialState), {}, {
|
|
830
872
|
isFileDialogActive: true
|
|
831
873
|
});
|
|
832
874
|
|
|
833
|
-
case
|
|
875
|
+
case "closeDialog":
|
|
834
876
|
return _objectSpread(_objectSpread({}, state), {}, {
|
|
835
877
|
isFileDialogActive: false
|
|
836
878
|
});
|
|
837
879
|
|
|
838
|
-
case
|
|
880
|
+
case "setDraggedFiles":
|
|
839
881
|
/* eslint no-case-declarations: 0 */
|
|
840
882
|
var isDragActive = action.isDragActive,
|
|
841
883
|
draggedFiles = action.draggedFiles;
|
|
@@ -844,13 +886,13 @@ function reducer(state, action) {
|
|
|
844
886
|
isDragActive: isDragActive
|
|
845
887
|
});
|
|
846
888
|
|
|
847
|
-
case
|
|
889
|
+
case "setFiles":
|
|
848
890
|
return _objectSpread(_objectSpread({}, state), {}, {
|
|
849
891
|
acceptedFiles: action.acceptedFiles,
|
|
850
892
|
fileRejections: action.fileRejections
|
|
851
893
|
});
|
|
852
894
|
|
|
853
|
-
case
|
|
895
|
+
case "reset":
|
|
854
896
|
return _objectSpread({}, initialState);
|
|
855
897
|
|
|
856
898
|
default:
|
|
@@ -858,4 +900,6 @@ function reducer(state, action) {
|
|
|
858
900
|
}
|
|
859
901
|
}
|
|
860
902
|
|
|
861
|
-
|
|
903
|
+
function noop() {}
|
|
904
|
+
|
|
905
|
+
export { ErrorCode } from "./utils";
|