courrier multi account restore compose

This commit is contained in:
alma 2025-04-29 10:45:56 +02:00
parent d34bf5202c
commit 4e7bdb1631

View File

@ -679,7 +679,7 @@ export default function CourrierPage() {
} }
// If no match and not INBOX, show error // If no match and not INBOX, show error
if (!exactMatch && !baseFolder.includes('INBOX') && baseFolder !== 'INBOX') { if (!exactMatch && !baseFolder.toLowerCase().includes('inbox')) {
logEmailOp('MAILBOX-CHANGE', `ERROR: Folder not found: ${baseFolder}`); logEmailOp('MAILBOX-CHANGE', `ERROR: Folder not found: ${baseFolder}`);
toast({ toast({
title: "Folder not found", title: "Folder not found",
@ -694,10 +694,8 @@ export default function CourrierPage() {
const folderToUse = exactMatch || prefixedFolder; const folderToUse = exactMatch || prefixedFolder;
logEmailOp('MAILBOX-CHANGE', `Proceeding with folder: ${folderToUse}`); logEmailOp('MAILBOX-CHANGE', `Proceeding with folder: ${folderToUse}`);
// Update UI state // CRITICAL FIX: Lock in the selected folder BEFORE changing it in the system
setSelectedAccount(account); // This prevents any race conditions where the folder gets reset to INBOX
// Update the selected folders map with the normalized folder name
setSelectedFolders(prev => { setSelectedFolders(prev => {
const updated = { const updated = {
...prev, ...prev,
@ -707,15 +705,23 @@ export default function CourrierPage() {
return updated; return updated;
}); });
// Use a deliberate delay before changing folder to ensure state is updated // Use the correct changeFolder method to handle the folder change properly
logEmailOp('MAILBOX-CHANGE', `Starting folder change after delay...`); // This ensures that the account ID is properly passed along
changeFolder(folderToUse, accountId)
// Reduce timeout to improve responsiveness .then(() => {
setTimeout(() => { logEmailOp('MAILBOX-CHANGE', `Successfully changed to folder ${folderToUse}`);
logEmailOp('MAILBOX-CHANGE', `Loading emails for folder: ${folderToUse}, account: ${accountId}`); })
changeFolder(folderToUse, accountId); .catch(error => {
setLoading(false); logEmailOp('MAILBOX-CHANGE', `ERROR: Failed to change to folder ${folderToUse}`, { error });
}, 150); // Reduced from 300ms to 150ms for better responsiveness toast({
title: "Error changing folders",
description: `Failed to change to folder ${baseFolder}. ${error?.message || ''}`,
variant: "destructive",
});
})
.finally(() => {
setLoading(false);
});
}; };
// Update the folder button rendering to show selected state based on account // Update the folder button rendering to show selected state based on account
@ -816,15 +822,20 @@ export default function CourrierPage() {
setSelectedAccount(account); setSelectedAccount(account);
logEmailOp('ACCOUNT-SELECT', `Selected account set to: ${account.email}`); logEmailOp('ACCOUNT-SELECT', `Selected account set to: ${account.email}`);
// Initially hide folders during transition
setShowFolders(false);
// Find an INBOX folder in this account's folders // Find an INBOX folder in this account's folders
// Look for exact INBOX or accountId:INBOX pattern // Look for exact INBOX or accountId:INBOX pattern
const inboxPatterns = ['INBOX', ':INBOX', 'inbox', 'Inbox']; const inboxPatterns = ['INBOX', ':INBOX', 'inbox', 'Inbox'];
let inboxFolder = account.folders.find(f => let inboxFolder = account.folders.find(f =>
inboxPatterns.some(pattern => f.includes(pattern)) inboxPatterns.some(pattern => {
const hasPattern = f.includes(pattern);
// For prefixed folders, make sure it's for the current account
if (f.includes(':')) {
const [folderId] = f.split(':');
return hasPattern && folderId === account.id;
}
return hasPattern;
})
); );
// If no inbox found, use the first folder or create a default inbox path // If no inbox found, use the first folder or create a default inbox path
@ -843,32 +854,27 @@ export default function CourrierPage() {
logEmailOp('ACCOUNT-SELECT', `Added account prefix to folder: ${inboxFolder}`); logEmailOp('ACCOUNT-SELECT', `Added account prefix to folder: ${inboxFolder}`);
} }
// We don't need to manually set currentFolder as it's managed by changeFolder // Update the selected folders map with the proper account ID and folder
// Instead, just log that we'll update it through the proper function
logEmailOp('ACCOUNT-SELECT', `Will update current folder to: ${inboxFolder} through folder change`);
// Create a streamlined account selection sequence
// Step 1: Show folders immediately for better feedback
setShowFolders(true);
logEmailOp('ACCOUNT-SELECT', `Folders shown for account: ${account.email}`);
// Step 2: Update the selected folders map immediately
setSelectedFolders(prev => { setSelectedFolders(prev => {
const updated = { const updated = {
...prev, ...prev,
[account.id.toString()]: inboxFolder [account.id]: inboxFolder
}; };
logEmailOp('ACCOUNT-SELECT', `Updated selected folders map`, updated); logEmailOp('ACCOUNT-SELECT', `Updated selected folders map`, updated);
return updated; return updated;
}); });
// Step 3: Wait a small delay and then load emails // First, show the folders for better UX
logEmailOp('ACCOUNT-SELECT', `Starting folder change after short delay`); setShowFolders(true);
// Use a slight delay to ensure state updates have propagated before changing folder
setTimeout(() => { setTimeout(() => {
logEmailOp('ACCOUNT-SELECT', `Triggering folder change to: ${inboxFolder}`); logEmailOp('ACCOUNT-SELECT', `Triggering folder change to: ${inboxFolder} for account ${account.id}`);
handleMailboxChange(inboxFolder, account.id.toString());
// Use handleMailboxChange which properly passes the account ID with the folder
handleMailboxChange(inboxFolder, account.id);
setLoading(false); setLoading(false);
}, 100); // Reduced delay for better responsiveness }, 100);
}; };
const handleAddAccount = async (accountData: AccountData) => { const handleAddAccount = async (accountData: AccountData) => {