diff --git a/packages/@uppy/core/src/Uppy.js b/packages/@uppy/core/src/Uppy.js index c597c97ef..3ed44108a 100644 --- a/packages/@uppy/core/src/Uppy.js +++ b/packages/@uppy/core/src/Uppy.js @@ -59,7 +59,7 @@ class Uppy { debug: false, restrictions: defaultRestrictionOptions, meta: {}, - onBeforeFileAdded: (currentFile) => currentFile, + onBeforeFileAdded: (file, files) => !Object.hasOwn(files, file.id), onBeforeUpload: (files) => files, store: new DefaultStore(), logger: justErrorsLogger, @@ -547,12 +547,12 @@ class Uppy { this.log(`Replaced the blob in the restored ghost file: ${newFile.name}, ${newFile.id}`) } - if (this.checkIfFileAlreadyExists(newFile.id)) { + const onBeforeFileAddedResult = this.opts.onBeforeFileAdded(newFile, nextFilesState) + + if (!onBeforeFileAddedResult && this.checkIfFileAlreadyExists(newFile.id)) { throw new RestrictionError(this.i18n('noDuplicates', { fileName: newFile.name }), { file: fileToAdd }) } - const onBeforeFileAddedResult = this.opts.onBeforeFileAdded(newFile, nextFilesState) - if (onBeforeFileAddedResult === false) { // Don’t show UI info for this error, as it should be done by the developer throw new RestrictionError('Cannot add the file because onBeforeFileAdded returned false.', { isUserFacing: false, file: fileToAdd }) diff --git a/packages/@uppy/core/src/Uppy.test.js b/packages/@uppy/core/src/Uppy.test.js index a3141c09c..35ec8e66c 100644 --- a/packages/@uppy/core/src/Uppy.test.js +++ b/packages/@uppy/core/src/Uppy.test.js @@ -702,6 +702,25 @@ describe('src/Core', () => { expect(onBeforeFileAdded.mock.calls[0][1]).toEqual({}) }) + it('should allow uploading duplicate file if explicitly allowed in onBeforeFileAdded', async () => { + const core = new Core({ onBeforeFileAdded: () => true }) + const sameFileBlob = new File([sampleImage], { type: 'image/jpeg' }) + + core.addFile({ + source: 'jest', + name: 'foo.jpg', + type: 'image/jpeg', + data: sameFileBlob, + }) + + core.addFile({ + source: 'jest', + name: 'foo.jpg', + type: 'image/jpeg', + data: sameFileBlob, + }) + }) + it('should add a file', () => { const fileData = new File([sampleImage], { type: 'image/jpeg' }) const fileAddedEventMock = jest.fn()