diff --git a/packages/@uppy/core/src/index.js b/packages/@uppy/core/src/index.js index 6361173089..ea18732b6d 100644 --- a/packages/@uppy/core/src/index.js +++ b/packages/@uppy/core/src/index.js @@ -402,21 +402,6 @@ class Uppy { onError(new Error('Cannot add new files: already uploading.')) } - const onBeforeFileAddedResult = this.opts.onBeforeFileAdded(file, files) - - if (onBeforeFileAddedResult === false) { - this.log('Not adding file because onBeforeFileAdded returned false') - return - } - - if (typeof onBeforeFileAddedResult === 'object' && onBeforeFileAddedResult) { - // warning after the change in 0.24 - if (onBeforeFileAddedResult.then) { - throw new TypeError('onBeforeFileAdded() returned a Promise, but this is no longer supported. It must be synchronous.') - } - file = onBeforeFileAddedResult - } - const fileType = getFileType(file) let fileName if (file.name) { @@ -437,7 +422,7 @@ class Uppy { // `null` means the size is unknown. const size = isFinite(file.data.size) ? file.data.size : null - const newFile = { + let newFile = { source: file.source || '', id: fileID, name: fileName, @@ -465,6 +450,17 @@ class Uppy { onError(err) } + const onBeforeFileAddedResult = this.opts.onBeforeFileAdded(newFile, files) + + if (onBeforeFileAddedResult === false) { + this.log('Not adding file because onBeforeFileAdded returned false') + return + } + + if (typeof onBeforeFileAddedResult === 'object' && onBeforeFileAddedResult) { + newFile = onBeforeFileAddedResult + } + this.setState({ files: Object.assign({}, files, { [fileID]: newFile @@ -1244,6 +1240,21 @@ class Uppy { } let files = this.getState().files + + const handleError = (err) => { + const message = typeof err === 'object' ? err.message : err + const details = typeof err === 'object' ? err.details : null + this.log(`${message} ${details}`) + this.info({ message: message, details: details }, 'error', 4000) + return Promise.reject(typeof err === 'object' ? err : new Error(err)) + } + + try { + this._checkMinNumberOfFiles(files) + } catch (err) { + return handleError(err) + } + const onBeforeUploadResult = this.opts.onBeforeUpload(files) if (onBeforeUploadResult === false) { @@ -1251,16 +1262,10 @@ class Uppy { } if (onBeforeUploadResult && typeof onBeforeUploadResult === 'object') { - // warning after the change in 0.24 - if (onBeforeUploadResult.then) { - throw new TypeError('onBeforeUpload() returned a Promise, but this is no longer supported. It must be synchronous.') - } - files = onBeforeUploadResult } return Promise.resolve() - .then(() => this._checkMinNumberOfFiles(files)) .then(() => { const { currentUploads } = this.getState() // get a list of files that are currently assigned to uploads @@ -1278,13 +1283,7 @@ class Uppy { const uploadID = this._createUpload(waitingFileIDs) return this._runUpload(uploadID) }) - .catch((err) => { - const message = typeof err === 'object' ? err.message : err - const details = typeof err === 'object' ? err.details : null - this.log(`${message} ${details}`) - this.info({ message: message, details: details }, 'error', 4000) - return Promise.reject(typeof err === 'object' ? err : new Error(err)) - }) + .catch(handleError) } }