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.
Add toast notification system to Desktop (v1.33.0)
Details
Implement ToastService and ToastContainer control for global
in-app toast notifications. Toasts appear top-center with
type-based styling (Success/Info/Warning/Error), friendly
labels ("All Set", "FYI", "Heads Up", "Action Needed"),
optional action buttons, and auto-dismiss (5-10s by type).
Max 4 visible with oldest trimmed on overflow.
Added ThemeInfo/ThemeInfoMuted color + brush resources to all
7 theme files. Registered ToastService in DI, wired through
PluginHostFactory → PluginHost → IPluginHost.Toast so plugins
can show toasts via Host.Toast.Show(). Bumped Desktop version
from 1.32.1 to 1.33.0.
Migrate to IVaultConsumer + SDK vault unlock (v1.8.0)
Details
Replace the Files plugin's hardcoded vault password field and manual
unlock/initialize UI with the centralized SDK RequestVaultUnlockAsync
mechanism. The plugin now implements IVaultConsumer to declare its vault
dependency, and vault unlock is handled via the shared password dialog
prompt from the host application.
Changes:
- FilesPlugin: Add IVaultConsumer with VaultIds => ["privstack.files"]
- FileService: Add EnsureVaultUnlockedAsync() using SDK unlock prompt
- FilesViewModel: Remove VaultPassword, UnlockVaultAsync,
InitializeVaultAsync commands; replace with EnsureVaultUnlockedAsync
- FilesView: Replace 65-line vault unlock panel (password field + two
sub-panels) with simple "Vault Locked" state + single unlock button
- Version bump 1.7.7 → 1.8.0
Get notified about new releases