fix: mail grouping loads all mails at once with large page_size, no infinite scroll during grouping

This commit is contained in:
Agent Zero
2026-07-30 18:44:43 +02:00
parent 7cc07c6e55
commit 3d9c8e03eb
2 changed files with 11 additions and 7 deletions
+2 -1
View File
@@ -487,10 +487,11 @@ export function syncFolder(folderId: string): Promise<{ synced: number; error?:
// ─── Mails ────────────────────────────────────────────────────────────────── // ─── Mails ──────────────────────────────────────────────────────────────────
export function fetchMails(folderId: string, page: number, sortBy?: string, sortOrder?: string): Promise<MailListResult> { export function fetchMails(folderId: string, page: number, sortBy?: string, sortOrder?: string, pageSize?: number): Promise<MailListResult> {
const params = new URLSearchParams({ folder_id: folderId, page: String(page) }); const params = new URLSearchParams({ folder_id: folderId, page: String(page) });
if (sortBy) params.set('sort_by', sortBy); if (sortBy) params.set('sort_by', sortBy);
if (sortOrder) params.set('sort_order', sortOrder); if (sortOrder) params.set('sort_order', sortOrder);
if (pageSize) params.set('page_size', String(pageSize));
return apiGet<MailListResult>(`/mail?${params.toString()}`); return apiGet<MailListResult>(`/mail?${params.toString()}`);
} }
+9 -6
View File
@@ -193,11 +193,14 @@ export function MailPage() {
setMailsTotal(result.total); setMailsTotal(result.total);
} }
} else { } else {
const result = await fetchMails(currentFolderId, mailsPage, sortBy, sortOrder); // When grouping is active, load all mails at once (no pagination)
const isGrouping = mailGroupState.conditions.length > 0;
const pageToLoad = isGrouping ? 1 : mailsPage;
const result = await fetchMails(currentFolderId, pageToLoad, sortBy, sortOrder, isGrouping ? 10000 : undefined);
// Only update if still on the same folder // Only update if still on the same folder
if (selectedFolderIdRef.current === currentFolderId) { if (selectedFolderIdRef.current === currentFolderId) {
// Append for infinite scroll (page > 1), replace on page 1 or folder change // Append for infinite scroll (page > 1), replace on page 1 or folder change or grouping
setMails(mailsPage > 1 ? (prev) => [...prev, ...result.mails] : result.mails); setMails(!isGrouping && mailsPage > 1 ? (prev) => [...prev, ...result.mails] : result.mails);
setMailsTotal(result.total); setMailsTotal(result.total);
} }
} }
@@ -209,7 +212,7 @@ export function MailPage() {
} }
} }
setLoadingMails(false); setLoadingMails(false);
}, [selectedFolderId, mailsPage, searchQuery, sortBy, sortOrder]); }, [selectedFolderId, mailsPage, searchQuery, sortBy, sortOrder, mailGroupState]);
useEffect(() => { useEffect(() => {
loadMails(); loadMails();
@@ -908,7 +911,7 @@ export function MailPage() {
setMailsPage((p) => p + 1); setMailsPage((p) => p + 1);
} }
}} }}
hasMore={mails.length < mailsTotal} hasMore={mailGroupState.conditions.length === 0 && mails.length < mailsTotal}
/> />
</ResizablePanel> </ResizablePanel>
@@ -979,7 +982,7 @@ export function MailPage() {
setMailsPage((p) => p + 1); setMailsPage((p) => p + 1);
} }
}} }}
hasMore={mails.length < mailsTotal} hasMore={mailGroupState.conditions.length === 0 && mails.length < mailsTotal}
/> />
</div> </div>
)} )}