Streaming batched sync with real-time UI updates (v1.9.0)
Details
Add FetchHeadersBatchedAsync to ImapSyncService for initial sync: fetches
all UIDs, reverse-sorts newest-first, fetches in batches of 50 with
IProgress<List<EmailMessage>> callback. EmailSyncManager fires
MessageBatchSynced event per batch, persisting each batch immediately.
ViewModel inserts new messages at correct sorted position in real-time.
Add sync progress bar with "Syncing: X of Y messages..." indicator.
Incremental sync (subsequent syncs) remains unchanged.
Paginated message loading with virtual scrolling (v1.8.0)
Details
Replace load-all-messages with paginated loading using SDK limit/offset
parameters (50 messages per page). Add VirtualizingStackPanel to ListBox
for efficient rendering of only visible items. Auto-load next page when
user scrolls past 80% depth. Add explicit "Load more messages" button as
fallback. Add CountMessagesAsync to EntityService via SDK CountAsync.
Slim email header schema and reduce IMAP fetch (v1.7.0)
Details
Move To, Cc, Size, IsAnswered, InReplyTo to transient fields populated
on-demand by FetchBodyAsync instead of persisting them per-entity. This
reduces stored entity size by ~50%. IMAP header fetch now only requests
UniqueId, Envelope, Flags, and BodyStructure (drops Size and PreviewText).
Snippet row removed from message list view since preview text is no longer
fetched during sync. Search now filters on Subject and From only. Compose
reply/forward uses BodyText instead of removed Snippet field.
Fix folder discovery and initial message sync (v1.6.0)
Details
Two critical sync bugs:
1. GetSubfoldersAsync(true) means subscribedOnly=true, which on Gmail
skips system folders (Sent, Drafts, Trash, Spam, All Mail, etc.).
Changed to GetSubfoldersAsync(false) to enumerate all folders.
2. Phase 2 message fetch used the server's CURRENT UidNext from Phase 1
(e.g., 5000), creating range [5000, MaxValue] — zero existing messages.
Now uses the PREVIOUSLY stored UidNext from the DB. For new folders
(first sync), UidNext=0 fetches all messages via [MinValue, MaxValue].
Use toast notifications for email sync feedback (v1.5.0)
Details
Replace inline ErrorMessage strings with actionable toast
notifications for sync failures ("Action Needed" with guidance
to check password/app password). Add success toast on sync
complete ("All Set"). Wired IToastService from Host.Toast into
EmailViewModel. Bumped version from 1.4.4 to 1.5.0.
Get notified about new releases