Migrate Snippets and RSS plugins from local ErrorMessage to unified IToastService
Details
Snippets (v1.7.6):
- Add IToastService to SnippetsViewModel constructor via SnippetsPlugin
- Replace all ErrorMessage assignments with Toast(msg, ToastType.Error)
- Replace ShowSuccess helper to route through Toast(msg, ToastType.Success)
- Remove _errorMessage and _successMessage ObservableProperty fields
- Remove inline error/success Border elements from SnippetsView.axaml
RSS (v1.9.6):
- Add IToastService to RssViewModel constructor via RssPlugin
- Replace all ErrorMessage assignments with Toast(msg, ToastType.Error)
- Convert completion StatusMessage assignments to Toast calls (feed added,
feed removed, refresh complete, mark all read, OPML imported, category set,
feed renamed)
- Keep StatusMessage for progress indicators shown in loading overlay
(fetching feed, saving feed, importing OPML progress)
- Remove ClearStatusAfterDelay helper (no longer needed)
- Remove inline StatusMessage TextBlock from bottom bar in RssView.axaml
- Remove _errorMessage ObservableProperty field
Migrate Contacts from local toasts to unified IToastService
Details
Replace inline ErrorMessage/SuccessMessage ObservableProperties and
their AXAML toast borders with the shell-level IToastService via a
private Toast() helper method, matching the pattern established by
Calendar and Tasks.
- Add Toast() helper routing to _host.Toast.Show() with StatusMessage fallback
- Convert all ErrorMessage assignments (30 sites) to Toast(..., ToastType.Error)
- Convert all SuccessMessage assignments (20 sites) to Toast(..., ToastType.Success)
- Remove _errorMessage/_successMessage ObservableProperty declarations
- Remove OnSuccessMessageChanged auto-dismiss partial method
- Remove Error Toast and Success Toast Border elements from ContactsView.axaml
- Add _statusMessage ObservableProperty for fallback path
Guard BackupService and vault unlock for client mode
Details
- BackupService: skip scheduled backups in client mode (server handles
its own backups). Previously, SettingsViewModel's DI resolution
triggered BackupService constructor which immediately started the
backup timer — even in client mode.
- PluginRegistry.EnsurePluginVaultsUnlocked: skip in client mode since
vault state is managed by the server. The NativeLib vault calls would
fail (or succeed silently via catch) since the native runtime isn't
initialized in client mode.
Register EmbeddingService and IEmbeddingService in Desktop DI
Details
EmbeddingService (ONNX embedding model) and its IEmbeddingService
interface were never registered in Desktop's DI container. The Server
project registered a no-op HeadlessEmbeddingService, but Desktop was
missing the mapping entirely. This caused RagSearchService resolution
to fail when CommandPaletteViewModel built AI commands during
MainWindowViewModel construction.
Pre-existing bug surfaced by client mode startup where the full
DI resolution chain is exercised earlier than in standalone mode.
Migrate Files plugin from local ErrorMessage/SuccessMessage to unified IToastService
Details
Replace inline ErrorMessage and SuccessMessage observable properties with
centralized Toast() helper that delegates to _host.Toast.Show(). This removes
the custom auto-dismiss timer (OnSuccessMessageChanged) and inline TextBlock
toast UI from FilesView.axaml, aligning with the shell's unified toast system
already adopted by Calendar and other plugins.
Changes:
- Add private Toast() helper method using _host.Toast.Show()
- Replace all ErrorMessage assignments with Toast(..., ToastType.Error)
- Replace all SuccessMessage assignments with Toast(..., ToastType.Success)
- Remove ErrorMessage and SuccessMessage observable properties
- Remove OnSuccessMessageChanged partial method (3-second auto-dismiss)
- Remove ErrorMessage TextBlock from vault unlock panel in AXAML
- Remove SuccessMessage/ErrorMessage TextBlocks from status bar in AXAML
Get notified about new releases