feat: live IMAP sync on folder select + 60s auto-sync interval

- New imap_sync_folder function: syncs single folder quickly for live use
- New POST /mail/folders/{folder_id}/sync route
- Frontend: syncFolder API + called on every folder selection
- Auto-sync interval reduced from 300s to 60s
- Sent mail IMAP APPEND already uploads full body via msg.as_bytes()
This commit is contained in:
Agent Zero
2026-07-20 12:01:16 +02:00
parent c24a86bc90
commit 3313047577
5 changed files with 259 additions and 3 deletions
+4
View File
@@ -481,6 +481,10 @@ export function emptyFolder(folderId: string): Promise<{ emptied_count: number }
return apiPost<{ emptied_count: number }>(`/mail/folders/${folderId}/empty`, {});
}
export function syncFolder(folderId: string): Promise<{ synced: number; error?: string }> {
return apiPost<{ synced: number; error?: string }>(`/mail/folders/${folderId}/sync`, {});
}
// ─── Mails ──────────────────────────────────────────────────────────────────
export function fetchMails(folderId: string, page: number, sortBy?: string, sortOrder?: string): Promise<MailListResult> {
+8 -2
View File
@@ -35,6 +35,7 @@ import {
saveDraft,
updateDraft,
triggerSync,
syncFolder,
type MailAccount,
type MailFolder,
type Mail,
@@ -168,7 +169,7 @@ export function MailPage() {
loadMails();
}, [loadMails]);
// Handle folder selection — derive account from folder
// Handle folder selection — derive account from folder + trigger live IMAP sync
const handleSelectFolder = useCallback(
(folderId: string) => {
setSelectedFolderId(folderId);
@@ -181,8 +182,13 @@ export function MailPage() {
setSelectedMail(null);
setSelectedMailIds(new Set());
setActiveView('list');
// Live sync: fetch new mails from IMAP server immediately
syncFolder(folderId).then(() => {
loadMails();
loadAllFolders();
}).catch(() => {});
},
[folders],
[folders, loadMails, loadAllFolders],
);
// Handle mail selection