fix: mail grouping loads all mails at once with large page_size, no infinite scroll during grouping
This commit is contained in:
@@ -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()}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
)}
|
)}
|
||||||
|
|||||||
Reference in New Issue
Block a user