diff --git a/dev/Common/Folders.js b/dev/Common/Folders.js index f00927184..b1ad903fb 100644 --- a/dev/Common/Folders.js +++ b/dev/Common/Folders.js @@ -217,7 +217,7 @@ messagesMoveHelper = (fromFolderFullName, toFolderFullName, uidsForMove) => { isSpam = sSpamFolder === toFolderFullName, isHam = !isSpam && sSpamFolder === fromFolderFullName && getFolderInboxName() === toFolderFullName; - Remote.abort('MessageList').request('MessageMove', + Remote.abort('MessageList', 'reload').request('MessageMove', moveOrDeleteResponseHelper, { fromFolder: fromFolderFullName, @@ -230,7 +230,7 @@ messagesMoveHelper = (fromFolderFullName, toFolderFullName, uidsForMove) => { }, messagesDeleteHelper = (sFromFolderFullName, aUidForRemove) => { - Remote.abort('MessageList').request('MessageDelete', + Remote.abort('MessageList', 'reload').request('MessageDelete', moveOrDeleteResponseHelper, { folder: sFromFolderFullName, diff --git a/dev/Remote/AbstractFetch.js b/dev/Remote/AbstractFetch.js index 03728a734..5b36a0f44 100644 --- a/dev/Remote/AbstractFetch.js +++ b/dev/Remote/AbstractFetch.js @@ -32,10 +32,11 @@ checkResponseError = data => { oRequests = {}, abort = (sAction, sReason, bClearOnly) => { - if (oRequests[sAction]) { - bClearOnly || oRequests[sAction].abort(sReason || 'AbortError'); - oRequests[sAction] = null; - delete oRequests[sAction]; + let controller = oRequests[sAction]; + oRequests[sAction] = null; + if (controller) { + clearTimeout(controller.timeoutId); + bClearOnly || controller.abort(sReason || 'AbortError'); } }, @@ -48,13 +49,17 @@ fetchJSON = (action, sUrl, params, timeout, jsonCallback) => { } } // Don't abort, read https://github.com/the-djmaze/snappymail/issues/487 -// abort(action); +// abort(action, 0, 1); const controller = new AbortController(), signal = controller.signal; oRequests[action] = controller; // Currently there is no way to combine multiple signals, so AbortSignal.timeout() not possible - timeout && setTimeout(() => abort(action, 'TimeoutError'), timeout); - return rl.fetchJSON(sUrl, {signal: signal}, params).then(jsonCallback).catch(err => { + controller.timeoutId = timeout && setTimeout(() => abort(action, 'TimeoutError'), timeout); + return rl.fetchJSON(sUrl, {signal: signal}, params).then(data => { + abort(action, 0, 1); + return jsonCallback(data); + }).catch(err => { + clearTimeout(controller.timeoutId); err.aborted = signal.aborted; err.reason = signal.reason; return Promise.reject(err); @@ -71,8 +76,8 @@ class FetchError extends Error export class AbstractFetchRemote { - abort(sAction) { - abort(sAction); + abort(sAction, sReason) { + abort(sAction, sReason); return this; } @@ -131,11 +136,7 @@ export class AbstractFetchRemote undefined === iTimeout ? 30000 : pInt(iTimeout), data => { let iError = 0; - if (sAction && oRequests[sAction]) { - abort(sAction, 0, 1); - } - - if (!iError && data) { + if (data) { /* if (sAction !== data.Action) { console.log(sAction + ' !== ' + data.Action); diff --git a/dev/Remote/User/Fetch.js b/dev/Remote/User/Fetch.js index 614b662f7..340bd95e6 100644 --- a/dev/Remote/User/Fetch.js +++ b/dev/Remote/User/Fetch.js @@ -20,7 +20,7 @@ class RemoteUserFetch extends AbstractFetchRemote { * @param {object} params * @param {boolean=} bSilent = false */ - messageList(fCallback, params, bSilent = false) { + messageList(fCallback, params) { const // folder = getFolderFromCacheList(params.folder.fullName), folder = getFolderFromCacheList(params.folder), @@ -46,8 +46,7 @@ class RemoteUserFetch extends AbstractFetchRemote { params = {}; } - bSilent || this.abort('MessageList'); - this.request('MessageList', + this.abort('MessageList', 'reload').request('MessageList', fCallback, params, 60000, // 60 seconds before aborting diff --git a/dev/Stores/User/Messagelist.js b/dev/Stores/User/Messagelist.js index b7251284d..708838e43 100644 --- a/dev/Stores/User/Messagelist.js +++ b/dev/Stores/User/Messagelist.js @@ -196,10 +196,13 @@ MessagelistUserStore.reload = (bDropPagePosition = false, bDropCurrentFolderCach (iError, oData, bCached) => { let error = ''; if (iError) { - error = getNotification(iError); - if (Notifications.RequestAborted !== iError) { - MessagelistUserStore([]); + if ('reload' != oData?.reason) { + error = getNotification(iError); + MessagelistUserStore.loading(false); } +// if (Notifications.RequestAborted !== iError) { +// MessagelistUserStore([]); +// } // if (oData.message) { error = oData.message + error; } // if (oData.reason) { error = oData.reason + " " + error; } } else { @@ -278,9 +281,9 @@ MessagelistUserStore.reload = (bDropPagePosition = false, bDropCurrentFolderCach MessagelistUserStore([]); error = getNotification(Notifications.CantGetMessageList); } + MessagelistUserStore.loading(false); } MessagelistUserStore.error(error); - MessagelistUserStore.loading(false); }, { // folder: FolderUserStore.currentFolder() ? self.currentFolder().fullName : ''),