Neah/app/hooks/use-courrier.ts

105 lines
3.2 KiB
TypeScript

/**
* Change the current folder and load emails from that folder
*/
const changeFolder = async (folder: string, accountId?: string) => {
console.log(`Changing folder to ${folder} for account ${accountId || 'default'}`);
try {
// Reset selected email
setSelectedEmail(null);
setSelectedEmailIds([]);
// Record the new folder
setCurrentFolder(folder);
// Reset search query when changing folders
setSearchQuery('');
// Reset to page 1
setPage(1);
// Clear existing emails before loading new ones to prevent UI flicker
setEmails([]);
// Show loading state
setIsLoading(true);
// Load emails for the new folder with a deliberate delay to allow state to update
await new Promise(resolve => setTimeout(resolve, 100));
await loadEmails(folder, 1, 20, accountId);
} catch (error) {
console.error(`Error changing to folder ${folder}:`, error);
setError(`Failed to load emails from ${folder}: ${error instanceof Error ? error.message : 'Unknown error'}`);
} finally {
setIsLoading(false);
}
};
/**
* Load emails for the current folder
*/
const loadEmails = async (
folderOverride?: string,
pageOverride?: number,
perPageOverride?: number,
accountIdOverride?: string
) => {
const folderToUse = folderOverride || currentFolder;
const pageToUse = pageOverride || page;
const perPageToUse = perPageOverride || perPage;
const accountIdToUse = accountIdOverride !== undefined ? accountIdOverride :
folderToUse.includes(':') ? folderToUse.split(':')[0] : undefined;
console.log(`Loading emails: folder=${folderToUse}, page=${pageToUse}, accountId=${accountIdToUse || 'default'}`);
try {
setIsLoading(true);
setError('');
// Construct the API URL with a unique timestamp to prevent caching
let url = `/api/courrier/emails?folder=${encodeURIComponent(folderToUse)}&page=${pageToUse}&perPage=${perPageToUse}`;
// Add accountId parameter if specified
if (accountIdToUse) {
url += `&accountId=${encodeURIComponent(accountIdToUse)}`;
}
// Add cache-busting timestamp
url += `&_t=${Date.now()}`;
console.log(`Fetching emails from API: ${url}`);
const response = await fetch(url);
if (!response.ok) {
let errorText;
try {
const errorData = await response.json();
errorText = errorData.error || `Server error: ${response.status}`;
} catch {
errorText = `HTTP error: ${response.status}`;
}
throw new Error(errorText);
}
const data = await response.json();
if (pageOverride === 1 || !pageOverride) {
// Replace emails when loading first page
setEmails(data.emails);
} else {
// Append emails when loading subsequent pages
setEmails(prev => [...prev, ...data.emails]);
}
// Update pagination info
setTotalPages(data.totalPages);
setMailboxes(data.mailboxes || []);
return data;
} catch (error) {
console.error('Error loading emails:', error);
setError(`Failed to load emails: ${error instanceof Error ? error.message : 'Unknown error'}`);
return null;
} finally {
setIsLoading(false);
}
};