react-dropzone 4.2.12 → 5.0.1

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/dist/es/index.js CHANGED
@@ -16,7 +16,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
16
16
 
17
17
  import React from 'react';
18
18
  import PropTypes from 'prop-types';
19
- import { supportMultiple, fileAccepted, allFilesAccepted, fileMatchSize, onDocumentDragOver, getDataTransferItems, isIeOrEdge } from './utils';
19
+ import { supportMultiple, fileAccepted, allFilesAccepted, fileMatchSize, onDocumentDragOver, getDataTransferItems as defaultGetDataTransferItem, isIeOrEdge } from './utils';
20
20
  import styles from './utils/styles';
21
21
 
22
22
  var Dropzone = function (_React$Component) {
@@ -73,7 +73,9 @@ var Dropzone = function (_React$Component) {
73
73
  document.addEventListener('dragover', onDocumentDragOver, false);
74
74
  document.addEventListener('drop', this.onDocumentDrop, false);
75
75
  }
76
- this.fileInputEl.addEventListener('click', this.onInputElementClick, false);
76
+ if (this.fileInputEl != null) {
77
+ this.fileInputEl.addEventListener('click', this.onInputElementClick, false);
78
+ }
77
79
  window.addEventListener('focus', this.onFileDialogCancel, false);
78
80
  }
79
81
  }, {
@@ -119,6 +121,8 @@ var Dropzone = function (_React$Component) {
119
121
  }, {
120
122
  key: 'onDragEnter',
121
123
  value: function onDragEnter(evt) {
124
+ var _this2 = this;
125
+
122
126
  evt.preventDefault();
123
127
 
124
128
  // Count the dropzone and any children that are entered.
@@ -126,11 +130,12 @@ var Dropzone = function (_React$Component) {
126
130
  this.dragTargets.push(evt.target);
127
131
  }
128
132
 
129
- this.setState({
130
- isDragActive: true, // Do not rely on files for the drag state. It doesn't work in Safari.
131
- draggedFiles: getDataTransferItems(evt)
133
+ Promise.resolve(this.props.getDataTransferItems(evt)).then(function (draggedFiles) {
134
+ _this2.setState({
135
+ isDragActive: true, // Do not rely on files for the drag state. It doesn't work in Safari.
136
+ draggedFiles: draggedFiles
137
+ });
132
138
  });
133
-
134
139
  if (this.props.onDragEnter) {
135
140
  this.props.onDragEnter.call(this, evt);
136
141
  }
@@ -158,13 +163,13 @@ var Dropzone = function (_React$Component) {
158
163
  }, {
159
164
  key: 'onDragLeave',
160
165
  value: function onDragLeave(evt) {
161
- var _this2 = this;
166
+ var _this3 = this;
162
167
 
163
168
  evt.preventDefault();
164
169
 
165
170
  // Only deactivate once the dropzone and all children have been left.
166
171
  this.dragTargets = this.dragTargets.filter(function (el) {
167
- return el !== evt.target && _this2.node.contains(el);
172
+ return el !== evt.target && _this3.node.contains(el);
168
173
  });
169
174
  if (this.dragTargets.length > 0) {
170
175
  return;
@@ -183,7 +188,7 @@ var Dropzone = function (_React$Component) {
183
188
  }, {
184
189
  key: 'onDrop',
185
190
  value: function onDrop(evt) {
186
- var _this3 = this;
191
+ var _this4 = this;
187
192
 
188
193
  var _props = this.props,
189
194
  onDrop = _props.onDrop,
@@ -191,64 +196,65 @@ var Dropzone = function (_React$Component) {
191
196
  onDropRejected = _props.onDropRejected,
192
197
  multiple = _props.multiple,
193
198
  disablePreview = _props.disablePreview,
194
- accept = _props.accept;
195
-
196
- var fileList = getDataTransferItems(evt);
197
- var acceptedFiles = [];
198
- var rejectedFiles = [];
199
+ accept = _props.accept,
200
+ getDataTransferItems = _props.getDataTransferItems;
199
201
 
200
202
  // Stop default browser behavior
203
+
201
204
  evt.preventDefault();
202
205
 
203
206
  // Reset the counter along with the drag on a drop.
204
207
  this.dragTargets = [];
205
208
  this.isFileDialogActive = false;
206
209
 
207
- fileList.forEach(function (file) {
208
- if (!disablePreview) {
209
- try {
210
- file.preview = window.URL.createObjectURL(file); // eslint-disable-line no-param-reassign
211
- } catch (err) {
212
- if (process.env.NODE_ENV !== 'production') {
213
- console.error('Failed to generate preview for file', file, err); // eslint-disable-line no-console
214
- }
215
- }
216
- }
210
+ // Clear files value
211
+ this.draggedFiles = null;
217
212
 
218
- if (fileAccepted(file, accept) && fileMatchSize(file, _this3.props.maxSize, _this3.props.minSize)) {
219
- acceptedFiles.push(file);
220
- } else {
221
- rejectedFiles.push(file);
222
- }
213
+ // Reset drag state
214
+ this.setState({
215
+ isDragActive: false,
216
+ draggedFiles: []
223
217
  });
224
218
 
225
- if (!multiple) {
226
- // if not in multi mode add any extra accepted files to rejected.
227
- // This will allow end users to easily ignore a multi file drop in "single" mode.
228
- rejectedFiles.push.apply(rejectedFiles, _toConsumableArray(acceptedFiles.splice(1)));
229
- }
219
+ Promise.resolve(getDataTransferItems(evt)).then(function (fileList) {
220
+ var acceptedFiles = [];
221
+ var rejectedFiles = [];
222
+
223
+ fileList.forEach(function (file) {
224
+ if (!disablePreview) {
225
+ try {
226
+ file.preview = window.URL.createObjectURL(file); // eslint-disable-line no-param-reassign
227
+ } catch (err) {
228
+ if (process.env.NODE_ENV !== 'production') {
229
+ console.error('Failed to generate preview for file', file, err); // eslint-disable-line no-console
230
+ }
231
+ }
232
+ }
230
233
 
231
- if (onDrop) {
232
- onDrop.call(this, acceptedFiles, rejectedFiles, evt);
233
- }
234
+ if (fileAccepted(file, accept) && fileMatchSize(file, _this4.props.maxSize, _this4.props.minSize)) {
235
+ acceptedFiles.push(file);
236
+ } else {
237
+ rejectedFiles.push(file);
238
+ }
239
+ });
234
240
 
235
- if (rejectedFiles.length > 0 && onDropRejected) {
236
- onDropRejected.call(this, rejectedFiles, evt);
237
- }
241
+ if (!multiple && acceptedFiles.length > 1) {
242
+ // if not in multi mode add any extra accepted files to rejected.
243
+ // This will allow end users to easily ignore a multi file drop in "single" mode.
244
+ rejectedFiles.push.apply(rejectedFiles, _toConsumableArray(acceptedFiles.splice(0)));
245
+ }
238
246
 
239
- if (acceptedFiles.length > 0 && onDropAccepted) {
240
- onDropAccepted.call(this, acceptedFiles, evt);
241
- }
247
+ if (onDrop) {
248
+ onDrop.call(_this4, acceptedFiles, rejectedFiles, evt);
249
+ }
242
250
 
243
- // Clear files value
244
- this.draggedFiles = null;
251
+ if (rejectedFiles.length > 0 && onDropRejected) {
252
+ onDropRejected.call(_this4, rejectedFiles, evt);
253
+ }
245
254
 
246
- // Reset drag state
247
- this.setState({
248
- isDragActive: false,
249
- draggedFiles: [],
250
- acceptedFiles: acceptedFiles,
251
- rejectedFiles: rejectedFiles
255
+ if (acceptedFiles.length > 0 && onDropAccepted) {
256
+ onDropAccepted.call(_this4, acceptedFiles, evt);
257
+ }
252
258
  });
253
259
  }
254
260
  }, {
@@ -286,7 +292,7 @@ var Dropzone = function (_React$Component) {
286
292
  }, {
287
293
  key: 'onFileDialogCancel',
288
294
  value: function onFileDialogCancel() {
289
- var _this4 = this;
295
+ var _this5 = this;
290
296
 
291
297
  // timeout will not recognize context of this method
292
298
  var onFileDialogCancel = this.props.onFileDialogCancel;
@@ -294,13 +300,13 @@ var Dropzone = function (_React$Component) {
294
300
 
295
301
  if (this.isFileDialogActive) {
296
302
  setTimeout(function () {
297
- if (_this4.fileInputEl != null) {
303
+ if (_this5.fileInputEl != null) {
298
304
  // Returns an object as FileList
299
- var files = _this4.fileInputEl.files;
305
+ var files = _this5.fileInputEl.files;
300
306
 
301
307
 
302
308
  if (!files.length) {
303
- _this4.isFileDialogActive = false;
309
+ _this5.isFileDialogActive = false;
304
310
  }
305
311
  }
306
312
 
@@ -384,7 +390,7 @@ var Dropzone = function (_React$Component) {
384
390
  if (noStyles) {
385
391
  style = styles.default;
386
392
  activeStyle = styles.active;
387
- acceptStyle = style.active;
393
+ acceptStyle = styles.active;
388
394
  rejectStyle = styles.rejected;
389
395
  disabledStyle = styles.disabled;
390
396
  }
@@ -437,7 +443,8 @@ var Dropzone = function (_React$Component) {
437
443
  onFileDialogCancel = props.onFileDialogCancel,
438
444
  maxSize = props.maxSize,
439
445
  minSize = props.minSize,
440
- divProps = _objectWithoutProperties(props, ['acceptedFiles', 'preventDropOnDocument', 'disablePreview', 'disableClick', 'onDropAccepted', 'onDropRejected', 'onFileDialogCancel', 'maxSize', 'minSize']);
446
+ getDataTransferItems = props.getDataTransferItems,
447
+ divProps = _objectWithoutProperties(props, ['acceptedFiles', 'preventDropOnDocument', 'disablePreview', 'disableClick', 'onDropAccepted', 'onDropRejected', 'onFileDialogCancel', 'maxSize', 'minSize', 'getDataTransferItems']);
441
448
 
442
449
  return React.createElement(
443
450
  'div',
@@ -575,6 +582,13 @@ Dropzone.propTypes = {
575
582
  */
576
583
  disabledStyle: PropTypes.object,
577
584
 
585
+ /**
586
+ * getDataTransferItems handler
587
+ * @param {Event} event
588
+ * @returns {Array} array of File objects
589
+ */
590
+ getDataTransferItems: PropTypes.func,
591
+
578
592
  /**
579
593
  * onClick callback
580
594
  * @param {Event} event
@@ -630,5 +644,6 @@ Dropzone.defaultProps = {
630
644
  inputProps: {},
631
645
  multiple: true,
632
646
  maxSize: Infinity,
633
- minSize: 0
647
+ minSize: 0,
648
+ getDataTransferItems: defaultGetDataTransferItem
634
649
  };
@@ -6,6 +6,7 @@ export function getDataTransferItems(event) {
6
6
  var dataTransferItemsList = [];
7
7
  if (event.dataTransfer) {
8
8
  var dt = event.dataTransfer;
9
+
9
10
  if (dt.files && dt.files.length) {
10
11
  dataTransferItemsList = dt.files;
11
12
  } else if (dt.items && dt.items.length) {
@@ -16,6 +17,7 @@ export function getDataTransferItems(event) {
16
17
  } else if (event.target && event.target.files) {
17
18
  dataTransferItemsList = event.target.files;
18
19
  }
20
+
19
21
  // Convert from DataTransferItemsList to the native Array
20
22
  return Array.prototype.slice.call(dataTransferItemsList);
21
23
  }