fix(ui): dispose VM subscriptions/timers, guard offline Stop, align review delta-path

- DetailsIslandViewModel/TasksIslandViewModel/ListsIslandViewModel: implement
  IDisposable, unsubscribe Loc.LanguageChanged and worker events (memory leaks).
- IslandsShellViewModel: dispose the three System.Timers.Timer instances.
- StopAsync: guard on Task/IsRunning/IsConnected and wrap CancelTask in try/catch.
- TaskMatchesList virtual:review now matches WaitingForReview (aligns with ReviewFilter).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
mika kuns
2026-06-09 09:53:58 +02:00
co-authored by Claude Opus 4.8
parent 00a065bf7f
commit 01e0c1d794
4 changed files with 72 additions and 15 deletions
@@ -16,7 +16,7 @@ namespace ClaudeDo.Ui.ViewModels.Islands;
public enum ListKind { Smart, Virtual, User }
public sealed partial class ListsIslandViewModel : ViewModelBase
public sealed partial class ListsIslandViewModel : ViewModelBase, IDisposable
{
private readonly IDbContextFactory<ClaudeDoDbContext> _dbFactory;
private readonly IServiceProvider? _services;
@@ -141,6 +141,8 @@ public sealed partial class ListsIslandViewModel : ViewModelBase
public string MachineNameLocal => Loc.T("vm.lists.localSuffix", MachineName);
public string UserInitials { get; }
private readonly EventHandler _langChangedHandler;
public ListsIslandViewModel(IDbContextFactory<ClaudeDoDbContext> dbFactory, IServiceProvider? services = null, WorkerClient? worker = null)
{
_dbFactory = dbFactory;
@@ -163,7 +165,13 @@ public sealed partial class ListsIslandViewModel : ViewModelBase
_worker.ConnectionRestoredEvent += () => _ = RefreshCountsAsync();
}
Loc.LanguageChanged += (_, _) => RefreshLocalizedLabels();
_langChangedHandler = (_, _) => RefreshLocalizedLabels();
Loc.LanguageChanged += _langChangedHandler;
}
public void Dispose()
{
Loc.LanguageChanged -= _langChangedHandler;
}
private static string? SmartListNameKey(string id) => id switch