From 2503175025f342057a069cc199be30a36eeaa338 Mon Sep 17 00:00:00 2001 From: Mikael Finstad Date: Mon, 17 Mar 2025 18:52:41 +0800 Subject: [PATCH] dry retryAll() and upload() improvement of #5677 --- packages/@uppy/core/src/Uppy.ts | 62 ++++++++++++--------------------- 1 file changed, 23 insertions(+), 39 deletions(-) diff --git a/packages/@uppy/core/src/Uppy.ts b/packages/@uppy/core/src/Uppy.ts index f9166746b9..550d308ce1 100644 --- a/packages/@uppy/core/src/Uppy.ts +++ b/packages/@uppy/core/src/Uppy.ts @@ -1371,20 +1371,25 @@ export class Uppy< this.emit('resume-all') } - retryAll(): Promise | undefined> { - const updatedFiles = { ...this.getState().files } - const filesToRetry = Object.keys(updatedFiles).filter((file) => { - return updatedFiles[file].error + #getFilesToRetry() { + const { files } = this.getState() + return Object.keys(files).filter((file) => { + return files[file].error }) + } - filesToRetry.forEach((file) => { - const updatedFile = { - ...updatedFiles[file], + async retryAll(): Promise | undefined> { + const filesToRetry = this.#getFilesToRetry() + + const updatedFiles = { ...this.getState().files } + filesToRetry.forEach((fileID) => { + updatedFiles[fileID] = { + ...updatedFiles[fileID], isPaused: false, error: null, } - updatedFiles[file] = updatedFile }) + this.setState({ files: updatedFiles, error: null, @@ -1393,10 +1398,10 @@ export class Uppy< this.emit('retry-all', Object.values(updatedFiles)) if (filesToRetry.length === 0) { - return Promise.resolve({ + return { successful: [], failed: [], - }) + } } const uploadID = this.#createUpload(filesToRetry, { @@ -2248,42 +2253,21 @@ export class Uppy< let { files } = this.getState() - // Check if we have files with errors (for retry behavior) - const filesToRetry = Object.keys(files).filter( - (fileID) => files[fileID].error, - ) - const hasFilesToRetry = filesToRetry.length > 0 - - // If we have files to retry, behave like retryAll() and ignore any new files - if (hasFilesToRetry) { - const updatedFiles = { ...files } - filesToRetry.forEach((fileID) => { - updatedFiles[fileID] = { - ...updatedFiles[fileID], - isPaused: false, - error: null, - } - }) + // retry any failed files from a previous upload() call + const filesToRetry = this.#getFilesToRetry() + if (filesToRetry.length > 0) { + const retryResult = await this.retryAll() - this.setState({ - files: updatedFiles, - error: null, - }) - - this.emit('retry-all', Object.values(updatedFiles)) - - const uploadID = this.#createUpload(filesToRetry, { - forceAllowNewUpload: true, // create new upload even if allowNewUpload: false - }) - const result = await this.#runUpload(uploadID) const hasNewFiles = this.getFiles().filter( (file) => file.progress.uploadStarted == null, ) + // if no new files, make it idempotent and return if (!hasNewFiles) { - return result + return retryResult } - files = this.getState().files + // reload files which might have changed after retry + ;({ files } = this.getState()) } // If no files to retry, proceed with original upload() behavior for new files