siam-ui-utils 2.2.25 → 2.2.27

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.
Files changed (137) hide show
  1. package/dist/CustomBootstrap.js +9 -0
  2. package/dist/CustomBootstrap.js.map +1 -0
  3. package/dist/CustomSelectInput.js +12 -0
  4. package/dist/CustomSelectInput.js.map +1 -0
  5. package/dist/IntlMessages.js +10 -0
  6. package/dist/IntlMessages.js.map +1 -0
  7. package/dist/assets/img/copiar.png.js +5 -0
  8. package/dist/assets/img/copiar.png.js.map +1 -0
  9. package/dist/assets/img/take-photo.png.js +5 -0
  10. package/dist/assets/img/take-photo.png.js.map +1 -0
  11. package/dist/bridges/with-router-bridge.js +14 -0
  12. package/dist/bridges/with-router-bridge.js.map +1 -0
  13. package/dist/constants.js +9 -0
  14. package/dist/constants.js.map +1 -0
  15. package/dist/copy-link/index.js +60 -0
  16. package/dist/copy-link/index.js.map +1 -0
  17. package/dist/custom-input/CustomInputCheckbox.js +36 -0
  18. package/dist/custom-input/CustomInputCheckbox.js.map +1 -0
  19. package/dist/custom-input/CustomInputRadio.js +43 -0
  20. package/dist/custom-input/CustomInputRadio.js.map +1 -0
  21. package/dist/dropzone/Dropzone.js +513 -0
  22. package/dist/dropzone/Dropzone.js.map +1 -0
  23. package/{src/dropzone/Input.tsx → dist/dropzone/Input.js} +77 -76
  24. package/dist/dropzone/Input.js.map +1 -0
  25. package/{src/dropzone/Layout.tsx → dist/dropzone/Layout.js} +50 -57
  26. package/dist/dropzone/Layout.js.map +1 -0
  27. package/dist/dropzone/Preview.js +117 -0
  28. package/dist/dropzone/Preview.js.map +1 -0
  29. package/dist/dropzone/SubmitButton.js +34 -0
  30. package/dist/dropzone/SubmitButton.js.map +1 -0
  31. package/dist/dropzone/assets/cancel.svg.js +5 -0
  32. package/dist/dropzone/assets/cancel.svg.js.map +1 -0
  33. package/dist/dropzone/assets/remove.svg.js +5 -0
  34. package/dist/dropzone/assets/remove.svg.js.map +1 -0
  35. package/dist/dropzone/assets/restart.svg.js +5 -0
  36. package/dist/dropzone/assets/restart.svg.js.map +1 -0
  37. package/dist/dropzone/utils.js +85 -0
  38. package/dist/dropzone/utils.js.map +1 -0
  39. package/dist/dropzone-uploader/dropzone-uploader-dni-digital/index.js +150 -0
  40. package/dist/dropzone-uploader/dropzone-uploader-dni-digital/index.js.map +1 -0
  41. package/dist/dropzone-uploader/index.js +136 -0
  42. package/dist/dropzone-uploader/index.js.map +1 -0
  43. package/dist/iconos/constants-svg.js +41 -0
  44. package/dist/iconos/constants-svg.js.map +1 -0
  45. package/dist/iconos/icon-button-svg.js +50 -0
  46. package/dist/iconos/icon-button-svg.js.map +1 -0
  47. package/dist/iconos/styled-icon.js +26 -0
  48. package/dist/iconos/styled-icon.js.map +1 -0
  49. package/dist/index.js +33 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/select/constants.js +8 -0
  52. package/dist/select/constants.js.map +1 -0
  53. package/dist/select/index.js +90 -0
  54. package/dist/select/index.js.map +1 -0
  55. package/dist/timer/index.js +60 -0
  56. package/dist/timer/index.js.map +1 -0
  57. package/dist/tomar-foto/index.js +62 -0
  58. package/dist/tomar-foto/index.js.map +1 -0
  59. package/dist/view-layout/button-editor.js +14 -0
  60. package/dist/view-layout/button-editor.js.map +1 -0
  61. package/dist/view-layout/constants.js +11 -0
  62. package/dist/view-layout/constants.js.map +1 -0
  63. package/dist/view-layout/editor-layer.js +28 -0
  64. package/dist/view-layout/editor-layer.js.map +1 -0
  65. package/dist/view-layout/index.js +53 -0
  66. package/dist/view-layout/index.js.map +1 -0
  67. package/dist/view-layout/slot-wrapper.js +39 -0
  68. package/dist/view-layout/slot-wrapper.js.map +1 -0
  69. package/dist/where-by-room/index.js +20 -0
  70. package/dist/where-by-room/index.js.map +1 -0
  71. package/dist/where-by-room/room.js +78 -0
  72. package/dist/where-by-room/room.js.map +1 -0
  73. package/package.json +69 -18
  74. package/eslint.config.mjs +0 -45
  75. package/index.html +0 -17
  76. package/src/App.css +0 -47
  77. package/src/App.jsx +0 -66
  78. package/src/CustomBootstrap.jsx +0 -10
  79. package/src/CustomSelectInput.jsx +0 -8
  80. package/src/IntlMessages.jsx +0 -7
  81. package/src/assets/css/sass/_gogo.style.scss +0 -8967
  82. package/src/assets/css/sass/_mixins.scss +0 -125
  83. package/src/assets/css/sass/_plugins.scss +0 -1
  84. package/src/assets/css/sass/ampf_style.scss +0 -185
  85. package/src/assets/css/sass/main.scss +0 -11
  86. package/src/assets/css/sass/plugins/react-table.scss +0 -314
  87. package/src/assets/css/sass/themes/gogo.light.redruby.scss +0 -41
  88. package/src/assets/css/sass/themes/variables.scss +0 -86
  89. package/src/assets/css/vendor/bootstrap.min.css +0 -6
  90. package/src/assets/css/vendor/bootstrap.rtl.only.min.css +0 -1428
  91. package/src/assets/img/copiar.png +0 -0
  92. package/src/assets/img/take-photo.png +0 -0
  93. package/src/bridges/index.js +0 -1
  94. package/src/bridges/with-router-bridge.jsx +0 -11
  95. package/src/constants.js +0 -7
  96. package/src/copy-link/index.jsx +0 -58
  97. package/src/copy-link/styles.scss +0 -39
  98. package/src/custom-input/CustomInputCheckbox.jsx +0 -33
  99. package/src/custom-input/CustomInputRadio.jsx +0 -37
  100. package/src/custom-input/index.css +0 -168
  101. package/src/custom-input/index.js +0 -2
  102. package/src/dropzone/Dropzone.tsx +0 -816
  103. package/src/dropzone/Preview.tsx +0 -139
  104. package/src/dropzone/SubmitButton.tsx +0 -47
  105. package/src/dropzone/assets/cancel.svg +0 -1
  106. package/src/dropzone/assets/remove.svg +0 -1
  107. package/src/dropzone/assets/restart.svg +0 -1
  108. package/src/dropzone/styles.css +0 -140
  109. package/src/dropzone/utils.ts +0 -113
  110. package/src/dropzone-uploader/dropzone-uploader-dni-digital/index.jsx +0 -151
  111. package/src/dropzone-uploader/dropzone-uploader.css +0 -66
  112. package/src/dropzone-uploader/index.jsx +0 -138
  113. package/src/iconos/constants-svg.js +0 -659
  114. package/src/iconos/icon-button-svg.jsx +0 -50
  115. package/src/iconos/index.js +0 -2
  116. package/src/iconos/styled-icon.jsx +0 -25
  117. package/src/index.css +0 -74
  118. package/src/index.js +0 -13
  119. package/src/main.jsx +0 -7
  120. package/src/select/constants.js +0 -4
  121. package/src/select/index.tsx +0 -147
  122. package/src/test-resources.jsx +0 -145
  123. package/src/timer/index.jsx +0 -62
  124. package/src/timer/styles.scss +0 -54
  125. package/src/tomar-foto/index.jsx +0 -69
  126. package/src/view-layout/button-editor.jsx +0 -18
  127. package/src/view-layout/constants.js +0 -7
  128. package/src/view-layout/editor-layer.jsx +0 -27
  129. package/src/view-layout/index.tsx +0 -62
  130. package/src/view-layout/item-slot.tsx +0 -20
  131. package/src/view-layout/slot-wrapper.tsx +0 -44
  132. package/src/view-layout/styles.scss +0 -143
  133. package/src/where-by-room/constants.js +0 -2
  134. package/src/where-by-room/index.jsx +0 -17
  135. package/src/where-by-room/room.jsx +0 -79
  136. package/tsconfig.json +0 -19
  137. package/vite.config.ts +0 -22
@@ -0,0 +1,513 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import PropTypes from "prop-types";
4
+ import Layout from "./Layout.js";
5
+ import Input from "./Input.js";
6
+ import Preview from "./Preview.js";
7
+ import SubmitButton from "./SubmitButton.js";
8
+ import { getFilesFromEvent, accepts, resolveValue, mergeStyles } from "./utils.js";
9
+ import { defaultClassNames, formatBytes, formatDuration } from "./utils.js";
10
+ class Dropzone extends React.Component {
11
+ constructor(props) {
12
+ super(props);
13
+ this.forceUpdate = () => {
14
+ if (this.mounted) super.forceUpdate();
15
+ };
16
+ this.getFilesFromEvent = () => {
17
+ return this.props.getFilesFromEvent || getFilesFromEvent;
18
+ };
19
+ this.getDataTransferItemsFromEvent = () => {
20
+ return this.props.getDataTransferItemsFromEvent || getFilesFromEvent;
21
+ };
22
+ this.handleDragEnter = async (e) => {
23
+ e.preventDefault();
24
+ e.stopPropagation();
25
+ const dragged = await this.getDataTransferItemsFromEvent()(e);
26
+ this.setState({ active: true, dragged });
27
+ };
28
+ this.handleDragOver = async (e) => {
29
+ e.preventDefault();
30
+ e.stopPropagation();
31
+ clearTimeout(this.dragTimeoutId);
32
+ const dragged = await this.getDataTransferItemsFromEvent()(e);
33
+ this.setState({ active: true, dragged });
34
+ };
35
+ this.handleDragLeave = (e) => {
36
+ e.preventDefault();
37
+ e.stopPropagation();
38
+ this.dragTimeoutId = window.setTimeout(() => this.setState({ active: false, dragged: [] }), 150);
39
+ };
40
+ this.handleDrop = async (e) => {
41
+ e.preventDefault();
42
+ e.stopPropagation();
43
+ this.setState({ active: false, dragged: [] });
44
+ const files = await this.getFilesFromEvent()(e);
45
+ this.handleFiles(files);
46
+ };
47
+ this.handleDropDisabled = (e) => {
48
+ e.preventDefault();
49
+ e.stopPropagation();
50
+ this.setState({ active: false, dragged: [] });
51
+ };
52
+ this.handleChangeStatus = (fileWithMeta) => {
53
+ if (!this.props.onChangeStatus) return;
54
+ const { meta = {} } = this.props.onChangeStatus(fileWithMeta, fileWithMeta.meta.status, this.files) || {};
55
+ if (meta) {
56
+ delete meta.status;
57
+ fileWithMeta.meta = { ...fileWithMeta.meta, ...meta };
58
+ this.forceUpdate();
59
+ }
60
+ };
61
+ this.handleSubmit = (files) => {
62
+ if (this.props.onSubmit) this.props.onSubmit(files, [...this.files]);
63
+ };
64
+ this.handleCancel = (fileWithMeta) => {
65
+ if (fileWithMeta.meta.status !== "uploading") return;
66
+ fileWithMeta.meta.status = "aborted";
67
+ if (fileWithMeta.xhr) fileWithMeta.xhr.abort();
68
+ this.handleChangeStatus(fileWithMeta);
69
+ this.forceUpdate();
70
+ };
71
+ this.handleRemove = (fileWithMeta) => {
72
+ const index = this.files.findIndex((f) => f === fileWithMeta);
73
+ if (index !== -1) {
74
+ URL.revokeObjectURL(fileWithMeta.meta.previewUrl || "");
75
+ fileWithMeta.meta.status = "removed";
76
+ this.handleChangeStatus(fileWithMeta);
77
+ this.files.splice(index, 1);
78
+ this.forceUpdate();
79
+ }
80
+ };
81
+ this.handleRestart = (fileWithMeta) => {
82
+ if (!this.props.getUploadParams) return;
83
+ if (fileWithMeta.meta.status === "ready") fileWithMeta.meta.status = "started";
84
+ else fileWithMeta.meta.status = "restarted";
85
+ this.handleChangeStatus(fileWithMeta);
86
+ fileWithMeta.meta.status = "getting_upload_params";
87
+ fileWithMeta.meta.percent = 0;
88
+ this.handleChangeStatus(fileWithMeta);
89
+ this.forceUpdate();
90
+ this.uploadFile(fileWithMeta);
91
+ };
92
+ this.handleFiles = (files) => {
93
+ files.forEach((f, i) => this.handleFile(f, `${(/* @__PURE__ */ new Date()).getTime()}-${i}`));
94
+ const { current } = this.dropzone;
95
+ if (current) setTimeout(() => current.scroll({ top: current.scrollHeight, behavior: "smooth" }), 150);
96
+ };
97
+ this.handleFile = async (file, id) => {
98
+ const { name, size, type, lastModified } = file;
99
+ const { minSizeBytes, maxSizeBytes, maxFiles, accept, getUploadParams, autoUpload, validate } = this.props;
100
+ const uploadedDate = (/* @__PURE__ */ new Date()).toISOString();
101
+ const lastModifiedDate = lastModified && new Date(lastModified).toISOString();
102
+ const fileWithMeta = {
103
+ file,
104
+ meta: { name, size, type, lastModifiedDate, uploadedDate, percent: 0, id }
105
+ };
106
+ if (file.type !== "application/x-moz-file" && !accepts(file, accept)) {
107
+ fileWithMeta.meta.status = "rejected_file_type";
108
+ this.handleChangeStatus(fileWithMeta);
109
+ return;
110
+ }
111
+ if (this.files.length >= maxFiles) {
112
+ fileWithMeta.meta.status = "rejected_max_files";
113
+ this.handleChangeStatus(fileWithMeta);
114
+ return;
115
+ }
116
+ fileWithMeta.cancel = () => this.handleCancel(fileWithMeta);
117
+ fileWithMeta.remove = () => this.handleRemove(fileWithMeta);
118
+ fileWithMeta.restart = () => this.handleRestart(fileWithMeta);
119
+ fileWithMeta.meta.status = "preparing";
120
+ this.files.push(fileWithMeta);
121
+ this.handleChangeStatus(fileWithMeta);
122
+ this.forceUpdate();
123
+ if (size < minSizeBytes || size > maxSizeBytes) {
124
+ fileWithMeta.meta.status = "error_file_size";
125
+ this.handleChangeStatus(fileWithMeta);
126
+ this.forceUpdate();
127
+ return;
128
+ }
129
+ await this.generatePreview(fileWithMeta);
130
+ if (validate) {
131
+ const error = validate(fileWithMeta);
132
+ if (error) {
133
+ fileWithMeta.meta.status = "error_validation";
134
+ fileWithMeta.meta.validationError = error;
135
+ this.handleChangeStatus(fileWithMeta);
136
+ this.forceUpdate();
137
+ return;
138
+ }
139
+ }
140
+ if (getUploadParams) {
141
+ if (autoUpload) {
142
+ this.uploadFile(fileWithMeta);
143
+ fileWithMeta.meta.status = "getting_upload_params";
144
+ } else {
145
+ fileWithMeta.meta.status = "ready";
146
+ }
147
+ } else {
148
+ fileWithMeta.meta.status = "done";
149
+ }
150
+ this.handleChangeStatus(fileWithMeta);
151
+ this.forceUpdate();
152
+ };
153
+ this.generatePreview = async (fileWithMeta) => {
154
+ const {
155
+ meta: { type },
156
+ file
157
+ } = fileWithMeta;
158
+ const isImage = type.startsWith("image/");
159
+ const isAudio = type.startsWith("audio/");
160
+ const isVideo = type.startsWith("video/");
161
+ if (!isImage && !isAudio && !isVideo) return;
162
+ const objectUrl = URL.createObjectURL(file);
163
+ const fileCallbackToPromise = (fileObj) => {
164
+ return Promise.race([
165
+ new Promise((resolve) => {
166
+ if (fileObj instanceof HTMLImageElement) fileObj.onload = resolve;
167
+ else fileObj.onloadedmetadata = resolve;
168
+ }),
169
+ new Promise((_, reject) => {
170
+ setTimeout(reject, 1e3);
171
+ })
172
+ ]);
173
+ };
174
+ try {
175
+ if (isImage) {
176
+ const img = new Image();
177
+ img.src = objectUrl;
178
+ fileWithMeta.meta.previewUrl = objectUrl;
179
+ await fileCallbackToPromise(img);
180
+ fileWithMeta.meta.width = img.width;
181
+ fileWithMeta.meta.height = img.height;
182
+ }
183
+ if (isAudio) {
184
+ const audio = new Audio();
185
+ audio.src = objectUrl;
186
+ await fileCallbackToPromise(audio);
187
+ fileWithMeta.meta.duration = audio.duration;
188
+ }
189
+ if (isVideo) {
190
+ const video = document.createElement("video");
191
+ video.src = objectUrl;
192
+ await fileCallbackToPromise(video);
193
+ fileWithMeta.meta.duration = video.duration;
194
+ fileWithMeta.meta.videoWidth = video.videoWidth;
195
+ fileWithMeta.meta.videoHeight = video.videoHeight;
196
+ }
197
+ if (!isImage) URL.revokeObjectURL(objectUrl);
198
+ } catch (e) {
199
+ URL.revokeObjectURL(objectUrl);
200
+ }
201
+ this.forceUpdate();
202
+ };
203
+ this.uploadFile = async (fileWithMeta) => {
204
+ const { getUploadParams } = this.props;
205
+ if (!getUploadParams) return;
206
+ let params = null;
207
+ try {
208
+ params = await getUploadParams(fileWithMeta);
209
+ } catch (e) {
210
+ console.error("Error Upload Params", e.stack);
211
+ }
212
+ if (params === null) return;
213
+ const { url, method = "POST", body, fields = {}, headers = {}, meta: extraMeta = {} } = params;
214
+ delete extraMeta.status;
215
+ if (!url) {
216
+ fileWithMeta.meta.status = "error_upload_params";
217
+ this.handleChangeStatus(fileWithMeta);
218
+ this.forceUpdate();
219
+ return;
220
+ }
221
+ const xhr = new XMLHttpRequest();
222
+ const formData = new FormData();
223
+ xhr.open(method, url, true);
224
+ for (const field of Object.keys(fields)) formData.append(field, fields[field]);
225
+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
226
+ for (const header of Object.keys(headers)) xhr.setRequestHeader(header, headers[header]);
227
+ fileWithMeta.meta = { ...fileWithMeta.meta, ...extraMeta };
228
+ xhr.upload.addEventListener("progress", (e) => {
229
+ fileWithMeta.meta.percent = e.loaded * 100 / e.total || 100;
230
+ this.forceUpdate();
231
+ });
232
+ xhr.addEventListener("readystatechange", () => {
233
+ if (xhr.readyState !== 2 && xhr.readyState !== 4) return;
234
+ if (xhr.status === 0 && fileWithMeta.meta.status !== "aborted") {
235
+ fileWithMeta.meta.status = "exception_upload";
236
+ this.handleChangeStatus(fileWithMeta);
237
+ this.forceUpdate();
238
+ }
239
+ if (xhr.status > 0 && xhr.status < 400) {
240
+ fileWithMeta.meta.percent = 100;
241
+ if (xhr.readyState === 2) fileWithMeta.meta.status = "headers_received";
242
+ if (xhr.readyState === 4) fileWithMeta.meta.status = "done";
243
+ this.handleChangeStatus(fileWithMeta);
244
+ this.forceUpdate();
245
+ }
246
+ if (xhr.status >= 400 && fileWithMeta.meta.status !== "error_upload") {
247
+ fileWithMeta.meta.status = "error_upload";
248
+ this.handleChangeStatus(fileWithMeta);
249
+ this.forceUpdate();
250
+ }
251
+ });
252
+ formData.append("file", fileWithMeta.file);
253
+ if (this.props.timeout) xhr.timeout = this.props.timeout;
254
+ xhr.send(body || formData);
255
+ fileWithMeta.xhr = xhr;
256
+ fileWithMeta.meta.status = "uploading";
257
+ this.handleChangeStatus(fileWithMeta);
258
+ this.forceUpdate();
259
+ };
260
+ this.state = {
261
+ active: false,
262
+ dragged: []
263
+ };
264
+ this.files = [];
265
+ this.mounted = true;
266
+ this.dropzone = React.createRef();
267
+ }
268
+ componentDidMount() {
269
+ if (this.props.initialFiles) this.handleFiles(this.props.initialFiles);
270
+ }
271
+ componentDidUpdate(prevProps) {
272
+ const { initialFiles } = this.props;
273
+ if (prevProps.initialFiles !== initialFiles && initialFiles) this.handleFiles(initialFiles);
274
+ }
275
+ componentWillUnmount() {
276
+ this.mounted = false;
277
+ for (const fileWithMeta of this.files) this.handleCancel(fileWithMeta);
278
+ }
279
+ render() {
280
+ const {
281
+ accept,
282
+ multiple,
283
+ maxFiles,
284
+ minSizeBytes,
285
+ maxSizeBytes,
286
+ onSubmit,
287
+ getUploadParams,
288
+ disabled,
289
+ canCancel,
290
+ canRemove,
291
+ canRestart,
292
+ inputContent,
293
+ inputWithFilesContent,
294
+ submitButtonDisabled,
295
+ submitButtonContent,
296
+ classNames,
297
+ styles,
298
+ addClassNames,
299
+ InputComponent,
300
+ PreviewComponent,
301
+ SubmitButtonComponent,
302
+ LayoutComponent
303
+ } = this.props;
304
+ const { active, dragged } = this.state;
305
+ const reject = dragged.some((file) => file.type !== "application/x-moz-file" && !accepts(file, accept));
306
+ const extra = { active, reject, dragged, accept, multiple, minSizeBytes, maxSizeBytes, maxFiles };
307
+ const files = [...this.files];
308
+ const dropzoneDisabled = resolveValue(disabled, files, extra);
309
+ const {
310
+ classNames: {
311
+ dropzone: dropzoneClassName,
312
+ dropzoneActive: dropzoneActiveClassName,
313
+ dropzoneReject: dropzoneRejectClassName,
314
+ dropzoneDisabled: dropzoneDisabledClassName,
315
+ input: inputClassName,
316
+ inputLabel: inputLabelClassName,
317
+ inputLabelWithFiles: inputLabelWithFilesClassName,
318
+ preview: previewClassName,
319
+ previewImage: previewImageClassName,
320
+ submitButtonContainer: submitButtonContainerClassName,
321
+ submitButton: submitButtonClassName
322
+ },
323
+ styles: {
324
+ dropzone: dropzoneStyle,
325
+ dropzoneActive: dropzoneActiveStyle,
326
+ dropzoneReject: dropzoneRejectStyle,
327
+ dropzoneDisabled: dropzoneDisabledStyle,
328
+ input: inputStyle,
329
+ inputLabel: inputLabelStyle,
330
+ inputLabelWithFiles: inputLabelWithFilesStyle,
331
+ preview: previewStyle,
332
+ previewImage: previewImageStyle,
333
+ submitButtonContainer: submitButtonContainerStyle,
334
+ submitButton: submitButtonStyle
335
+ }
336
+ } = mergeStyles(classNames, styles, addClassNames, files, extra);
337
+ const Input$1 = InputComponent || Input;
338
+ const Preview$1 = PreviewComponent || Preview;
339
+ const SubmitButton$1 = SubmitButtonComponent || SubmitButton;
340
+ const Layout$1 = LayoutComponent || Layout;
341
+ let previews = null;
342
+ if (PreviewComponent !== null) {
343
+ previews = files.map((f) => {
344
+ return (
345
+ //@ts-ignore
346
+ /* @__PURE__ */ jsx(
347
+ Preview$1,
348
+ {
349
+ className: previewClassName,
350
+ imageClassName: previewImageClassName,
351
+ style: previewStyle,
352
+ imageStyle: previewImageStyle,
353
+ fileWithMeta: f,
354
+ meta: { ...f.meta },
355
+ isUpload: Boolean(getUploadParams),
356
+ canCancel: resolveValue(canCancel, files, extra),
357
+ canRemove: resolveValue(canRemove, files, extra),
358
+ canRestart: resolveValue(canRestart, files, extra),
359
+ files,
360
+ extra
361
+ },
362
+ f.meta.id
363
+ )
364
+ );
365
+ });
366
+ }
367
+ const input = InputComponent !== null ? (
368
+ //@ts-ignore
369
+ /* @__PURE__ */ jsx(
370
+ Input$1,
371
+ {
372
+ className: inputClassName,
373
+ labelClassName: inputLabelClassName,
374
+ labelWithFilesClassName: inputLabelWithFilesClassName,
375
+ style: inputStyle,
376
+ labelStyle: inputLabelStyle,
377
+ labelWithFilesStyle: inputLabelWithFilesStyle,
378
+ getFilesFromEvent: this.getFilesFromEvent(),
379
+ accept,
380
+ multiple,
381
+ disabled: dropzoneDisabled,
382
+ content: resolveValue(inputContent, files, extra),
383
+ withFilesContent: resolveValue(inputWithFilesContent, files, extra),
384
+ onFiles: this.handleFiles,
385
+ files,
386
+ extra
387
+ }
388
+ )
389
+ ) : null;
390
+ const submitButton = onSubmit && SubmitButtonComponent !== null ? (
391
+ //@ts-ignore
392
+ /* @__PURE__ */ jsx(
393
+ SubmitButton$1,
394
+ {
395
+ className: submitButtonContainerClassName,
396
+ buttonClassName: submitButtonClassName,
397
+ style: submitButtonContainerStyle,
398
+ buttonStyle: submitButtonStyle,
399
+ disabled: resolveValue(submitButtonDisabled, files, extra),
400
+ content: resolveValue(submitButtonContent, files, extra),
401
+ onSubmit: this.handleSubmit,
402
+ files,
403
+ extra
404
+ }
405
+ )
406
+ ) : null;
407
+ let className = dropzoneClassName;
408
+ let style = dropzoneStyle;
409
+ if (dropzoneDisabled) {
410
+ className = `${className} ${dropzoneDisabledClassName}`;
411
+ style = { ...style || {}, ...dropzoneDisabledStyle || {} };
412
+ } else if (reject) {
413
+ className = `${className} ${dropzoneRejectClassName}`;
414
+ style = { ...style || {}, ...dropzoneRejectStyle || {} };
415
+ } else if (active) {
416
+ className = `${className} ${dropzoneActiveClassName}`;
417
+ style = { ...style || {}, ...dropzoneActiveStyle || {} };
418
+ }
419
+ return (
420
+ //@ts-ignore
421
+ /* @__PURE__ */ jsx(
422
+ Layout$1,
423
+ {
424
+ input,
425
+ previews,
426
+ submitButton,
427
+ dropzoneProps: {
428
+ ref: this.dropzone,
429
+ className,
430
+ style,
431
+ onDragEnter: this.handleDragEnter,
432
+ onDragOver: this.handleDragOver,
433
+ onDragLeave: this.handleDragLeave,
434
+ onDrop: dropzoneDisabled ? this.handleDropDisabled : this.handleDrop
435
+ },
436
+ files,
437
+ extra: {
438
+ ...extra,
439
+ onFiles: this.handleFiles,
440
+ onCancelFile: this.handleCancel,
441
+ onRemoveFile: this.handleRemove,
442
+ onRestartFile: this.handleRestart
443
+ }
444
+ }
445
+ )
446
+ );
447
+ }
448
+ }
449
+ Dropzone.defaultProps = {
450
+ accept: "*",
451
+ multiple: true,
452
+ minSizeBytes: 0,
453
+ maxSizeBytes: Number.MAX_SAFE_INTEGER,
454
+ maxFiles: Number.MAX_SAFE_INTEGER,
455
+ autoUpload: true,
456
+ disabled: false,
457
+ canCancel: true,
458
+ canRemove: true,
459
+ canRestart: true,
460
+ inputContent: "Drag Files or Click to Browse",
461
+ inputWithFilesContent: "Add Files",
462
+ submitButtonDisabled: false,
463
+ submitButtonContent: "Submit",
464
+ classNames: {},
465
+ styles: {},
466
+ addClassNames: {}
467
+ };
468
+ Dropzone.propTypes = {
469
+ onChangeStatus: PropTypes.func,
470
+ getUploadParams: PropTypes.func,
471
+ onSubmit: PropTypes.func,
472
+ getFilesFromEvent: PropTypes.func,
473
+ getDataTransferItemsFromEvent: PropTypes.func,
474
+ accept: PropTypes.string,
475
+ multiple: PropTypes.bool,
476
+ minSizeBytes: PropTypes.number.isRequired,
477
+ maxSizeBytes: PropTypes.number.isRequired,
478
+ maxFiles: PropTypes.number.isRequired,
479
+ validate: PropTypes.func,
480
+ autoUpload: PropTypes.bool,
481
+ timeout: PropTypes.number,
482
+ initialFiles: PropTypes.arrayOf(PropTypes.any),
483
+ /* component customization */
484
+ disabled: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
485
+ canCancel: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
486
+ canRemove: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
487
+ canRestart: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
488
+ inputContent: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
489
+ inputWithFilesContent: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
490
+ submitButtonDisabled: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),
491
+ submitButtonContent: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),
492
+ classNames: PropTypes.object.isRequired,
493
+ styles: PropTypes.object.isRequired,
494
+ addClassNames: PropTypes.object.isRequired,
495
+ /* component injection */
496
+ InputComponent: PropTypes.func,
497
+ PreviewComponent: PropTypes.func,
498
+ SubmitButtonComponent: PropTypes.func,
499
+ LayoutComponent: PropTypes.func
500
+ };
501
+ export {
502
+ Input,
503
+ Layout,
504
+ Preview,
505
+ SubmitButton,
506
+ accepts,
507
+ Dropzone as default,
508
+ defaultClassNames,
509
+ formatBytes,
510
+ formatDuration,
511
+ getFilesFromEvent
512
+ };
513
+ //# sourceMappingURL=Dropzone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dropzone.js","sources":["../../src/dropzone/Dropzone.tsx"],"sourcesContent":["import React from 'react'\r\nimport PropTypes from 'prop-types'\r\n\r\nimport LayoutDefault from './Layout'\r\nimport InputDefault from './Input'\r\nimport PreviewDefault from './Preview'\r\nimport SubmitButtonDefault from './SubmitButton'\r\nimport {\r\n formatBytes,\r\n formatDuration,\r\n accepts,\r\n resolveValue,\r\n mergeStyles,\r\n defaultClassNames,\r\n getFilesFromEvent as defaultGetFilesFromEvent,\r\n} from './utils'\r\n\r\nexport type StatusValue =\r\n | 'rejected_file_type'\r\n | 'rejected_max_files'\r\n | 'preparing'\r\n | 'error_file_size'\r\n | 'error_validation'\r\n | 'ready'\r\n | 'started'\r\n | 'getting_upload_params'\r\n | 'error_upload_params'\r\n | 'uploading'\r\n | 'exception_upload'\r\n | 'aborted'\r\n | 'restarted'\r\n | 'removed'\r\n | 'error_upload'\r\n | 'headers_received'\r\n | 'done'\r\n\r\nexport type MethodValue =\r\n | 'delete'\r\n | 'get'\r\n | 'head'\r\n | 'options'\r\n | 'patch'\r\n | 'post'\r\n | 'put'\r\n | 'DELETE'\r\n | 'GET'\r\n | 'HEAD'\r\n | 'OPTIONS'\r\n | 'PATCH'\r\n | 'POST'\r\n | 'PUT'\r\n\r\nexport interface IMeta {\r\n id: string\r\n status: StatusValue\r\n type: string // MIME type, example: `image/*`\r\n name: string\r\n uploadedDate: string // ISO string\r\n percent: number\r\n size: number // bytes\r\n lastModifiedDate: string // ISO string\r\n previewUrl?: string // from URL.createObjectURL\r\n duration?: number // seconds\r\n width?: number\r\n height?: number\r\n videoWidth?: number\r\n videoHeight?: number\r\n validationError?: any\r\n}\r\n\r\nexport interface IFileWithMeta {\r\n file: File\r\n meta: IMeta\r\n cancel: () => void\r\n restart: () => void\r\n remove: () => void\r\n xhr?: XMLHttpRequest\r\n}\r\n\r\nexport interface IExtra {\r\n active: boolean\r\n reject: boolean\r\n dragged: DataTransferItem[]\r\n accept: string\r\n multiple: boolean\r\n minSizeBytes: number\r\n maxSizeBytes: number\r\n maxFiles: number\r\n}\r\n\r\nexport interface IUploadParams {\r\n url: string\r\n method?: MethodValue\r\n body?: string | FormData | ArrayBuffer | Blob | File | URLSearchParams\r\n fields?: { [name: string]: string | Blob }\r\n headers?: { [name: string]: string }\r\n meta?: { [name: string]: any }\r\n}\r\n\r\nexport type CustomizationFunction<T> = (allFiles: IFileWithMeta[], extra: IExtra) => T\r\n\r\nexport interface IStyleCustomization<T> {\r\n dropzone?: T | CustomizationFunction<T>\r\n dropzoneActive?: T | CustomizationFunction<T>\r\n dropzoneReject?: T | CustomizationFunction<T>\r\n dropzoneDisabled?: T | CustomizationFunction<T>\r\n input?: T | CustomizationFunction<T>\r\n inputLabel?: T | CustomizationFunction<T>\r\n inputLabelWithFiles?: T | CustomizationFunction<T>\r\n preview?: T | CustomizationFunction<T>\r\n previewImage?: T | CustomizationFunction<T>\r\n submitButtonContainer?: T | CustomizationFunction<T>\r\n submitButton?: T | CustomizationFunction<T>\r\n}\r\n\r\nexport interface IExtraLayout extends IExtra {\r\n onFiles(files: File[]): void\r\n onCancelFile(file: IFileWithMeta): void\r\n onRemoveFile(file: IFileWithMeta): void\r\n onRestartFile(file: IFileWithMeta): void\r\n}\r\n\r\nexport interface ILayoutProps {\r\n files: IFileWithMeta[]\r\n extra: IExtraLayout\r\n input: React.ReactNode\r\n previews: React.ReactNode[] | null\r\n submitButton: React.ReactNode\r\n dropzoneProps: {\r\n ref: React.RefObject<HTMLDivElement>\r\n className: string\r\n style?: React.CSSProperties\r\n onDragEnter(event: React.DragEvent<HTMLElement>): void\r\n onDragOver(event: React.DragEvent<HTMLElement>): void\r\n onDragLeave(event: React.DragEvent<HTMLElement>): void\r\n onDrop(event: React.DragEvent<HTMLElement>): void\r\n }\r\n}\r\n\r\ninterface ICommonProps {\r\n files: IFileWithMeta[]\r\n extra: IExtra\r\n}\r\n\r\nexport interface IPreviewProps extends ICommonProps {\r\n meta: IMeta\r\n className?: string\r\n imageClassName?: string\r\n style?: React.CSSProperties\r\n imageStyle?: React.CSSProperties\r\n fileWithMeta: IFileWithMeta\r\n isUpload: boolean\r\n canCancel: boolean\r\n canRemove: boolean\r\n canRestart: boolean\r\n}\r\n\r\nexport interface IInputProps extends ICommonProps {\r\n className?: string\r\n labelClassName?: string\r\n labelWithFilesClassName?: string\r\n style?: React.CSSProperties\r\n labelStyle?: React.CSSProperties\r\n labelWithFilesStyle?: React.CSSProperties\r\n getFilesFromEvent: (event: React.ChangeEvent<HTMLInputElement>) => Promise<File[]>\r\n accept: string\r\n multiple: boolean\r\n disabled: boolean\r\n content?: React.ReactNode\r\n withFilesContent?: React.ReactNode\r\n onFiles: (files: File[]) => void\r\n}\r\n\r\nexport interface ISubmitButtonProps extends ICommonProps {\r\n className?: string\r\n buttonClassName?: string\r\n style?: React.CSSProperties\r\n buttonStyle?: React.CSSProperties\r\n disabled: boolean\r\n content?: React.ReactNode\r\n onSubmit: (files: IFileWithMeta[]) => void\r\n}\r\n\r\ntype ReactComponent<Props> = (props: Props) => React.ReactNode | React.Component<Props>\r\n\r\nexport interface IDropzoneProps {\r\n onChangeStatus?(\r\n file: IFileWithMeta,\r\n status: StatusValue,\r\n allFiles: IFileWithMeta[],\r\n ): { meta: { [name: string]: any } } | void\r\n getUploadParams?(file: IFileWithMeta): IUploadParams | Promise<IUploadParams>\r\n onSubmit?(successFiles: IFileWithMeta[], allFiles: IFileWithMeta[]): void\r\n\r\n getFilesFromEvent?: (\r\n event: React.DragEvent<HTMLElement> | React.ChangeEvent<HTMLInputElement>,\r\n ) => Promise<File[]> | File[]\r\n getDataTransferItemsFromEvent?: (\r\n event: React.DragEvent<HTMLElement>,\r\n ) => Promise<DataTransferItem[]> | DataTransferItem[]\r\n\r\n accept: string\r\n multiple: boolean\r\n minSizeBytes: number\r\n maxSizeBytes: number\r\n maxFiles: number\r\n\r\n validate?(file: IFileWithMeta): any // usually a string, but can be anything\r\n\r\n autoUpload: boolean\r\n timeout?: number\r\n\r\n initialFiles?: File[]\r\n\r\n /* component customization */\r\n disabled: boolean | CustomizationFunction<boolean>\r\n\r\n canCancel: boolean | CustomizationFunction<boolean>\r\n canRemove: boolean | CustomizationFunction<boolean>\r\n canRestart: boolean | CustomizationFunction<boolean>\r\n\r\n inputContent: React.ReactNode | CustomizationFunction<React.ReactNode>\r\n inputWithFilesContent: React.ReactNode | CustomizationFunction<React.ReactNode>\r\n\r\n submitButtonDisabled: boolean | CustomizationFunction<boolean>\r\n submitButtonContent: React.ReactNode | CustomizationFunction<React.ReactNode>\r\n\r\n classNames: IStyleCustomization<string>\r\n styles: IStyleCustomization<React.CSSProperties>\r\n addClassNames: IStyleCustomization<string>\r\n\r\n /* component injection */\r\n LayoutComponent?: ReactComponent<ILayoutProps>\r\n PreviewComponent?: ReactComponent<IPreviewProps>\r\n InputComponent?: ReactComponent<IInputProps>\r\n SubmitButtonComponent?: ReactComponent<ISubmitButtonProps>\r\n}\r\n\r\nclass Dropzone extends React.Component<IDropzoneProps, { active: boolean; dragged: (File | DataTransferItem)[] }> {\r\n static defaultProps: IDropzoneProps\r\n protected files: IFileWithMeta[]\r\n protected mounted: boolean\r\n protected dropzone: React.RefObject<HTMLDivElement>\r\n protected dragTimeoutId?: number\r\n\r\n constructor(props: IDropzoneProps) {\r\n super(props)\r\n this.state = {\r\n active: false,\r\n dragged: [],\r\n }\r\n this.files = []\r\n this.mounted = true\r\n this.dropzone = React.createRef()\r\n }\r\n\r\n componentDidMount() {\r\n if (this.props.initialFiles) this.handleFiles(this.props.initialFiles)\r\n }\r\n\r\n componentDidUpdate(prevProps: IDropzoneProps) {\r\n const { initialFiles } = this.props\r\n if (prevProps.initialFiles !== initialFiles && initialFiles) this.handleFiles(initialFiles)\r\n }\r\n\r\n componentWillUnmount() {\r\n this.mounted = false\r\n for (const fileWithMeta of this.files) this.handleCancel(fileWithMeta)\r\n }\r\n\r\n forceUpdate = () => {\r\n if (this.mounted) super.forceUpdate()\r\n }\r\n\r\n getFilesFromEvent = () => {\r\n return this.props.getFilesFromEvent || defaultGetFilesFromEvent\r\n }\r\n\r\n getDataTransferItemsFromEvent = () => {\r\n return this.props.getDataTransferItemsFromEvent || defaultGetFilesFromEvent\r\n }\r\n\r\n handleDragEnter = async (e: React.DragEvent<HTMLElement>) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n const dragged = (await this.getDataTransferItemsFromEvent()(e)) as DataTransferItem[]\r\n this.setState({ active: true, dragged })\r\n }\r\n\r\n handleDragOver = async (e: React.DragEvent<HTMLElement>) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n clearTimeout(this.dragTimeoutId)\r\n const dragged = await this.getDataTransferItemsFromEvent()(e)\r\n this.setState({ active: true, dragged })\r\n }\r\n\r\n handleDragLeave = (e: React.DragEvent<HTMLElement>) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n // prevents repeated toggling of `active` state when file is dragged over children of uploader\r\n // see: https://www.smashingmagazine.com/2018/01/drag-drop-file-uploader-vanilla-js/\r\n this.dragTimeoutId = window.setTimeout(() => this.setState({ active: false, dragged: [] }), 150)\r\n }\r\n\r\n handleDrop = async (e: React.DragEvent<HTMLElement>) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n this.setState({ active: false, dragged: [] })\r\n const files = (await this.getFilesFromEvent()(e)) as File[]\r\n this.handleFiles(files)\r\n }\r\n\r\n handleDropDisabled = (e: React.DragEvent<HTMLElement>) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n this.setState({ active: false, dragged: [] })\r\n }\r\n\r\n handleChangeStatus = (fileWithMeta: IFileWithMeta) => {\r\n if (!this.props.onChangeStatus) return\r\n const { meta = {} } = this.props.onChangeStatus(fileWithMeta, fileWithMeta.meta.status, this.files) || {}\r\n if (meta) {\r\n delete meta.status\r\n fileWithMeta.meta = { ...fileWithMeta.meta, ...meta }\r\n this.forceUpdate()\r\n }\r\n }\r\n\r\n handleSubmit = (files: IFileWithMeta[]) => {\r\n if (this.props.onSubmit) this.props.onSubmit(files, [...this.files])\r\n }\r\n\r\n handleCancel = (fileWithMeta: IFileWithMeta) => {\r\n if (fileWithMeta.meta.status !== 'uploading') return\r\n fileWithMeta.meta.status = 'aborted'\r\n if (fileWithMeta.xhr) fileWithMeta.xhr.abort()\r\n this.handleChangeStatus(fileWithMeta)\r\n this.forceUpdate()\r\n }\r\n\r\n handleRemove = (fileWithMeta: IFileWithMeta) => {\r\n const index = this.files.findIndex(f => f === fileWithMeta)\r\n if (index !== -1) {\r\n URL.revokeObjectURL(fileWithMeta.meta.previewUrl || '')\r\n fileWithMeta.meta.status = 'removed'\r\n this.handleChangeStatus(fileWithMeta)\r\n this.files.splice(index, 1)\r\n this.forceUpdate()\r\n }\r\n }\r\n\r\n handleRestart = (fileWithMeta: IFileWithMeta) => {\r\n if (!this.props.getUploadParams) return\r\n\r\n if (fileWithMeta.meta.status === 'ready') fileWithMeta.meta.status = 'started'\r\n else fileWithMeta.meta.status = 'restarted'\r\n this.handleChangeStatus(fileWithMeta)\r\n\r\n fileWithMeta.meta.status = 'getting_upload_params'\r\n fileWithMeta.meta.percent = 0\r\n this.handleChangeStatus(fileWithMeta)\r\n this.forceUpdate()\r\n this.uploadFile(fileWithMeta)\r\n }\r\n\r\n // expects an array of File objects\r\n handleFiles = (files: File[]) => {\r\n files.forEach((f, i) => this.handleFile(f, `${new Date().getTime()}-${i}`))\r\n const { current } = this.dropzone\r\n if (current) setTimeout(() => current.scroll({ top: current.scrollHeight, behavior: 'smooth' }), 150)\r\n }\r\n\r\n handleFile = async (file: File, id: string) => {\r\n const { name, size, type, lastModified } = file\r\n const { minSizeBytes, maxSizeBytes, maxFiles, accept, getUploadParams, autoUpload, validate } = this.props\r\n\r\n const uploadedDate = new Date().toISOString()\r\n const lastModifiedDate = lastModified && new Date(lastModified).toISOString()\r\n const fileWithMeta = {\r\n file,\r\n meta: { name, size, type, lastModifiedDate, uploadedDate, percent: 0, id },\r\n } as IFileWithMeta\r\n\r\n // firefox versions prior to 53 return a bogus mime type for file drag events,\r\n // so files with that mime type are always accepted\r\n if (file.type !== 'application/x-moz-file' && !accepts(file, accept)) {\r\n fileWithMeta.meta.status = 'rejected_file_type'\r\n this.handleChangeStatus(fileWithMeta)\r\n return\r\n }\r\n if (this.files.length >= maxFiles) {\r\n fileWithMeta.meta.status = 'rejected_max_files'\r\n this.handleChangeStatus(fileWithMeta)\r\n return\r\n }\r\n\r\n fileWithMeta.cancel = () => this.handleCancel(fileWithMeta)\r\n fileWithMeta.remove = () => this.handleRemove(fileWithMeta)\r\n fileWithMeta.restart = () => this.handleRestart(fileWithMeta)\r\n\r\n fileWithMeta.meta.status = 'preparing'\r\n this.files.push(fileWithMeta)\r\n this.handleChangeStatus(fileWithMeta)\r\n this.forceUpdate()\r\n\r\n if (size < minSizeBytes || size > maxSizeBytes) {\r\n fileWithMeta.meta.status = 'error_file_size'\r\n this.handleChangeStatus(fileWithMeta)\r\n this.forceUpdate()\r\n return\r\n }\r\n\r\n await this.generatePreview(fileWithMeta)\r\n\r\n if (validate) {\r\n const error = validate(fileWithMeta)\r\n if (error) {\r\n fileWithMeta.meta.status = 'error_validation'\r\n fileWithMeta.meta.validationError = error // usually a string, but doesn't have to be\r\n this.handleChangeStatus(fileWithMeta)\r\n this.forceUpdate()\r\n return\r\n }\r\n }\r\n\r\n if (getUploadParams) {\r\n if (autoUpload) {\r\n this.uploadFile(fileWithMeta)\r\n fileWithMeta.meta.status = 'getting_upload_params'\r\n } else {\r\n fileWithMeta.meta.status = 'ready'\r\n }\r\n } else {\r\n fileWithMeta.meta.status = 'done'\r\n }\r\n this.handleChangeStatus(fileWithMeta)\r\n this.forceUpdate()\r\n }\r\n\r\n generatePreview = async (fileWithMeta: IFileWithMeta) => {\r\n const {\r\n meta: { type },\r\n file,\r\n } = fileWithMeta\r\n const isImage = type.startsWith('image/')\r\n const isAudio = type.startsWith('audio/')\r\n const isVideo = type.startsWith('video/')\r\n if (!isImage && !isAudio && !isVideo) return\r\n\r\n const objectUrl = URL.createObjectURL(file)\r\n\r\n const fileCallbackToPromise = (fileObj: HTMLImageElement | HTMLAudioElement) => {\r\n return Promise.race([\r\n new Promise(resolve => {\r\n if (fileObj instanceof HTMLImageElement) fileObj.onload = resolve\r\n else fileObj.onloadedmetadata = resolve\r\n }),\r\n new Promise((_, reject) => {\r\n setTimeout(reject, 1000)\r\n }),\r\n ])\r\n }\r\n\r\n try {\r\n if (isImage) {\r\n const img = new Image()\r\n img.src = objectUrl\r\n fileWithMeta.meta.previewUrl = objectUrl\r\n await fileCallbackToPromise(img)\r\n fileWithMeta.meta.width = img.width\r\n fileWithMeta.meta.height = img.height\r\n }\r\n\r\n if (isAudio) {\r\n const audio = new Audio()\r\n audio.src = objectUrl\r\n await fileCallbackToPromise(audio)\r\n fileWithMeta.meta.duration = audio.duration\r\n }\r\n\r\n if (isVideo) {\r\n const video = document.createElement('video')\r\n video.src = objectUrl\r\n await fileCallbackToPromise(video)\r\n fileWithMeta.meta.duration = video.duration\r\n fileWithMeta.meta.videoWidth = video.videoWidth\r\n fileWithMeta.meta.videoHeight = video.videoHeight\r\n }\r\n if (!isImage) URL.revokeObjectURL(objectUrl)\r\n } catch (e) {\r\n URL.revokeObjectURL(objectUrl)\r\n }\r\n this.forceUpdate()\r\n }\r\n\r\n uploadFile = async (fileWithMeta: IFileWithMeta) => {\r\n const { getUploadParams } = this.props\r\n if (!getUploadParams) return\r\n let params: IUploadParams | null = null\r\n try {\r\n params = await getUploadParams(fileWithMeta)\r\n } catch (e) {\r\n console.error('Error Upload Params', e.stack)\r\n }\r\n if (params === null) return\r\n const { url, method = 'POST', body, fields = {}, headers = {}, meta: extraMeta = {} } = params\r\n delete extraMeta.status\r\n\r\n if (!url) {\r\n fileWithMeta.meta.status = 'error_upload_params'\r\n this.handleChangeStatus(fileWithMeta)\r\n this.forceUpdate()\r\n return\r\n }\r\n\r\n const xhr = new XMLHttpRequest()\r\n const formData = new FormData()\r\n xhr.open(method, url, true)\r\n\r\n for (const field of Object.keys(fields)) formData.append(field, fields[field])\r\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest')\r\n for (const header of Object.keys(headers)) xhr.setRequestHeader(header, headers[header])\r\n fileWithMeta.meta = { ...fileWithMeta.meta, ...extraMeta }\r\n\r\n // update progress (can be used to show progress indicator)\r\n xhr.upload.addEventListener('progress', e => {\r\n fileWithMeta.meta.percent = (e.loaded * 100.0) / e.total || 100\r\n this.forceUpdate()\r\n })\r\n\r\n xhr.addEventListener('readystatechange', () => {\r\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState\r\n if (xhr.readyState !== 2 && xhr.readyState !== 4) return\r\n\r\n if (xhr.status === 0 && fileWithMeta.meta.status !== 'aborted') {\r\n fileWithMeta.meta.status = 'exception_upload'\r\n this.handleChangeStatus(fileWithMeta)\r\n this.forceUpdate()\r\n }\r\n\r\n if (xhr.status > 0 && xhr.status < 400) {\r\n fileWithMeta.meta.percent = 100\r\n if (xhr.readyState === 2) fileWithMeta.meta.status = 'headers_received'\r\n if (xhr.readyState === 4) fileWithMeta.meta.status = 'done'\r\n this.handleChangeStatus(fileWithMeta)\r\n this.forceUpdate()\r\n }\r\n\r\n if (xhr.status >= 400 && fileWithMeta.meta.status !== 'error_upload') {\r\n fileWithMeta.meta.status = 'error_upload'\r\n this.handleChangeStatus(fileWithMeta)\r\n this.forceUpdate()\r\n }\r\n })\r\n\r\n formData.append('file', fileWithMeta.file)\r\n if (this.props.timeout) xhr.timeout = this.props.timeout\r\n xhr.send(body || formData)\r\n fileWithMeta.xhr = xhr\r\n fileWithMeta.meta.status = 'uploading'\r\n this.handleChangeStatus(fileWithMeta)\r\n this.forceUpdate()\r\n }\r\n\r\n render() {\r\n const {\r\n accept,\r\n multiple,\r\n maxFiles,\r\n minSizeBytes,\r\n maxSizeBytes,\r\n onSubmit,\r\n getUploadParams,\r\n disabled,\r\n canCancel,\r\n canRemove,\r\n canRestart,\r\n inputContent,\r\n inputWithFilesContent,\r\n submitButtonDisabled,\r\n submitButtonContent,\r\n classNames,\r\n styles,\r\n addClassNames,\r\n InputComponent,\r\n PreviewComponent,\r\n SubmitButtonComponent,\r\n LayoutComponent,\r\n } = this.props\r\n\r\n const { active, dragged } = this.state\r\n\r\n const reject = dragged.some(file => file.type !== 'application/x-moz-file' && !accepts(file as File, accept))\r\n const extra = { active, reject, dragged, accept, multiple, minSizeBytes, maxSizeBytes, maxFiles } as IExtra\r\n const files = [...this.files]\r\n const dropzoneDisabled = resolveValue(disabled, files, extra)\r\n\r\n const {\r\n classNames: {\r\n dropzone: dropzoneClassName,\r\n dropzoneActive: dropzoneActiveClassName,\r\n dropzoneReject: dropzoneRejectClassName,\r\n dropzoneDisabled: dropzoneDisabledClassName,\r\n input: inputClassName,\r\n inputLabel: inputLabelClassName,\r\n inputLabelWithFiles: inputLabelWithFilesClassName,\r\n preview: previewClassName,\r\n previewImage: previewImageClassName,\r\n submitButtonContainer: submitButtonContainerClassName,\r\n submitButton: submitButtonClassName,\r\n },\r\n styles: {\r\n dropzone: dropzoneStyle,\r\n dropzoneActive: dropzoneActiveStyle,\r\n dropzoneReject: dropzoneRejectStyle,\r\n dropzoneDisabled: dropzoneDisabledStyle,\r\n input: inputStyle,\r\n inputLabel: inputLabelStyle,\r\n inputLabelWithFiles: inputLabelWithFilesStyle,\r\n preview: previewStyle,\r\n previewImage: previewImageStyle,\r\n submitButtonContainer: submitButtonContainerStyle,\r\n submitButton: submitButtonStyle,\r\n },\r\n } = mergeStyles(classNames, styles, addClassNames, files, extra)\r\n\r\n const Input = InputComponent || InputDefault\r\n const Preview = PreviewComponent || PreviewDefault\r\n const SubmitButton = SubmitButtonComponent || SubmitButtonDefault\r\n const Layout = LayoutComponent || LayoutDefault\r\n\r\n let previews = null\r\n if (PreviewComponent !== null) {\r\n previews = files.map(f => {\r\n return (\r\n //@ts-ignore\r\n <Preview\r\n className={previewClassName}\r\n imageClassName={previewImageClassName}\r\n style={previewStyle as React.CSSProperties}\r\n imageStyle={previewImageStyle as React.CSSProperties}\r\n key={f.meta.id}\r\n fileWithMeta={f}\r\n meta={{ ...f.meta }}\r\n isUpload={Boolean(getUploadParams)}\r\n canCancel={resolveValue(canCancel, files, extra)}\r\n canRemove={resolveValue(canRemove, files, extra)}\r\n canRestart={resolveValue(canRestart, files, extra)}\r\n files={files}\r\n extra={extra}\r\n />\r\n )\r\n })\r\n }\r\n\r\n const input =\r\n InputComponent !== null ? (\r\n //@ts-ignore\r\n <Input\r\n className={inputClassName}\r\n labelClassName={inputLabelClassName}\r\n labelWithFilesClassName={inputLabelWithFilesClassName}\r\n style={inputStyle as React.CSSProperties}\r\n labelStyle={inputLabelStyle as React.CSSProperties}\r\n labelWithFilesStyle={inputLabelWithFilesStyle as React.CSSProperties}\r\n getFilesFromEvent={this.getFilesFromEvent() as IInputProps['getFilesFromEvent']}\r\n accept={accept}\r\n multiple={multiple}\r\n disabled={dropzoneDisabled}\r\n content={resolveValue(inputContent, files, extra)}\r\n withFilesContent={resolveValue(inputWithFilesContent, files, extra)}\r\n onFiles={this.handleFiles} // see: https://stackoverflow.com/questions/39484895\r\n files={files}\r\n extra={extra}\r\n />\r\n ) : null\r\n\r\n const submitButton =\r\n onSubmit && SubmitButtonComponent !== null ? (\r\n //@ts-ignore\r\n <SubmitButton\r\n className={submitButtonContainerClassName}\r\n buttonClassName={submitButtonClassName}\r\n style={submitButtonContainerStyle as React.CSSProperties}\r\n buttonStyle={submitButtonStyle as React.CSSProperties}\r\n disabled={resolveValue(submitButtonDisabled, files, extra)}\r\n content={resolveValue(submitButtonContent, files, extra)}\r\n onSubmit={this.handleSubmit}\r\n files={files}\r\n extra={extra}\r\n />\r\n ) : null\r\n\r\n let className = dropzoneClassName\r\n let style = dropzoneStyle\r\n\r\n if (dropzoneDisabled) {\r\n className = `${className} ${dropzoneDisabledClassName}`\r\n style = { ...(style || {}), ...(dropzoneDisabledStyle || {}) }\r\n } else if (reject) {\r\n className = `${className} ${dropzoneRejectClassName}`\r\n style = { ...(style || {}), ...(dropzoneRejectStyle || {}) }\r\n } else if (active) {\r\n className = `${className} ${dropzoneActiveClassName}`\r\n style = { ...(style || {}), ...(dropzoneActiveStyle || {}) }\r\n }\r\n\r\n return (\r\n //@ts-ignore\r\n <Layout\r\n input={input}\r\n previews={previews}\r\n submitButton={submitButton}\r\n dropzoneProps={{\r\n ref: this.dropzone,\r\n className,\r\n style: style as React.CSSProperties,\r\n onDragEnter: this.handleDragEnter,\r\n onDragOver: this.handleDragOver,\r\n onDragLeave: this.handleDragLeave,\r\n onDrop: dropzoneDisabled ? this.handleDropDisabled : this.handleDrop,\r\n }}\r\n files={files}\r\n extra={\r\n {\r\n ...extra,\r\n onFiles: this.handleFiles,\r\n onCancelFile: this.handleCancel,\r\n onRemoveFile: this.handleRemove,\r\n onRestartFile: this.handleRestart,\r\n } as IExtraLayout\r\n }\r\n />\r\n )\r\n }\r\n}\r\n\r\nDropzone.defaultProps = {\r\n accept: '*',\r\n multiple: true,\r\n minSizeBytes: 0,\r\n maxSizeBytes: Number.MAX_SAFE_INTEGER,\r\n maxFiles: Number.MAX_SAFE_INTEGER,\r\n autoUpload: true,\r\n disabled: false,\r\n canCancel: true,\r\n canRemove: true,\r\n canRestart: true,\r\n inputContent: 'Drag Files or Click to Browse',\r\n inputWithFilesContent: 'Add Files',\r\n submitButtonDisabled: false,\r\n submitButtonContent: 'Submit',\r\n classNames: {},\r\n styles: {},\r\n addClassNames: {},\r\n}\r\n\r\n// @ts-ignore\r\nDropzone.propTypes = {\r\n onChangeStatus: PropTypes.func,\r\n getUploadParams: PropTypes.func,\r\n onSubmit: PropTypes.func,\r\n\r\n getFilesFromEvent: PropTypes.func,\r\n getDataTransferItemsFromEvent: PropTypes.func,\r\n\r\n accept: PropTypes.string,\r\n multiple: PropTypes.bool,\r\n minSizeBytes: PropTypes.number.isRequired,\r\n maxSizeBytes: PropTypes.number.isRequired,\r\n maxFiles: PropTypes.number.isRequired,\r\n\r\n validate: PropTypes.func,\r\n\r\n autoUpload: PropTypes.bool,\r\n timeout: PropTypes.number,\r\n\r\n initialFiles: PropTypes.arrayOf(PropTypes.any),\r\n\r\n /* component customization */\r\n disabled: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),\r\n\r\n canCancel: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),\r\n canRemove: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),\r\n canRestart: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),\r\n\r\n inputContent: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),\r\n inputWithFilesContent: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),\r\n\r\n submitButtonDisabled: PropTypes.oneOfType([PropTypes.bool, PropTypes.func]),\r\n submitButtonContent: PropTypes.oneOfType([PropTypes.node, PropTypes.func]),\r\n\r\n classNames: PropTypes.object.isRequired,\r\n styles: PropTypes.object.isRequired,\r\n addClassNames: PropTypes.object.isRequired,\r\n\r\n /* component injection */\r\n InputComponent: PropTypes.func,\r\n PreviewComponent: PropTypes.func,\r\n SubmitButtonComponent: PropTypes.func,\r\n LayoutComponent: PropTypes.func,\r\n}\r\n\r\nexport default Dropzone\r\nexport {\r\n LayoutDefault as Layout,\r\n InputDefault as Input,\r\n PreviewDefault as Preview,\r\n SubmitButtonDefault as SubmitButton,\r\n formatBytes,\r\n formatDuration,\r\n accepts,\r\n defaultClassNames,\r\n defaultGetFilesFromEvent as getFilesFromEvent,\r\n}\r\n"],"names":["defaultGetFilesFromEvent","Input","InputDefault","Preview","PreviewDefault","SubmitButton","SubmitButtonDefault","Layout","LayoutDefault"],"mappings":"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"}