fix: preserve folder list when mailbox refetch hits concurrent-request limit

This commit is contained in:
Linus Rath
2026-06-11 19:10:06 +02:00
parent 08f344403b
commit 569dde9985
2 changed files with 20 additions and 0 deletions
+12
View File
@@ -967,6 +967,8 @@ export class JMAPClient implements IJMAPClient {
return this.getMailboxes();
}
let fetchFailed = false;
for (const accountId of accountIds) {
const account = this.accounts[accountId];
const isPrimary = accountId === this.accountId;
@@ -1013,10 +1015,20 @@ export class JMAPClient implements IJMAPClient {
allMailboxes.push(...mailboxes);
}
} catch (error) {
fetchFailed = true;
console.error(`Failed to fetch mailboxes for account ${accountId}:`, error);
}
}
// If every account fetch failed (e.g. a transient maxConcurrentRequests
// limit during a burst of deletes) we have an empty list that is NOT a
// real "this account has no mailboxes" result. Throwing lets the caller's
// catch preserve the existing folder list instead of clobbering it with
// [] — which would leave the sidebar stuck on "Loading mailboxes...".
if (allMailboxes.length === 0 && fetchFailed) {
throw new Error('Failed to fetch mailboxes for all accounts');
}
return allMailboxes;
} catch (error) {
console.error("Failed to fetch all mailboxes:", error);
+8
View File
@@ -646,6 +646,14 @@ export const useEmailStore = create<EmailStore>((set, get) => ({
try {
const mailboxes = await client.getAllMailboxes();
// Guard against a transient fetch returning an empty list (e.g. a server
// concurrent-request limit hit during a burst of deletes). Replacing a
// populated folder list with [] leaves the sidebar stuck on "Loading
// mailboxes..." until the next successful refetch. Keep what we have.
if (mailboxes.length === 0 && !isInitialLoad) {
return;
}
// Auto-select inbox if no mailbox is selected or the current selection
// doesn't exist in the fetched list (e.g. after an account switch)
const currentSelectedMailbox = get().selectedMailbox;