@aws-amplify/ui-react-storage 3.3.2 → 3.3.4
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/esm/components/FileUploader/FileUploader.mjs +2 -4
- package/dist/esm/components/FileUploader/hooks/useFileUploader/actions.mjs +8 -5
- package/dist/esm/components/FileUploader/hooks/useFileUploader/reducer.mjs +16 -28
- package/dist/esm/components/FileUploader/hooks/useFileUploader/types.mjs +9 -8
- package/dist/esm/components/FileUploader/hooks/useFileUploader/useFileUploader.mjs +31 -44
- package/dist/esm/components/FileUploader/hooks/useUploadFiles/useUploadFiles.mjs +5 -9
- package/dist/esm/components/FileUploader/utils/getInput.mjs +1 -5
- package/dist/esm/components/StorageManager/StorageManager.mjs +9 -11
- package/dist/esm/components/StorageManager/ui/FileList/FileControl.mjs +1 -1
- package/dist/esm/components/StorageManager/ui/FileList/FileList.mjs +1 -1
- package/dist/esm/components/StorageManager/ui/FileList/FileStatusMessage.mjs +1 -1
- package/dist/esm/version.mjs +1 -1
- package/dist/index.js +115 -569
- package/dist/styles.css +62 -23
- package/dist/types/components/FileUploader/hooks/useFileUploader/actions.d.ts +4 -4
- package/dist/types/components/FileUploader/hooks/useFileUploader/types.d.ts +12 -10
- package/dist/types/components/FileUploader/hooks/useFileUploader/useFileUploader.d.ts +7 -10
- package/dist/types/components/FileUploader/hooks/useUploadFiles/useUploadFiles.d.ts +1 -5
- package/dist/types/components/FileUploader/index.d.ts +1 -1
- package/dist/types/components/FileUploader/types.d.ts +1 -1
- package/dist/types/components/FileUploader/utils/getInput.d.ts +1 -4
- package/dist/types/components/StorageManager/index.d.ts +1 -1
- package/dist/types/components/StorageManager/types.d.ts +2 -9
- package/dist/types/components/StorageManager/ui/DropZone/types.d.ts +1 -1
- package/dist/types/components/StorageManager/ui/FileList/types.d.ts +2 -2
- package/dist/types/components/StorageManager/ui/FileListFooter/FileListFooter.d.ts +1 -1
- package/dist/types/components/StorageManager/ui/FileListHeader/FileListHeader.d.ts +1 -1
- package/dist/types/components/index.d.ts +2 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/version.d.ts +1 -1
- package/package.json +4 -4
- package/dist/esm/components/StorageManager/hooks/useStorageManager/actions.mjs +0 -39
- package/dist/esm/components/StorageManager/hooks/useStorageManager/reducer.mjs +0 -93
- package/dist/esm/components/StorageManager/hooks/useStorageManager/types.mjs +0 -13
- package/dist/esm/components/StorageManager/hooks/useStorageManager/useStorageManager.mjs +0 -62
- package/dist/esm/components/StorageManager/hooks/useUploadFiles/useUploadFiles.mjs +0 -79
- package/dist/esm/components/StorageManager/types.mjs +0 -11
- package/dist/esm/components/StorageManager/utils/checkMaxFileSize.mjs +0 -12
- package/dist/esm/components/StorageManager/utils/displayText.mjs +0 -39
- package/dist/esm/components/StorageManager/utils/filterAllowedFiles.mjs +0 -27
- package/dist/esm/components/StorageManager/utils/getInput.mjs +0 -39
- package/dist/esm/components/StorageManager/utils/resolveFile.mjs +0 -20
- package/dist/esm/components/StorageManager/utils/uploadFile.mjs +0 -26
- package/dist/types/components/StorageManager/hooks/index.d.ts +0 -2
- package/dist/types/components/StorageManager/hooks/useStorageManager/actions.d.ts +0 -22
- package/dist/types/components/StorageManager/hooks/useStorageManager/index.d.ts +0 -1
- package/dist/types/components/StorageManager/hooks/useStorageManager/reducer.d.ts +0 -2
- package/dist/types/components/StorageManager/hooks/useStorageManager/types.d.ts +0 -50
- package/dist/types/components/StorageManager/hooks/useStorageManager/useStorageManager.d.ts +0 -35
- package/dist/types/components/StorageManager/hooks/useUploadFiles/index.d.ts +0 -1
- package/dist/types/components/StorageManager/hooks/useUploadFiles/useUploadFiles.d.ts +0 -12
- package/dist/types/components/StorageManager/utils/checkMaxFileSize.d.ts +0 -5
- package/dist/types/components/StorageManager/utils/displayText.d.ts +0 -22
- package/dist/types/components/StorageManager/utils/filterAllowedFiles.d.ts +0 -1
- package/dist/types/components/StorageManager/utils/getInput.d.ts +0 -17
- package/dist/types/components/StorageManager/utils/index.d.ts +0 -5
- package/dist/types/components/StorageManager/utils/resolveFile.d.ts +0 -9
- package/dist/types/components/StorageManager/utils/uploadFile.d.ts +0 -32
package/dist/index.js
CHANGED
|
@@ -33,7 +33,7 @@ function _interopNamespace(e) {
|
|
|
33
33
|
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
34
34
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
35
35
|
|
|
36
|
-
var FileStatus
|
|
36
|
+
var FileStatus;
|
|
37
37
|
(function (FileStatus) {
|
|
38
38
|
FileStatus["ADDED"] = "added";
|
|
39
39
|
FileStatus["QUEUED"] = "queued";
|
|
@@ -41,21 +41,22 @@ var FileStatus$1;
|
|
|
41
41
|
FileStatus["PAUSED"] = "paused";
|
|
42
42
|
FileStatus["ERROR"] = "error";
|
|
43
43
|
FileStatus["UPLOADED"] = "uploaded";
|
|
44
|
-
})(FileStatus
|
|
44
|
+
})(FileStatus || (FileStatus = {}));
|
|
45
45
|
|
|
46
46
|
var FileUploaderActionTypes;
|
|
47
47
|
(function (FileUploaderActionTypes) {
|
|
48
|
-
FileUploaderActionTypes["ADD_FILES"] = "ADD_FILES";
|
|
49
|
-
FileUploaderActionTypes["CLEAR_FILES"] = "CLEAR_FILES";
|
|
50
|
-
FileUploaderActionTypes["QUEUE_FILES"] = "QUEUE_FILES";
|
|
51
|
-
FileUploaderActionTypes["
|
|
52
|
-
FileUploaderActionTypes["
|
|
53
|
-
FileUploaderActionTypes["
|
|
54
|
-
FileUploaderActionTypes["
|
|
55
|
-
FileUploaderActionTypes["
|
|
48
|
+
FileUploaderActionTypes[FileUploaderActionTypes["ADD_FILES"] = 0] = "ADD_FILES";
|
|
49
|
+
FileUploaderActionTypes[FileUploaderActionTypes["CLEAR_FILES"] = 1] = "CLEAR_FILES";
|
|
50
|
+
FileUploaderActionTypes[FileUploaderActionTypes["QUEUE_FILES"] = 2] = "QUEUE_FILES";
|
|
51
|
+
FileUploaderActionTypes[FileUploaderActionTypes["REMOVE_UPLOAD"] = 3] = "REMOVE_UPLOAD";
|
|
52
|
+
FileUploaderActionTypes[FileUploaderActionTypes["SET_STATUS"] = 4] = "SET_STATUS";
|
|
53
|
+
FileUploaderActionTypes[FileUploaderActionTypes["SET_PROCESSED_FILE_KEY"] = 5] = "SET_PROCESSED_FILE_KEY";
|
|
54
|
+
FileUploaderActionTypes[FileUploaderActionTypes["SET_STATUS_UPLOADED"] = 6] = "SET_STATUS_UPLOADED";
|
|
55
|
+
FileUploaderActionTypes[FileUploaderActionTypes["SET_STATUS_UPLOADING"] = 7] = "SET_STATUS_UPLOADING";
|
|
56
|
+
FileUploaderActionTypes[FileUploaderActionTypes["SET_UPLOAD_PROGRESS"] = 8] = "SET_UPLOAD_PROGRESS";
|
|
56
57
|
})(FileUploaderActionTypes || (FileUploaderActionTypes = {}));
|
|
57
58
|
|
|
58
|
-
const updateFiles
|
|
59
|
+
const updateFiles = (files, nextFileData) => files.reduce((files, currentFile) => {
|
|
59
60
|
if (currentFile.id === nextFileData.id) {
|
|
60
61
|
return [...files, { ...currentFile, ...nextFileData }];
|
|
61
62
|
}
|
|
@@ -74,7 +75,7 @@ function fileUploaderStateReducer(state, action) {
|
|
|
74
75
|
file,
|
|
75
76
|
error: errorText,
|
|
76
77
|
key: file.name,
|
|
77
|
-
status: errorText ? FileStatus
|
|
78
|
+
status: errorText ? FileStatus.ERROR : status,
|
|
78
79
|
isImage: file.type.startsWith('image/'),
|
|
79
80
|
progress: -1,
|
|
80
81
|
};
|
|
@@ -87,155 +88,132 @@ function fileUploaderStateReducer(state, action) {
|
|
|
87
88
|
}
|
|
88
89
|
case FileUploaderActionTypes.QUEUE_FILES: {
|
|
89
90
|
const { files } = state;
|
|
90
|
-
const newFiles = files.reduce((files, currentFile) =>
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}, []);
|
|
101
|
-
return {
|
|
102
|
-
...state,
|
|
103
|
-
files: newFiles,
|
|
104
|
-
};
|
|
91
|
+
const newFiles = files.reduce((files, currentFile) => [
|
|
92
|
+
...files,
|
|
93
|
+
{
|
|
94
|
+
...currentFile,
|
|
95
|
+
...(currentFile.status === FileStatus.ADDED
|
|
96
|
+
? { status: FileStatus.QUEUED }
|
|
97
|
+
: {}),
|
|
98
|
+
},
|
|
99
|
+
], []);
|
|
100
|
+
return { ...state, files: newFiles };
|
|
105
101
|
}
|
|
106
102
|
case FileUploaderActionTypes.SET_STATUS_UPLOADING: {
|
|
107
103
|
const { id, uploadTask } = action;
|
|
108
|
-
const status = FileStatus
|
|
104
|
+
const status = FileStatus.UPLOADING;
|
|
109
105
|
const progress = 0;
|
|
110
106
|
const nextFileData = { status, progress, id, uploadTask };
|
|
111
|
-
const files = updateFiles
|
|
107
|
+
const files = updateFiles(state.files, nextFileData);
|
|
112
108
|
return { ...state, files };
|
|
113
109
|
}
|
|
114
|
-
case FileUploaderActionTypes.
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
return { files };
|
|
110
|
+
case FileUploaderActionTypes.SET_STATUS_UPLOADED: {
|
|
111
|
+
const files = updateFiles(state.files, action);
|
|
112
|
+
return { ...state, files };
|
|
118
113
|
}
|
|
119
114
|
case FileUploaderActionTypes.SET_UPLOAD_PROGRESS: {
|
|
120
115
|
const { id, progress } = action;
|
|
121
|
-
const files = updateFiles
|
|
116
|
+
const files = updateFiles(state.files, { id, progress });
|
|
122
117
|
return { ...state, files };
|
|
123
118
|
}
|
|
124
119
|
case FileUploaderActionTypes.SET_STATUS: {
|
|
125
120
|
const { id, status } = action;
|
|
126
|
-
const files = updateFiles
|
|
121
|
+
const files = updateFiles(state.files, { id, status });
|
|
127
122
|
return { ...state, files };
|
|
128
123
|
}
|
|
129
124
|
case FileUploaderActionTypes.REMOVE_UPLOAD: {
|
|
130
125
|
const { id } = action;
|
|
131
126
|
const { files } = state;
|
|
132
127
|
const newFiles = files.reduce((files, currentFile) => {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
return [...files];
|
|
136
|
-
}
|
|
137
|
-
return [...files, currentFile];
|
|
128
|
+
// remove by not returning currentFile
|
|
129
|
+
return currentFile.id === id ? [...files] : [...files, currentFile];
|
|
138
130
|
}, []);
|
|
139
|
-
return {
|
|
140
|
-
...state,
|
|
141
|
-
files: newFiles,
|
|
142
|
-
};
|
|
131
|
+
return { ...state, files: newFiles };
|
|
143
132
|
}
|
|
144
133
|
}
|
|
145
134
|
}
|
|
146
135
|
|
|
147
|
-
const addFilesAction
|
|
136
|
+
const addFilesAction = ({ files, status, getFileErrorMessage, }) => ({
|
|
148
137
|
type: FileUploaderActionTypes.ADD_FILES,
|
|
149
138
|
files,
|
|
150
139
|
status,
|
|
151
140
|
getFileErrorMessage,
|
|
152
141
|
});
|
|
153
|
-
const clearFilesAction
|
|
142
|
+
const clearFilesAction = () => ({
|
|
154
143
|
type: FileUploaderActionTypes.CLEAR_FILES,
|
|
155
144
|
});
|
|
156
|
-
const queueFilesAction
|
|
145
|
+
const queueFilesAction = () => ({
|
|
157
146
|
type: FileUploaderActionTypes.QUEUE_FILES,
|
|
158
147
|
});
|
|
159
|
-
const
|
|
160
|
-
...input,
|
|
161
|
-
type: FileUploaderActionTypes.SET_PROCESSED_FILE_KEY,
|
|
162
|
-
});
|
|
163
|
-
const setUploadingFileAction$1 = ({ id, uploadTask, }) => ({
|
|
148
|
+
const setUploadingFileAction = ({ id, uploadTask, }) => ({
|
|
164
149
|
type: FileUploaderActionTypes.SET_STATUS_UPLOADING,
|
|
165
150
|
id,
|
|
166
151
|
uploadTask,
|
|
167
152
|
});
|
|
168
|
-
const setUploadProgressAction
|
|
153
|
+
const setUploadProgressAction = ({ id, progress, }) => ({
|
|
169
154
|
type: FileUploaderActionTypes.SET_UPLOAD_PROGRESS,
|
|
170
155
|
id,
|
|
171
156
|
progress,
|
|
172
157
|
});
|
|
173
|
-
const setUploadStatusAction
|
|
158
|
+
const setUploadStatusAction = ({ id, status, }) => ({
|
|
174
159
|
type: FileUploaderActionTypes.SET_STATUS,
|
|
175
160
|
id,
|
|
176
161
|
status,
|
|
177
162
|
});
|
|
178
|
-
const
|
|
163
|
+
const setUploadSuccessAction = ({ id, resolvedKey, }) => ({
|
|
164
|
+
type: FileUploaderActionTypes.SET_STATUS_UPLOADED,
|
|
165
|
+
id,
|
|
166
|
+
resolvedKey,
|
|
167
|
+
status: FileStatus.UPLOADED,
|
|
168
|
+
});
|
|
169
|
+
const removeUploadAction = ({ id }) => ({
|
|
179
170
|
type: FileUploaderActionTypes.REMOVE_UPLOAD,
|
|
180
171
|
id,
|
|
181
172
|
});
|
|
182
173
|
|
|
183
|
-
const isDefaultFile
|
|
184
|
-
const createFileFromDefault
|
|
185
|
-
? { ...file, id: file.key, status: FileStatus
|
|
174
|
+
const isDefaultFile = (file) => !!(ui.isObject(file) && file.key);
|
|
175
|
+
const createFileFromDefault = (file) => isDefaultFile(file)
|
|
176
|
+
? { ...file, id: file.key, status: FileStatus.UPLOADED }
|
|
186
177
|
: undefined;
|
|
187
178
|
function useFileUploader(defaultFiles = []) {
|
|
188
179
|
const [{ files }, dispatch] = React__default["default"].useReducer(fileUploaderStateReducer, {
|
|
189
180
|
files: (Array.isArray(defaultFiles)
|
|
190
|
-
? defaultFiles.map(createFileFromDefault
|
|
181
|
+
? defaultFiles.map(createFileFromDefault).filter((file) => !!file)
|
|
191
182
|
: []),
|
|
192
183
|
});
|
|
193
|
-
const
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
};
|
|
223
|
-
return {
|
|
224
|
-
removeUpload,
|
|
225
|
-
setProcessedKey,
|
|
226
|
-
setUploadPaused,
|
|
227
|
-
setUploadProgress,
|
|
228
|
-
setUploadResumed,
|
|
229
|
-
setUploadSuccess,
|
|
230
|
-
setUploadingFile,
|
|
231
|
-
queueFiles,
|
|
232
|
-
addFiles,
|
|
233
|
-
clearFiles,
|
|
234
|
-
files,
|
|
235
|
-
};
|
|
184
|
+
const dispatchers = React__default["default"].useMemo(() => ({
|
|
185
|
+
addFiles: (params) => {
|
|
186
|
+
dispatch(addFilesAction(params));
|
|
187
|
+
},
|
|
188
|
+
clearFiles: () => {
|
|
189
|
+
dispatch(clearFilesAction());
|
|
190
|
+
},
|
|
191
|
+
queueFiles: () => {
|
|
192
|
+
dispatch(queueFilesAction());
|
|
193
|
+
},
|
|
194
|
+
setUploadingFile: (params) => {
|
|
195
|
+
dispatch(setUploadingFileAction(params));
|
|
196
|
+
},
|
|
197
|
+
setUploadProgress: (params) => {
|
|
198
|
+
dispatch(setUploadProgressAction(params));
|
|
199
|
+
},
|
|
200
|
+
setUploadSuccess: (params) => {
|
|
201
|
+
dispatch(setUploadSuccessAction(params));
|
|
202
|
+
},
|
|
203
|
+
setUploadPaused: ({ id }) => {
|
|
204
|
+
dispatch(setUploadStatusAction({ id, status: FileStatus.PAUSED }));
|
|
205
|
+
},
|
|
206
|
+
setUploadResumed: ({ id }) => {
|
|
207
|
+
dispatch(setUploadStatusAction({ id, status: FileStatus.UPLOADING }));
|
|
208
|
+
},
|
|
209
|
+
removeUpload: ({ id }) => {
|
|
210
|
+
dispatch(removeUploadAction({ id }));
|
|
211
|
+
},
|
|
212
|
+
}), []);
|
|
213
|
+
return { ...dispatchers, files };
|
|
236
214
|
}
|
|
237
215
|
|
|
238
|
-
const checkMaxFileSize
|
|
216
|
+
const checkMaxFileSize = ({ file, getFileSizeErrorText, maxFileSize, }) => {
|
|
239
217
|
if (maxFileSize === undefined)
|
|
240
218
|
return '';
|
|
241
219
|
if (file.size > maxFileSize) {
|
|
@@ -282,7 +260,7 @@ const defaultFileUploaderDisplayText = {
|
|
|
282
260
|
},
|
|
283
261
|
};
|
|
284
262
|
|
|
285
|
-
const filterAllowedFiles
|
|
263
|
+
const filterAllowedFiles = (files, acceptedFileTypes) => {
|
|
286
264
|
// Allow any files if acceptedFileTypes is undefined, empty array, or contains '*'
|
|
287
265
|
if (!acceptedFileTypes ||
|
|
288
266
|
acceptedFileTypes.length === 0 ||
|
|
@@ -313,7 +291,7 @@ const filterAllowedFiles$1 = (files, acceptedFileTypes) => {
|
|
|
313
291
|
* and returns a Promise that resolves to { file, key, ..rest }
|
|
314
292
|
* regardless if processFile is defined and if it is sync or async
|
|
315
293
|
*/
|
|
316
|
-
const resolveFile
|
|
294
|
+
const resolveFile = ({ processFile, ...input }) => {
|
|
317
295
|
return new Promise((resolve, reject) => {
|
|
318
296
|
const result = ui.isFunction(processFile) ? processFile(input) : input;
|
|
319
297
|
if (result instanceof Promise) {
|
|
@@ -325,12 +303,12 @@ const resolveFile$1 = ({ processFile, ...input }) => {
|
|
|
325
303
|
});
|
|
326
304
|
};
|
|
327
305
|
|
|
328
|
-
const getInput
|
|
306
|
+
const getInput = ({ accessLevel, file, key, onProgress, path, processFile, useAccelerateEndpoint, }) => {
|
|
329
307
|
return async () => {
|
|
330
308
|
const hasCallbackPath = ui.isTypedFunction(path);
|
|
331
309
|
const hasStringPath = ui.isString(path);
|
|
332
310
|
const hasKeyInput = !!accessLevel && !hasCallbackPath;
|
|
333
|
-
const { file: data, key: processedKey, ...rest } = await resolveFile
|
|
311
|
+
const { file: data, key: processedKey, ...rest } = await resolveFile({ file, key, processFile });
|
|
334
312
|
const contentType = file.type || 'binary/octet-stream';
|
|
335
313
|
// IMPORTANT: always pass `...rest` here for backwards compatibility
|
|
336
314
|
const options = { contentType, onProgress, useAccelerateEndpoint, ...rest };
|
|
@@ -351,15 +329,11 @@ const getInput$1 = ({ accessLevel, file, key, onProcessFileSuccess, onProgress,
|
|
|
351
329
|
const resolvedPath = `${hasCallbackPath ? path({ identityId }) : path}${processedKey}`;
|
|
352
330
|
inputResult = { data: file, path: resolvedPath, options };
|
|
353
331
|
}
|
|
354
|
-
if (processFile) {
|
|
355
|
-
// provide post-processing value of target `key`
|
|
356
|
-
onProcessFileSuccess({ processedKey });
|
|
357
|
-
}
|
|
358
332
|
return inputResult;
|
|
359
333
|
};
|
|
360
334
|
};
|
|
361
335
|
|
|
362
|
-
async function uploadFile
|
|
336
|
+
async function uploadFile({ input, onError, onStart, onComplete, }) {
|
|
363
337
|
const resolvedInput = await input();
|
|
364
338
|
const uploadTask = storage.uploadData(resolvedInput);
|
|
365
339
|
const key = resolvedInput?.key ??
|
|
@@ -381,9 +355,9 @@ async function uploadFile$1({ input, onError, onStart, onComplete, }) {
|
|
|
381
355
|
return uploadTask;
|
|
382
356
|
}
|
|
383
357
|
|
|
384
|
-
function useUploadFiles
|
|
358
|
+
function useUploadFiles({ accessLevel, files, isResumable, maxFileCount, onUploadError, onUploadStart, onUploadSuccess, path, processFile, setUploadingFile, setUploadProgress, setUploadSuccess, useAccelerateEndpoint, }) {
|
|
385
359
|
React__namespace.useEffect(() => {
|
|
386
|
-
const filesReadyToUpload = files.filter((file) => file.status === FileStatus
|
|
360
|
+
const filesReadyToUpload = files.filter((file) => file.status === FileStatus.QUEUED);
|
|
387
361
|
if (filesReadyToUpload.length > maxFileCount) {
|
|
388
362
|
return;
|
|
389
363
|
}
|
|
@@ -399,27 +373,24 @@ function useUploadFiles$1({ accessLevel, files, isResumable, maxFileCount, onPro
|
|
|
399
373
|
setUploadProgress({ id, progress });
|
|
400
374
|
};
|
|
401
375
|
if (file) {
|
|
402
|
-
const
|
|
403
|
-
const input = getInput$1({
|
|
376
|
+
const input = getInput({
|
|
404
377
|
accessLevel,
|
|
405
378
|
file,
|
|
406
379
|
key,
|
|
407
|
-
onProcessFileSuccess: handleProcessFileSuccess,
|
|
408
380
|
onProgress,
|
|
409
381
|
path,
|
|
410
382
|
processFile,
|
|
411
383
|
useAccelerateEndpoint,
|
|
412
384
|
});
|
|
413
|
-
uploadFile
|
|
385
|
+
uploadFile({
|
|
414
386
|
input,
|
|
415
387
|
onComplete: (event) => {
|
|
388
|
+
const resolvedKey = event.key ??
|
|
389
|
+
event.path;
|
|
416
390
|
if (ui.isFunction(onUploadSuccess)) {
|
|
417
|
-
onUploadSuccess({
|
|
418
|
-
key: event.key ??
|
|
419
|
-
event.path,
|
|
420
|
-
});
|
|
391
|
+
onUploadSuccess({ key: resolvedKey });
|
|
421
392
|
}
|
|
422
|
-
setUploadSuccess({ id });
|
|
393
|
+
setUploadSuccess({ id, resolvedKey });
|
|
423
394
|
},
|
|
424
395
|
onError: ({ key, error }) => {
|
|
425
396
|
if (ui.isFunction(onUploadError)) {
|
|
@@ -442,7 +413,6 @@ function useUploadFiles$1({ accessLevel, files, isResumable, maxFileCount, onPro
|
|
|
442
413
|
setUploadProgress,
|
|
443
414
|
setUploadingFile,
|
|
444
415
|
onUploadError,
|
|
445
|
-
onProcessFileSuccess,
|
|
446
416
|
onUploadSuccess,
|
|
447
417
|
onUploadStart,
|
|
448
418
|
maxFileCount,
|
|
@@ -470,16 +440,16 @@ function DropZone$1({ children, displayText, inDropZone, onDragEnter, onDragLeav
|
|
|
470
440
|
const FileStatusMessage$1 = ({ errorMessage, getPausedText, getUploadingText, percentage, status, uploadSuccessfulText, }) => {
|
|
471
441
|
const icons = internal.useIcons('storageManager');
|
|
472
442
|
switch (status) {
|
|
473
|
-
case FileStatus
|
|
443
|
+
case FileStatus.UPLOADING: {
|
|
474
444
|
return (React__default["default"].createElement(uiReact.Text, { className: ui.ComponentClassName.FileUploaderFileStatus }, getUploadingText(percentage)));
|
|
475
445
|
}
|
|
476
|
-
case FileStatus
|
|
446
|
+
case FileStatus.PAUSED:
|
|
477
447
|
return (React__default["default"].createElement(uiReact.Text, { className: ui.ComponentClassName.FileUploaderFileStatus }, getPausedText(percentage)));
|
|
478
|
-
case FileStatus
|
|
448
|
+
case FileStatus.UPLOADED:
|
|
479
449
|
return (React__default["default"].createElement(uiReact.Text, { className: ui.classNames(ui.ComponentClassName.FileUploaderFileStatus, ui.classNameModifier(ui.ComponentClassName.FileUploaderFileStatus, 'success')) },
|
|
480
450
|
React__default["default"].createElement(uiReact.View, { as: "span", fontSize: "xl" }, icons?.success ?? React__default["default"].createElement(internal.IconCheck, null)),
|
|
481
451
|
uploadSuccessfulText));
|
|
482
|
-
case FileStatus
|
|
452
|
+
case FileStatus.ERROR:
|
|
483
453
|
return (React__default["default"].createElement(uiReact.Text, { className: ui.classNames(ui.ComponentClassName.FileUploaderFileStatus, ui.classNameModifier(ui.ComponentClassName.FileUploaderFileStatus, 'error')) },
|
|
484
454
|
React__default["default"].createElement(uiReact.View, { as: "span", fontSize: "xl" }, icons?.error ?? React__default["default"].createElement(internal.IconError, null)),
|
|
485
455
|
errorMessage));
|
|
@@ -514,9 +484,9 @@ function FileControl$1({ onPause, onResume, displayName, errorMessage, isImage,
|
|
|
514
484
|
React__default["default"].createElement(uiReact.View, { className: ui.ComponentClassName.FileUploaderFileWrapper },
|
|
515
485
|
showThumbnails ? (React__default["default"].createElement(FileThumbnail$1, { isImage: isImage, fileName: displayName, url: thumbnailUrl })) : null,
|
|
516
486
|
React__default["default"].createElement(UploadDetails$1, { displayName: displayName, fileSize: size }),
|
|
517
|
-
status === FileStatus
|
|
487
|
+
status === FileStatus.UPLOADING ? (React__default["default"].createElement(uiReact.Loader, { className: ui.ComponentClassName.FileUploaderLoader, variation: "linear", percentage: progress, isDeterminate: loaderIsDeterminate, isPercentageTextHidden: true })) : null,
|
|
518
488
|
isResumable &&
|
|
519
|
-
(status === FileStatus
|
|
489
|
+
(status === FileStatus.UPLOADING || status === FileStatus.PAUSED) ? (status === FileStatus.PAUSED ? (React__default["default"].createElement(uiReact.Button, { onClick: onResume, size: "small", variation: "link" }, resumeButtonText)) : (React__default["default"].createElement(uiReact.Button, { onClick: onPause, size: "small", variation: "link" }, pauseButtonText))) : null,
|
|
520
490
|
React__default["default"].createElement(FileRemoveButton$1, { altText: `Remove file ${displayName}`, onClick: onRemove })),
|
|
521
491
|
React__default["default"].createElement(FileStatusMessage$1, { uploadSuccessfulText: uploadSuccessfulText, getUploadingText: getUploadingText, getPausedText: getPausedText, status: status, errorMessage: errorMessage, percentage: progress })));
|
|
522
492
|
}
|
|
@@ -532,10 +502,10 @@ function FileList$1({ displayText, files, hasMaxFilesError, isResumable, onCance
|
|
|
532
502
|
const { file, status, progress, error, key, isImage, id, uploadTask } = storageFile;
|
|
533
503
|
const thumbnailUrl = file && isImage ? URL.createObjectURL(file) : '';
|
|
534
504
|
const loaderIsDeterminate = isResumable ? progress > 0 : true;
|
|
535
|
-
const isUploading = status === FileStatus
|
|
505
|
+
const isUploading = status === FileStatus.UPLOADING;
|
|
536
506
|
const onRemove = () => {
|
|
537
507
|
if (isResumable &&
|
|
538
|
-
(status === FileStatus
|
|
508
|
+
(status === FileStatus.UPLOADING || status === FileStatus.PAUSED) &&
|
|
539
509
|
uploadTask) {
|
|
540
510
|
onCancelUpload({ id, uploadTask });
|
|
541
511
|
}
|
|
@@ -579,7 +549,7 @@ function FilePicker$1({ children, className = ui.ComponentClassName.FileUploader
|
|
|
579
549
|
return (React__default["default"].createElement(uiReact.Button, { ...props, className: className, size: size }, children));
|
|
580
550
|
}
|
|
581
551
|
|
|
582
|
-
const VERSION = '3.3.
|
|
552
|
+
const VERSION = '3.3.4';
|
|
583
553
|
|
|
584
554
|
const logger$1 = ui.getLogger('Storage');
|
|
585
555
|
const MISSING_REQUIRED_PROPS_MESSAGE$1 = '`FileUploader` requires a `maxFileCount` prop to be provided.';
|
|
@@ -614,13 +584,13 @@ const FileUploaderBase = React__namespace.forwardRef(function FileUploader({ acc
|
|
|
614
584
|
};
|
|
615
585
|
const { getFileSizeErrorText } = displayText;
|
|
616
586
|
const getMaxFileSizeErrorMessage = (file) => {
|
|
617
|
-
return checkMaxFileSize
|
|
587
|
+
return checkMaxFileSize({
|
|
618
588
|
file,
|
|
619
589
|
maxFileSize,
|
|
620
590
|
getFileSizeErrorText,
|
|
621
591
|
});
|
|
622
592
|
};
|
|
623
|
-
const { addFiles, clearFiles, files, removeUpload, queueFiles,
|
|
593
|
+
const { addFiles, clearFiles, files, removeUpload, queueFiles, setUploadingFile, setUploadPaused, setUploadProgress, setUploadSuccess, setUploadResumed, } = useFileUploader(defaultFiles);
|
|
624
594
|
React__namespace.useImperativeHandle(ref, () => ({ clearFiles }));
|
|
625
595
|
const { dragState, ...dropZoneProps } = internal.useDropZone({
|
|
626
596
|
acceptedFileTypes,
|
|
@@ -630,15 +600,15 @@ const FileUploaderBase = React__namespace.forwardRef(function FileUploader({ acc
|
|
|
630
600
|
}
|
|
631
601
|
// We need to filter out files by extension here,
|
|
632
602
|
// we don't get filenames on the drag event, only on drop
|
|
633
|
-
const _acceptedFiles = filterAllowedFiles
|
|
603
|
+
const _acceptedFiles = filterAllowedFiles(acceptedFiles, acceptedFileTypes);
|
|
634
604
|
addFiles({
|
|
635
605
|
files: _acceptedFiles,
|
|
636
|
-
status: autoUpload ? FileStatus
|
|
606
|
+
status: autoUpload ? FileStatus.QUEUED : FileStatus.ADDED,
|
|
637
607
|
getFileErrorMessage: getMaxFileSizeErrorMessage,
|
|
638
608
|
});
|
|
639
609
|
},
|
|
640
610
|
});
|
|
641
|
-
useUploadFiles
|
|
611
|
+
useUploadFiles({
|
|
642
612
|
accessLevel,
|
|
643
613
|
files,
|
|
644
614
|
isResumable,
|
|
@@ -646,7 +616,6 @@ const FileUploaderBase = React__namespace.forwardRef(function FileUploader({ acc
|
|
|
646
616
|
onUploadError,
|
|
647
617
|
onUploadSuccess,
|
|
648
618
|
onUploadStart,
|
|
649
|
-
onProcessFileSuccess: setProcessedKey,
|
|
650
619
|
setUploadingFile,
|
|
651
620
|
setUploadProgress,
|
|
652
621
|
setUploadSuccess,
|
|
@@ -661,7 +630,7 @@ const FileUploaderBase = React__namespace.forwardRef(function FileUploader({ acc
|
|
|
661
630
|
}
|
|
662
631
|
addFiles({
|
|
663
632
|
files: Array.from(files),
|
|
664
|
-
status: autoUpload ? FileStatus
|
|
633
|
+
status: autoUpload ? FileStatus.QUEUED : FileStatus.ADDED,
|
|
665
634
|
getFileErrorMessage: getMaxFileSizeErrorMessage,
|
|
666
635
|
});
|
|
667
636
|
};
|
|
@@ -694,8 +663,7 @@ const FileUploaderBase = React__namespace.forwardRef(function FileUploader({ acc
|
|
|
694
663
|
if (typeof onFileRemove === 'function') {
|
|
695
664
|
const file = files.find((file) => file.id === id);
|
|
696
665
|
if (file) {
|
|
697
|
-
|
|
698
|
-
const key = (processFile && file?.processedKey) ?? file.key;
|
|
666
|
+
const key = file.resolvedKey ?? file.key;
|
|
699
667
|
onFileRemove({ key });
|
|
700
668
|
}
|
|
701
669
|
}
|
|
@@ -703,10 +671,10 @@ const FileUploaderBase = React__namespace.forwardRef(function FileUploader({ acc
|
|
|
703
671
|
// checks if all downloads completed to 100%
|
|
704
672
|
const allUploadsSuccessful = files.length === 0
|
|
705
673
|
? false
|
|
706
|
-
: files.every((file) => file?.status === FileStatus
|
|
674
|
+
: files.every((file) => file?.status === FileStatus.UPLOADED);
|
|
707
675
|
// Displays if over max files
|
|
708
676
|
const hasMaxFilesError = files.filter((file) => file.progress < 100).length > maxFileCount;
|
|
709
|
-
const uploadedFilesLength = files.filter((file) => file?.status === FileStatus
|
|
677
|
+
const uploadedFilesLength = files.filter((file) => file?.status === FileStatus.UPLOADED).length;
|
|
710
678
|
const remainingFilesCount = files.length - uploadedFilesLength;
|
|
711
679
|
// number of files selected for upload when autoUpload is turned off
|
|
712
680
|
const selectedFilesCount = autoUpload ? 0 : remainingFilesCount;
|
|
@@ -793,426 +761,6 @@ const StorageImage = ({ accessLevel, className, fallbackSrc, identityId, imgKey,
|
|
|
793
761
|
return (React__namespace.createElement(uiReact.Image, { ...rest, className: ui.classNames(ui.ComponentClassName.StorageImage, className), src: url?.toString() ?? fallbackSrc }));
|
|
794
762
|
};
|
|
795
763
|
|
|
796
|
-
var FileStatus;
|
|
797
|
-
(function (FileStatus) {
|
|
798
|
-
FileStatus["ADDED"] = "added";
|
|
799
|
-
FileStatus["QUEUED"] = "queued";
|
|
800
|
-
FileStatus["UPLOADING"] = "uploading";
|
|
801
|
-
FileStatus["PAUSED"] = "paused";
|
|
802
|
-
FileStatus["ERROR"] = "error";
|
|
803
|
-
FileStatus["UPLOADED"] = "uploaded";
|
|
804
|
-
})(FileStatus || (FileStatus = {}));
|
|
805
|
-
|
|
806
|
-
var StorageManagerActionTypes;
|
|
807
|
-
(function (StorageManagerActionTypes) {
|
|
808
|
-
StorageManagerActionTypes["ADD_FILES"] = "ADD_FILES";
|
|
809
|
-
StorageManagerActionTypes["CLEAR_FILES"] = "CLEAR_FILES";
|
|
810
|
-
StorageManagerActionTypes["QUEUE_FILES"] = "QUEUE_FILES";
|
|
811
|
-
StorageManagerActionTypes["SET_STATUS"] = "SET_STATUS";
|
|
812
|
-
StorageManagerActionTypes["SET_PROCESSED_FILE_KEY"] = "SET_PROCESSED_FILE_KEY";
|
|
813
|
-
StorageManagerActionTypes["SET_STATUS_UPLOADING"] = "SET_STATUS_UPLOADING";
|
|
814
|
-
StorageManagerActionTypes["SET_UPLOAD_PROGRESS"] = "SET_UPLOAD_PROGRESS";
|
|
815
|
-
StorageManagerActionTypes["REMOVE_UPLOAD"] = "REMOVE_UPLOAD";
|
|
816
|
-
})(StorageManagerActionTypes || (StorageManagerActionTypes = {}));
|
|
817
|
-
|
|
818
|
-
const updateFiles = (files, nextFileData) => files.reduce((files, currentFile) => {
|
|
819
|
-
if (currentFile.id === nextFileData.id) {
|
|
820
|
-
return [...files, { ...currentFile, ...nextFileData }];
|
|
821
|
-
}
|
|
822
|
-
return [...files, currentFile];
|
|
823
|
-
}, []);
|
|
824
|
-
function storageManagerStateReducer(state, action) {
|
|
825
|
-
switch (action.type) {
|
|
826
|
-
case StorageManagerActionTypes.ADD_FILES: {
|
|
827
|
-
const { files, status } = action;
|
|
828
|
-
const newUploads = files.map((file) => {
|
|
829
|
-
const errorText = action.getFileErrorMessage(file);
|
|
830
|
-
return {
|
|
831
|
-
// make sure id is unique,
|
|
832
|
-
// we only use it internally and don't send it to Storage
|
|
833
|
-
id: `${Date.now()}-${file.name}`,
|
|
834
|
-
file,
|
|
835
|
-
error: errorText,
|
|
836
|
-
key: file.name,
|
|
837
|
-
status: errorText ? FileStatus.ERROR : status,
|
|
838
|
-
isImage: file.type.startsWith('image/'),
|
|
839
|
-
progress: -1,
|
|
840
|
-
};
|
|
841
|
-
});
|
|
842
|
-
const newFiles = [...state.files, ...newUploads];
|
|
843
|
-
return { ...state, files: newFiles };
|
|
844
|
-
}
|
|
845
|
-
case StorageManagerActionTypes.CLEAR_FILES: {
|
|
846
|
-
return { ...state, files: [] };
|
|
847
|
-
}
|
|
848
|
-
case StorageManagerActionTypes.QUEUE_FILES: {
|
|
849
|
-
const { files } = state;
|
|
850
|
-
const newFiles = files.reduce((files, currentFile) => {
|
|
851
|
-
return [
|
|
852
|
-
...files,
|
|
853
|
-
{
|
|
854
|
-
...currentFile,
|
|
855
|
-
...(currentFile.status === FileStatus.ADDED
|
|
856
|
-
? { status: FileStatus.QUEUED }
|
|
857
|
-
: {}),
|
|
858
|
-
},
|
|
859
|
-
];
|
|
860
|
-
}, []);
|
|
861
|
-
return {
|
|
862
|
-
...state,
|
|
863
|
-
files: newFiles,
|
|
864
|
-
};
|
|
865
|
-
}
|
|
866
|
-
case StorageManagerActionTypes.SET_STATUS_UPLOADING: {
|
|
867
|
-
const { id, uploadTask } = action;
|
|
868
|
-
const status = FileStatus.UPLOADING;
|
|
869
|
-
const progress = 0;
|
|
870
|
-
const nextFileData = { status, progress, id, uploadTask };
|
|
871
|
-
const files = updateFiles(state.files, nextFileData);
|
|
872
|
-
return { ...state, files };
|
|
873
|
-
}
|
|
874
|
-
case StorageManagerActionTypes.SET_PROCESSED_FILE_KEY: {
|
|
875
|
-
const { processedKey, id } = action;
|
|
876
|
-
const files = updateFiles(state.files, { processedKey, id });
|
|
877
|
-
return { files };
|
|
878
|
-
}
|
|
879
|
-
case StorageManagerActionTypes.SET_UPLOAD_PROGRESS: {
|
|
880
|
-
const { id, progress } = action;
|
|
881
|
-
const files = updateFiles(state.files, { id, progress });
|
|
882
|
-
return { ...state, files };
|
|
883
|
-
}
|
|
884
|
-
case StorageManagerActionTypes.SET_STATUS: {
|
|
885
|
-
const { id, status } = action;
|
|
886
|
-
const files = updateFiles(state.files, { id, status });
|
|
887
|
-
return { ...state, files };
|
|
888
|
-
}
|
|
889
|
-
case StorageManagerActionTypes.REMOVE_UPLOAD: {
|
|
890
|
-
const { id } = action;
|
|
891
|
-
const { files } = state;
|
|
892
|
-
const newFiles = files.reduce((files, currentFile) => {
|
|
893
|
-
if (currentFile.id === id) {
|
|
894
|
-
// remove by not returning currentFile
|
|
895
|
-
return [...files];
|
|
896
|
-
}
|
|
897
|
-
return [...files, currentFile];
|
|
898
|
-
}, []);
|
|
899
|
-
return {
|
|
900
|
-
...state,
|
|
901
|
-
files: newFiles,
|
|
902
|
-
};
|
|
903
|
-
}
|
|
904
|
-
}
|
|
905
|
-
}
|
|
906
|
-
|
|
907
|
-
const addFilesAction = ({ files, status, getFileErrorMessage, }) => ({
|
|
908
|
-
type: StorageManagerActionTypes.ADD_FILES,
|
|
909
|
-
files,
|
|
910
|
-
status,
|
|
911
|
-
getFileErrorMessage,
|
|
912
|
-
});
|
|
913
|
-
const clearFilesAction = () => ({
|
|
914
|
-
type: StorageManagerActionTypes.CLEAR_FILES,
|
|
915
|
-
});
|
|
916
|
-
const queueFilesAction = () => ({
|
|
917
|
-
type: StorageManagerActionTypes.QUEUE_FILES,
|
|
918
|
-
});
|
|
919
|
-
const setProcessedKeyAction = (input) => ({
|
|
920
|
-
...input,
|
|
921
|
-
type: StorageManagerActionTypes.SET_PROCESSED_FILE_KEY,
|
|
922
|
-
});
|
|
923
|
-
const setUploadingFileAction = ({ id, uploadTask, }) => ({
|
|
924
|
-
type: StorageManagerActionTypes.SET_STATUS_UPLOADING,
|
|
925
|
-
id,
|
|
926
|
-
uploadTask,
|
|
927
|
-
});
|
|
928
|
-
const setUploadProgressAction = ({ id, progress, }) => ({
|
|
929
|
-
type: StorageManagerActionTypes.SET_UPLOAD_PROGRESS,
|
|
930
|
-
id,
|
|
931
|
-
progress,
|
|
932
|
-
});
|
|
933
|
-
const setUploadStatusAction = ({ id, status, }) => ({
|
|
934
|
-
type: StorageManagerActionTypes.SET_STATUS,
|
|
935
|
-
id,
|
|
936
|
-
status,
|
|
937
|
-
});
|
|
938
|
-
const removeUploadAction = ({ id }) => ({
|
|
939
|
-
type: StorageManagerActionTypes.REMOVE_UPLOAD,
|
|
940
|
-
id,
|
|
941
|
-
});
|
|
942
|
-
|
|
943
|
-
const isDefaultFile = (file) => !!(ui.isObject(file) && file.key);
|
|
944
|
-
const createFileFromDefault = (file) => isDefaultFile(file)
|
|
945
|
-
? { ...file, id: file.key, status: FileStatus.UPLOADED }
|
|
946
|
-
: undefined;
|
|
947
|
-
function useStorageManager(defaultFiles = []) {
|
|
948
|
-
const [{ files }, dispatch] = React__default["default"].useReducer(storageManagerStateReducer, {
|
|
949
|
-
files: (Array.isArray(defaultFiles)
|
|
950
|
-
? defaultFiles.map(createFileFromDefault).filter((file) => !!file)
|
|
951
|
-
: []),
|
|
952
|
-
});
|
|
953
|
-
const addFiles = ({ files, status, getFileErrorMessage, }) => {
|
|
954
|
-
dispatch(addFilesAction({ files, status, getFileErrorMessage }));
|
|
955
|
-
};
|
|
956
|
-
const clearFiles = () => {
|
|
957
|
-
dispatch(clearFilesAction());
|
|
958
|
-
};
|
|
959
|
-
const queueFiles = () => {
|
|
960
|
-
dispatch(queueFilesAction());
|
|
961
|
-
};
|
|
962
|
-
const setUploadingFile = ({ uploadTask, id, }) => {
|
|
963
|
-
dispatch(setUploadingFileAction({ id, uploadTask }));
|
|
964
|
-
};
|
|
965
|
-
const setProcessedKey = (input) => {
|
|
966
|
-
dispatch(setProcessedKeyAction(input));
|
|
967
|
-
};
|
|
968
|
-
const setUploadProgress = ({ progress, id, }) => {
|
|
969
|
-
dispatch(setUploadProgressAction({ id, progress }));
|
|
970
|
-
};
|
|
971
|
-
const setUploadSuccess = ({ id }) => {
|
|
972
|
-
dispatch(setUploadStatusAction({ id, status: FileStatus.UPLOADED }));
|
|
973
|
-
};
|
|
974
|
-
const setUploadPaused = ({ id }) => {
|
|
975
|
-
dispatch(setUploadStatusAction({ id, status: FileStatus.PAUSED }));
|
|
976
|
-
};
|
|
977
|
-
const setUploadResumed = ({ id }) => {
|
|
978
|
-
dispatch(setUploadStatusAction({ id, status: FileStatus.UPLOADING }));
|
|
979
|
-
};
|
|
980
|
-
const removeUpload = ({ id }) => {
|
|
981
|
-
dispatch(removeUploadAction({ id }));
|
|
982
|
-
};
|
|
983
|
-
return {
|
|
984
|
-
removeUpload,
|
|
985
|
-
setProcessedKey,
|
|
986
|
-
setUploadPaused,
|
|
987
|
-
setUploadProgress,
|
|
988
|
-
setUploadResumed,
|
|
989
|
-
setUploadSuccess,
|
|
990
|
-
setUploadingFile,
|
|
991
|
-
queueFiles,
|
|
992
|
-
addFiles,
|
|
993
|
-
clearFiles,
|
|
994
|
-
files,
|
|
995
|
-
};
|
|
996
|
-
}
|
|
997
|
-
|
|
998
|
-
const checkMaxFileSize = ({ file, getFileSizeErrorText, maxFileSize, }) => {
|
|
999
|
-
if (maxFileSize === undefined)
|
|
1000
|
-
return '';
|
|
1001
|
-
if (file.size > maxFileSize) {
|
|
1002
|
-
return getFileSizeErrorText(ui.humanFileSize(maxFileSize, true));
|
|
1003
|
-
}
|
|
1004
|
-
return '';
|
|
1005
|
-
};
|
|
1006
|
-
|
|
1007
|
-
const defaultStorageManagerDisplayText = {
|
|
1008
|
-
getFilesUploadedText(count) {
|
|
1009
|
-
return `${count} ${count === 1 ? 'file uploaded' : 'files uploaded'}`;
|
|
1010
|
-
},
|
|
1011
|
-
getFileSizeErrorText(sizeText) {
|
|
1012
|
-
return `File size must be below ${sizeText}`;
|
|
1013
|
-
},
|
|
1014
|
-
getRemainingFilesText(count) {
|
|
1015
|
-
return `${count} ${count === 1 ? 'file' : 'files'} uploading`;
|
|
1016
|
-
},
|
|
1017
|
-
getSelectedFilesText(count) {
|
|
1018
|
-
return `${count} ${count === 1 ? 'file' : 'files'} selected`;
|
|
1019
|
-
},
|
|
1020
|
-
getUploadingText(percentage) {
|
|
1021
|
-
return `Uploading${percentage > 0 ? `: ${percentage}%` : ''}`;
|
|
1022
|
-
},
|
|
1023
|
-
getUploadButtonText(count) {
|
|
1024
|
-
return `Upload ${count} ${count === 1 ? 'file' : 'files'}`;
|
|
1025
|
-
},
|
|
1026
|
-
getMaxFilesErrorText(count) {
|
|
1027
|
-
return `Cannot choose more than ${count} ${count === 1 ? 'file' : 'files'}. Remove files before updating`;
|
|
1028
|
-
},
|
|
1029
|
-
getErrorText(message) {
|
|
1030
|
-
return message;
|
|
1031
|
-
},
|
|
1032
|
-
doneButtonText: 'Done',
|
|
1033
|
-
clearAllButtonText: 'Clear all',
|
|
1034
|
-
extensionNotAllowedText: 'Extension not allowed',
|
|
1035
|
-
browseFilesText: 'Browse files',
|
|
1036
|
-
dropFilesText: 'Drop files here or',
|
|
1037
|
-
pauseButtonText: 'Pause',
|
|
1038
|
-
resumeButtonText: 'Resume',
|
|
1039
|
-
uploadSuccessfulText: 'Uploaded',
|
|
1040
|
-
getPausedText(percentage) {
|
|
1041
|
-
return `Paused: ${percentage}%`;
|
|
1042
|
-
},
|
|
1043
|
-
};
|
|
1044
|
-
|
|
1045
|
-
const filterAllowedFiles = (files, acceptedFileTypes) => {
|
|
1046
|
-
// Allow any files if acceptedFileTypes is undefined, empty array, or contains '*'
|
|
1047
|
-
if (!acceptedFileTypes ||
|
|
1048
|
-
acceptedFileTypes.length === 0 ||
|
|
1049
|
-
acceptedFileTypes.includes('*')) {
|
|
1050
|
-
return files;
|
|
1051
|
-
}
|
|
1052
|
-
// Remove any files that are not in the accepted file list
|
|
1053
|
-
return files.filter((file) => {
|
|
1054
|
-
const fileName = file.name || '';
|
|
1055
|
-
const mimeType = (file.type || '').toLowerCase();
|
|
1056
|
-
const baseMimeType = mimeType.replace(/\/.*$/, '');
|
|
1057
|
-
return acceptedFileTypes.some((type) => {
|
|
1058
|
-
const validType = type.trim().toLowerCase();
|
|
1059
|
-
if (validType.charAt(0) === '.') {
|
|
1060
|
-
return fileName.toLowerCase().endsWith(validType);
|
|
1061
|
-
}
|
|
1062
|
-
else if (validType.endsWith('/*')) {
|
|
1063
|
-
// This is something like a image/* mime type
|
|
1064
|
-
return baseMimeType === validType.replace(/\/.*$/, '');
|
|
1065
|
-
}
|
|
1066
|
-
return mimeType === validType;
|
|
1067
|
-
});
|
|
1068
|
-
});
|
|
1069
|
-
};
|
|
1070
|
-
|
|
1071
|
-
/**
|
|
1072
|
-
* Utility function that takes the processFile prop, along with a file a key
|
|
1073
|
-
* and returns a Promise that resolves to { file, key, ..rest }
|
|
1074
|
-
* regardless if processFile is defined and if it is sync or async
|
|
1075
|
-
*/
|
|
1076
|
-
const resolveFile = ({ processFile, ...input }) => {
|
|
1077
|
-
return new Promise((resolve, reject) => {
|
|
1078
|
-
const result = ui.isFunction(processFile) ? processFile(input) : input;
|
|
1079
|
-
if (result instanceof Promise) {
|
|
1080
|
-
result.then(resolve).catch(reject);
|
|
1081
|
-
}
|
|
1082
|
-
else {
|
|
1083
|
-
resolve(result);
|
|
1084
|
-
}
|
|
1085
|
-
});
|
|
1086
|
-
};
|
|
1087
|
-
|
|
1088
|
-
const getInput = ({ accessLevel, file, key, onProcessFileSuccess, onProgress, path, processFile, useAccelerateEndpoint, }) => {
|
|
1089
|
-
return async () => {
|
|
1090
|
-
const hasCallbackPath = ui.isTypedFunction(path);
|
|
1091
|
-
const hasStringPath = ui.isString(path);
|
|
1092
|
-
const hasKeyInput = !!accessLevel && !hasCallbackPath;
|
|
1093
|
-
const { file: data, key: processedKey, ...rest } = await resolveFile({ file, key, processFile });
|
|
1094
|
-
const contentType = file.type || 'binary/octet-stream';
|
|
1095
|
-
// IMPORTANT: always pass `...rest` here for backwards compatibility
|
|
1096
|
-
const options = { contentType, onProgress, useAccelerateEndpoint, ...rest };
|
|
1097
|
-
let inputResult;
|
|
1098
|
-
if (hasKeyInput) {
|
|
1099
|
-
// legacy handling of `path` is to prefix to `fileKey`
|
|
1100
|
-
const resolvedKey = hasStringPath
|
|
1101
|
-
? `${path}${processedKey}`
|
|
1102
|
-
: processedKey;
|
|
1103
|
-
inputResult = {
|
|
1104
|
-
data,
|
|
1105
|
-
key: resolvedKey,
|
|
1106
|
-
options: { ...options, accessLevel },
|
|
1107
|
-
};
|
|
1108
|
-
}
|
|
1109
|
-
else {
|
|
1110
|
-
const { identityId } = await auth.fetchAuthSession();
|
|
1111
|
-
const resolvedPath = `${hasCallbackPath ? path({ identityId }) : path}${processedKey}`;
|
|
1112
|
-
inputResult = { data: file, path: resolvedPath, options };
|
|
1113
|
-
}
|
|
1114
|
-
if (processFile) {
|
|
1115
|
-
// provide post-processing value of target `key`
|
|
1116
|
-
onProcessFileSuccess({ processedKey });
|
|
1117
|
-
}
|
|
1118
|
-
return inputResult;
|
|
1119
|
-
};
|
|
1120
|
-
};
|
|
1121
|
-
|
|
1122
|
-
async function uploadFile({ input, onError, onStart, onComplete, }) {
|
|
1123
|
-
const resolvedInput = await input();
|
|
1124
|
-
const uploadTask = storage.uploadData(resolvedInput);
|
|
1125
|
-
const key = resolvedInput?.key ??
|
|
1126
|
-
resolvedInput?.path;
|
|
1127
|
-
if (ui.isFunction(onStart)) {
|
|
1128
|
-
onStart({ key, uploadTask });
|
|
1129
|
-
}
|
|
1130
|
-
uploadTask.result
|
|
1131
|
-
.then((result) => {
|
|
1132
|
-
if (ui.isFunction(onComplete) && uploadTask.state === 'SUCCESS') {
|
|
1133
|
-
onComplete(result);
|
|
1134
|
-
}
|
|
1135
|
-
})
|
|
1136
|
-
.catch((error) => {
|
|
1137
|
-
if (ui.isFunction(onError)) {
|
|
1138
|
-
onError({ key, error });
|
|
1139
|
-
}
|
|
1140
|
-
});
|
|
1141
|
-
return uploadTask;
|
|
1142
|
-
}
|
|
1143
|
-
|
|
1144
|
-
function useUploadFiles({ accessLevel, files, isResumable, maxFileCount, onProcessFileSuccess, onUploadError, onUploadStart, onUploadSuccess, path, processFile, setUploadingFile, setUploadProgress, setUploadSuccess, useAccelerateEndpoint, }) {
|
|
1145
|
-
React__namespace.useEffect(() => {
|
|
1146
|
-
const filesReadyToUpload = files.filter((file) => file.status === FileStatus.QUEUED);
|
|
1147
|
-
if (filesReadyToUpload.length > maxFileCount) {
|
|
1148
|
-
return;
|
|
1149
|
-
}
|
|
1150
|
-
for (const { file, key, id } of filesReadyToUpload) {
|
|
1151
|
-
const onProgress = (event) => {
|
|
1152
|
-
/**
|
|
1153
|
-
* When a file is zero bytes, the progress.total will equal zero.
|
|
1154
|
-
* Therefore, this will prevent a divide by zero error.
|
|
1155
|
-
*/
|
|
1156
|
-
const progress = event.totalBytes === undefined || event.totalBytes === 0
|
|
1157
|
-
? 100
|
|
1158
|
-
: Math.floor((event.transferredBytes / event.totalBytes) * 100);
|
|
1159
|
-
setUploadProgress({ id, progress });
|
|
1160
|
-
};
|
|
1161
|
-
if (file) {
|
|
1162
|
-
const handleProcessFileSuccess = (input) => onProcessFileSuccess({ id, ...input });
|
|
1163
|
-
const input = getInput({
|
|
1164
|
-
accessLevel,
|
|
1165
|
-
file,
|
|
1166
|
-
key,
|
|
1167
|
-
onProcessFileSuccess: handleProcessFileSuccess,
|
|
1168
|
-
onProgress,
|
|
1169
|
-
path,
|
|
1170
|
-
processFile,
|
|
1171
|
-
useAccelerateEndpoint,
|
|
1172
|
-
});
|
|
1173
|
-
uploadFile({
|
|
1174
|
-
input,
|
|
1175
|
-
onComplete: (event) => {
|
|
1176
|
-
if (ui.isFunction(onUploadSuccess)) {
|
|
1177
|
-
onUploadSuccess({
|
|
1178
|
-
key: event.key ??
|
|
1179
|
-
event.path,
|
|
1180
|
-
});
|
|
1181
|
-
}
|
|
1182
|
-
setUploadSuccess({ id });
|
|
1183
|
-
},
|
|
1184
|
-
onError: ({ key, error }) => {
|
|
1185
|
-
if (ui.isFunction(onUploadError)) {
|
|
1186
|
-
onUploadError(error.message, { key });
|
|
1187
|
-
}
|
|
1188
|
-
},
|
|
1189
|
-
onStart: ({ key, uploadTask }) => {
|
|
1190
|
-
if (ui.isFunction(onUploadStart)) {
|
|
1191
|
-
onUploadStart({ key });
|
|
1192
|
-
}
|
|
1193
|
-
setUploadingFile({ id, uploadTask });
|
|
1194
|
-
},
|
|
1195
|
-
});
|
|
1196
|
-
}
|
|
1197
|
-
}
|
|
1198
|
-
}, [
|
|
1199
|
-
files,
|
|
1200
|
-
accessLevel,
|
|
1201
|
-
isResumable,
|
|
1202
|
-
setUploadProgress,
|
|
1203
|
-
setUploadingFile,
|
|
1204
|
-
onUploadError,
|
|
1205
|
-
onProcessFileSuccess,
|
|
1206
|
-
onUploadSuccess,
|
|
1207
|
-
onUploadStart,
|
|
1208
|
-
maxFileCount,
|
|
1209
|
-
setUploadSuccess,
|
|
1210
|
-
processFile,
|
|
1211
|
-
path,
|
|
1212
|
-
useAccelerateEndpoint,
|
|
1213
|
-
]);
|
|
1214
|
-
}
|
|
1215
|
-
|
|
1216
764
|
function Container({ children, className, }) {
|
|
1217
765
|
return React__default["default"].createElement(uiReact.View, { className: className }, children);
|
|
1218
766
|
}
|
|
@@ -1371,7 +919,7 @@ const StorageManagerBase = React__namespace.forwardRef(function StorageManager({
|
|
|
1371
919
|
const allowMultipleFiles = maxFileCount === undefined ||
|
|
1372
920
|
(typeof maxFileCount === 'number' && maxFileCount > 1);
|
|
1373
921
|
const displayText = {
|
|
1374
|
-
...
|
|
922
|
+
...defaultFileUploaderDisplayText,
|
|
1375
923
|
...overrideDisplayText,
|
|
1376
924
|
};
|
|
1377
925
|
const { getFileSizeErrorText } = displayText;
|
|
@@ -1382,7 +930,7 @@ const StorageManagerBase = React__namespace.forwardRef(function StorageManager({
|
|
|
1382
930
|
getFileSizeErrorText,
|
|
1383
931
|
});
|
|
1384
932
|
};
|
|
1385
|
-
const { addFiles, clearFiles, files, removeUpload, queueFiles,
|
|
933
|
+
const { addFiles, clearFiles, files, removeUpload, queueFiles, setUploadingFile, setUploadPaused, setUploadProgress, setUploadSuccess, setUploadResumed, } = useFileUploader(defaultFiles);
|
|
1386
934
|
React__namespace.useImperativeHandle(ref, () => ({ clearFiles }));
|
|
1387
935
|
const { dragState, ...dropZoneProps } = internal.useDropZone({
|
|
1388
936
|
acceptedFileTypes,
|
|
@@ -1408,7 +956,6 @@ const StorageManagerBase = React__namespace.forwardRef(function StorageManager({
|
|
|
1408
956
|
onUploadError,
|
|
1409
957
|
onUploadSuccess,
|
|
1410
958
|
onUploadStart,
|
|
1411
|
-
onProcessFileSuccess: setProcessedKey,
|
|
1412
959
|
setUploadingFile,
|
|
1413
960
|
setUploadProgress,
|
|
1414
961
|
setUploadSuccess,
|
|
@@ -1456,8 +1003,7 @@ const StorageManagerBase = React__namespace.forwardRef(function StorageManager({
|
|
|
1456
1003
|
if (typeof onFileRemove === 'function') {
|
|
1457
1004
|
const file = files.find((file) => file.id === id);
|
|
1458
1005
|
if (file) {
|
|
1459
|
-
|
|
1460
|
-
const key = (processFile && file?.processedKey) ?? file.key;
|
|
1006
|
+
const key = file.resolvedKey ?? file.key;
|
|
1461
1007
|
onFileRemove({ key });
|
|
1462
1008
|
}
|
|
1463
1009
|
}
|