Skip to content

Commit 87815de

Browse files
authored
fix(content-uploader): fix multiple items droppable issue (#3565)
* fix(content-uploader): fix multiple items droppable issue * fix(content-uploader): add tests * fix(content-uploader): fix flow issue
1 parent 3103983 commit 87815de

2 files changed

Lines changed: 95 additions & 26 deletions

File tree

‎src/elements/content-uploader/ContentUploader.js‎

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -378,9 +378,7 @@ class ContentUploader extends Component<Props, State> {
378378
if (droppedItems.items) {
379379
this.addDataTransferItemsToUploadQueue(droppedItems.items, itemUpdateCallback);
380380
} else {
381-
Array.from(droppedItems.files).forEach(file => {
382-
this.addFilesToUploadQueue([file], itemUpdateCallback);
383-
});
381+
this.addFilesToUploadQueue(Array.from(droppedItems.files), itemUpdateCallback);
384382
}
385383
};
386384

@@ -426,20 +424,20 @@ class ContentUploader extends Component<Props, State> {
426424
* @private
427425
* @param {Array<DataTransferItem | UploadDataTransferItemWithAPIOptions>} dataTransferItems
428426
* @param {Function} itemUpdateCallback
429-
* @returns {void}
427+
* @returns {Promise<any>}
430428
*/
431-
addFileDataTransferItemsToUploadQueue = (
429+
addFileDataTransferItemsToUploadQueue = async (
432430
dataTransferItems: Array<DataTransferItem | UploadDataTransferItemWithAPIOptions>,
433431
itemUpdateCallback: Function,
434-
): void => {
435-
dataTransferItems.forEach(async item => {
436-
const file = await getFileFromDataTransferItem(item);
437-
if (!file) {
438-
return;
432+
): Promise<any> => {
433+
const files = await Promise.all(dataTransferItems.map(async item => getFileFromDataTransferItem(item)));
434+
const filesArray = [];
435+
files.forEach(file => {
436+
if (file) {
437+
filesArray.push(file);
439438
}
440-
441-
this.addFilesToUploadQueue([file], itemUpdateCallback);
442439
});
440+
this.addFilesToUploadQueue(filesArray, itemUpdateCallback);
443441
};
444442

445443
/**
@@ -448,21 +446,22 @@ class ContentUploader extends Component<Props, State> {
448446
* @private
449447
* @param {Array<DataTransferItem | UploadDataTransferItemWithAPIOptions>} dataTransferItems
450448
* @param {Function} itemUpdateCallback
451-
* @returns {void}
449+
* @returns {Promise<any>}
452450
*/
453-
addPackageDataTransferItemsToUploadQueue = (
451+
addPackageDataTransferItemsToUploadQueue = async (
454452
dataTransferItems: Array<DataTransferItem | UploadDataTransferItemWithAPIOptions>,
455453
itemUpdateCallback: Function,
456-
): void => {
457-
dataTransferItems.forEach(item => {
458-
const file = getPackageFileFromDataTransferItem(item);
459-
460-
if (!file) {
461-
return;
454+
): Promise<any> => {
455+
const packageFiles = await Promise.all(
456+
dataTransferItems.map(async item => getPackageFileFromDataTransferItem(item)),
457+
);
458+
const packageFilesArray = [];
459+
packageFiles.forEach(packageFile => {
460+
if (packageFile) {
461+
packageFilesArray.push(packageFile);
462462
}
463-
464-
this.addFilesToUploadQueue([file], itemUpdateCallback);
465463
});
464+
this.addFilesToUploadQueue(packageFilesArray, itemUpdateCallback);
466465
};
467466

468467
/**
@@ -494,11 +493,28 @@ class ContentUploader extends Component<Props, State> {
494493

495494
const fileAPIOptions: Object = getDataTransferItemAPIOptions(newItems[0]);
496495
const { folderId = rootFolderId } = fileAPIOptions;
497-
newItems.forEach(async item => {
498-
const folderUpload = this.getFolderUploadAPI(folderId);
499-
await folderUpload.buildFolderTreeFromDataTransferItem(item);
500-
this.addFolderToUploadQueue(folderUpload, itemUpdateCallback, fileAPIOptions);
496+
const folderUploads = await Promise.all(
497+
newItems.map(async item => {
498+
const folderUpload = this.getFolderUploadAPI(folderId);
499+
await folderUpload.buildFolderTreeFromDataTransferItem(item);
500+
return folderUpload;
501+
}),
502+
);
503+
const folderUploadsArray = [];
504+
folderUploads.forEach(folderUpload => {
505+
// $FlowFixMe no file property
506+
folderUploadsArray.push({
507+
api: folderUpload,
508+
extension: '',
509+
isFolder: true,
510+
name: folderUpload.folder.name,
511+
options: fileAPIOptions,
512+
progress: 0,
513+
size: 1,
514+
status: STATUS_PENDING,
515+
});
501516
});
517+
this.addToQueue(folderUploadsArray, itemUpdateCallback);
502518
};
503519

504520
/**

‎src/elements/content-uploader/__tests__/ContentUploader.test.js‎

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,4 +649,57 @@ describe('elements/content-uploader/ContentUploader', () => {
649649
expect(instance.addFilesToUploadQueue).not.toHaveBeenCalled();
650650
});
651651
});
652+
653+
describe('addFileDataTransferItemsToUploadQueue()', () => {
654+
test('should pass multiple files to the upload queue', async () => {
655+
jest.spyOn(UploaderUtils, 'getFileFromDataTransferItem').mockResolvedValue(() => 'file');
656+
657+
const itemsLength = 3;
658+
const wrapper = getWrapper();
659+
const instance = wrapper.instance();
660+
instance.addFilesToUploadQueue = jest.fn();
661+
662+
const files = createMockFiles(itemsLength);
663+
await instance.addFileDataTransferItemsToUploadQueue(files, jest.fn());
664+
expect(instance.addFilesToUploadQueue).toBeCalledTimes(1);
665+
expect(instance.addFilesToUploadQueue.mock.calls[0][0].length).toBe(itemsLength);
666+
});
667+
});
668+
669+
describe('addPackageDataTransferItemsToUploadQueue()', () => {
670+
test('should pass multiple packages to the upload queue', async () => {
671+
jest.spyOn(UploaderUtils, 'getPackageFileFromDataTransferItem').mockResolvedValue(() => 'package');
672+
673+
const itemsLength = 3;
674+
const wrapper = getWrapper();
675+
const instance = wrapper.instance();
676+
instance.addFilesToUploadQueue = jest.fn();
677+
678+
const files = createMockFiles(itemsLength);
679+
await instance.addPackageDataTransferItemsToUploadQueue(files, jest.fn());
680+
expect(instance.addFilesToUploadQueue).toBeCalledTimes(1);
681+
expect(instance.addFilesToUploadQueue.mock.calls[0][0].length).toBe(itemsLength);
682+
});
683+
});
684+
685+
describe('addFolderDataTransferItemsToUploadQueue()', () => {
686+
test('should pass multiple folders to the upload queue', async () => {
687+
jest.spyOn(UploaderUtils, 'getDataTransferItemId').mockResolvedValue(() => 'folder123');
688+
jest.spyOn(UploaderUtils, 'getDataTransferItemAPIOptions').mockResolvedValue(() => {});
689+
690+
const wrapper = getWrapper();
691+
const instance = wrapper.instance();
692+
const mockFoldersList = ['folder1', 'folder2'];
693+
const mockFolderUpload = { folder: { name: 'mockFolder' } };
694+
mockFolderUpload.buildFolderTreeFromDataTransferItem = jest.fn();
695+
696+
instance.addToQueue = jest.fn();
697+
instance.getFolderUploadAPI = jest.fn().mockReturnValue(mockFolderUpload);
698+
instance.getNewDataTransferItems = jest.fn().mockReturnValue(mockFoldersList);
699+
700+
await instance.addFolderDataTransferItemsToUploadQueue(mockFoldersList, jest.fn());
701+
expect(instance.addToQueue).toBeCalledTimes(1);
702+
expect(instance.addToQueue.mock.calls[0][0].length).toBe(mockFoldersList.length);
703+
});
704+
});
652705
});

0 commit comments

Comments
 (0)