courrier multi account restore compose

This commit is contained in:
alma 2025-04-30 13:21:53 +02:00
parent f0710c474b
commit 608005d9ee

View File

@ -368,19 +368,107 @@ export const useCourrier = () => {
console.log(`[changeFolder] Setting currentFolder to: ${prefixedFolder}`);
setCurrentFolder(prefixedFolder);
// CRITICAL FIX: Wait for state updates to propagate
setTimeout(async () => {
// CRITICAL FIX: Create a local implementation of loadEmails that doesn't use currentFolder state
// This completely avoids the race condition with React state updates
const loadEmailsForFolder = async () => {
try {
// CRITICAL FIX: Always pass the effective account ID explicitly to loadEmails
// This ensures account context is maintained even if currentFolder hasn't updated yet
await loadEmails(false, effectiveAccountId);
console.log(`[changeFolder] Loading emails with fixed parameters: folder=${normalizedFolder}, accountId=${effectiveAccountId}`);
// CRITICAL FIX: Use a timeout to give UI time to update but avoid state race conditions
await new Promise(resolve => setTimeout(resolve, 50));
setIsLoading(true);
setError(null);
// Try to get cached emails first with the correct parameters
// This uses our local variables, not the potentially stale state
const cachedEmails = await getCachedEmailsWithTimeout(
session?.user?.id || '', // userId
`${effectiveAccountId}:${normalizedFolder}`, // folderForCache - use local variables
1, // page
perPage, // perPage
100, // timeoutMs
effectiveAccountId // accountId - use local variable
);
if (cachedEmails) {
// Process cached emails similar to loadEmails
if (Array.isArray(cachedEmails.emails)) {
// Set emails from cache using the local function
console.log(`[changeFolder] Setting ${cachedEmails.emails.length} cached emails for folder ${normalizedFolder}`);
setEmails(cachedEmails.emails.sort((a: Email, b: Email) =>
new Date(b.date).getTime() - new Date(a.date).getTime()));
// Set other state from cache
if (cachedEmails.totalEmails) setTotalEmails(cachedEmails.totalEmails);
if (cachedEmails.totalPages) setTotalPages(cachedEmails.totalPages);
if (cachedEmails.mailboxes && cachedEmails.mailboxes.length > 0) {
setMailboxes(cachedEmails.mailboxes);
}
}
// Start background refresh with the correct parameters
console.log(`[changeFolder] Starting background refresh with folder=${normalizedFolder}, accountId=${effectiveAccountId}`);
refreshEmailsInBackground(
session?.user?.id || '',
normalizedFolder, // Use normalized folder name without prefix
1, // page
perPage, // perPage
effectiveAccountId // Use effective account ID
).catch(err => {
console.error('[changeFolder] Background refresh error:', err);
});
} else {
// No cache hit, perform direct API call similar to loadEmails
// Construct query parameters with the correct values
const queryParams = new URLSearchParams({
folder: normalizedFolder,
page: '1',
perPage: perPage.toString(),
accountId: effectiveAccountId
});
console.log(`[changeFolder] Fetching emails from API with params: ${queryParams.toString()}`);
const response = await fetch(`/api/courrier?${queryParams.toString()}`);
if (!response.ok) {
const errorData = await response.json();
throw new Error(errorData.error || 'Failed to fetch emails');
}
const data = await response.json();
// Update state with fetched data
if (Array.isArray(data.emails)) {
setEmails(data.emails.sort((a: Email, b: Email) =>
new Date(b.date).getTime() - new Date(a.date).getTime()));
if (data.totalEmails) setTotalEmails(data.totalEmails);
if (data.totalPages) setTotalPages(data.totalPages);
if (data.mailboxes && data.mailboxes.length > 0) {
setMailboxes(data.mailboxes);
}
} else {
setEmails([]);
}
}
console.log(`[changeFolder] Finished changing to folder=${prefixedFolder}`);
} catch (error) {
console.error(`[changeFolder] Error in delayed loadEmails:`, error);
console.error(`[changeFolder] Error loading emails:`, error);
setError(error instanceof Error ? error.message : 'Error loading emails');
} finally {
setIsLoading(false);
}
}, 50);
};
// Execute our local function that doesn't depend on state updates
loadEmailsForFolder().catch(error => {
console.error(`[changeFolder] Unhandled error:`, error);
setError(error instanceof Error ? error.message : 'Unknown error');
setIsLoading(false);
});
} catch (error) {
console.error(`[changeFolder] Error changing to folder ${folder}:`, error);
setError(error instanceof Error ? error.message : 'Unknown error');