From 914f119a18652fae12532bd67e11284429c655c6 Mon Sep 17 00:00:00 2001 From: Evgenia Karunus Date: Sat, 3 Aug 2019 09:15:47 +0200 Subject: [PATCH 1/2] @uppy/core - made sure we can upload new files if we remove the last uploading file (When allowMultipleUploads: false) --- packages/@uppy/core/src/index.js | 8 ++- packages/@uppy/core/src/index.test.js | 81 +++++++++++++++++++++------ 2 files changed, 72 insertions(+), 17 deletions(-) diff --git a/packages/@uppy/core/src/index.js b/packages/@uppy/core/src/index.js index cb6713895..1f4f46a7e 100644 --- a/packages/@uppy/core/src/index.js +++ b/packages/@uppy/core/src/index.js @@ -556,6 +556,13 @@ class Uppy { files: updatedFiles }) + // If nothing is uploading anymore, and if nothing has uploaded yet - allow new uploads! + if (Object.keys(updatedFiles).length === 0) { + this.setState({ + allowNewUpload: true + }) + } + removeUploads.forEach((uploadID) => { this._removeUpload(uploadID) }) @@ -653,7 +660,6 @@ class Uppy { }) this.setState({ - allowNewUpload: true, totalProgress: 0, error: null }) diff --git a/packages/@uppy/core/src/index.test.js b/packages/@uppy/core/src/index.test.js index 878001595..94cf8ee66 100644 --- a/packages/@uppy/core/src/index.test.js +++ b/packages/@uppy/core/src/index.test.js @@ -664,27 +664,76 @@ describe('src/Core', () => { expect(core.getFiles().length).toEqual(0) }) - it('allows no new files after upload when allowMultipleUploads: false', async () => { - const core = new Core({ allowMultipleUploads: false }) - core.addFile({ - source: 'jest', - name: 'foo.jpg', - type: 'image/jpeg', - data: new File([sampleImage], { type: 'image/jpeg' }) - }) - - await core.upload() - - expect(() => { + describe('with allowMultipleUploads: false', () => { + it('allows no new files after upload', async () => { + const core = new Core({ allowMultipleUploads: false }) core.addFile({ source: 'jest', - name: '123.foo', + name: 'foo.jpg', type: 'image/jpeg', data: new File([sampleImage], { type: 'image/jpeg' }) }) - }).toThrow( - /Cannot add new files: already uploading\./ - ) + + await core.upload() + + expect(() => { + core.addFile({ + source: 'jest', + name: '123.foo', + type: 'image/jpeg', + data: new File([sampleImage], { type: 'image/jpeg' }) + }) + }).toThrow( + /Cannot add new files: already uploading\./ + ) + }) + + it('does not allow new files after the removeFile() if some file is still present', async () => { + const core = new Core({ allowMultipleUploads: false }) + + // adding 2 files + const fileId1 = core.addFile({ + source: 'jest', + name: '1.jpg', + type: 'image/jpeg', + data: new File([sampleImage], { type: 'image/jpeg' }) + }) + core.addFile({ + source: 'jest', + name: '2.jpg', + type: 'image/jpeg', + data: new File([sampleImage], { type: 'image/jpeg' }) + }) + + // removing 1 file + core.removeFile(fileId1) + + await expect(core.upload()).resolves.toBeDefined() + }) + + it('allows new files after the last removeFile()', async () => { + const core = new Core({ allowMultipleUploads: false }) + + // adding 2 files + const fileId1 = core.addFile({ + source: 'jest', + name: '1.jpg', + type: 'image/jpeg', + data: new File([sampleImage], { type: 'image/jpeg' }) + }) + const fileId2 = core.addFile({ + source: 'jest', + name: '2.jpg', + type: 'image/jpeg', + data: new File([sampleImage], { type: 'image/jpeg' }) + }) + + // removing 2 files + core.removeFile(fileId1) + core.removeFile(fileId2) + + await expect(core.upload()).resolves.toBeDefined() + }) }) it('does not dedupe different files', async () => { From 8f36b116ea8593adf69e96d86920044728fc0cf6 Mon Sep 17 00:00:00 2001 From: Evgenia Karunus Date: Tue, 6 Aug 2019 10:00:53 +0200 Subject: [PATCH 2/2] @uppy/core - avoid excessive setState() --- packages/@uppy/core/src/index.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/packages/@uppy/core/src/index.js b/packages/@uppy/core/src/index.js index 1f4f46a7e..11c3afacf 100644 --- a/packages/@uppy/core/src/index.js +++ b/packages/@uppy/core/src/index.js @@ -553,16 +553,14 @@ class Uppy { this.setState({ currentUploads: updatedUploads, - files: updatedFiles + files: updatedFiles, + ...( + // If this is the last file we just removed - allow new uploads! + Object.keys(updatedFiles).length === 0 && + { allowNewUpload: true } + ) }) - // If nothing is uploading anymore, and if nothing has uploaded yet - allow new uploads! - if (Object.keys(updatedFiles).length === 0) { - this.setState({ - allowNewUpload: true - }) - } - removeUploads.forEach((uploadID) => { this._removeUpload(uploadID) })