From 7363e484968715972bdec52a430c56a4f94c4861 Mon Sep 17 00:00:00 2001 From: Mika Kuns Date: Tue, 14 Apr 2026 16:47:46 +0200 Subject: [PATCH] fix(ui): address code review findings - Fix event handler leak in TaskDetailView.OnDataContextChanged (unsubscribe from previous ViewModel before subscribing to new one) - Move FormatFile call off UI thread with Task.Run to prevent freeze on large log files Co-Authored-By: Claude Opus 4.6 (1M context) --- src/ClaudeDo.Ui/ViewModels/TaskDetailViewModel.cs | 2 +- src/ClaudeDo.Ui/Views/TaskDetailView.axaml.cs | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/ClaudeDo.Ui/ViewModels/TaskDetailViewModel.cs b/src/ClaudeDo.Ui/ViewModels/TaskDetailViewModel.cs index 33cdfcd..63b30c9 100644 --- a/src/ClaudeDo.Ui/ViewModels/TaskDetailViewModel.cs +++ b/src/ClaudeDo.Ui/ViewModels/TaskDetailViewModel.cs @@ -90,7 +90,7 @@ public partial class TaskDetailViewModel : ViewModelBase && File.Exists(task.LogPath)) { _formatter = new StreamLineFormatter(); - LiveText = _formatter.FormatFile(task.LogPath); + LiveText = await Task.Run(() => _formatter.FormatFile(task.LogPath)); } StatusText = task.Status.ToString().ToLowerInvariant(); StatusChoice = task.Status.ToString(); diff --git a/src/ClaudeDo.Ui/Views/TaskDetailView.axaml.cs b/src/ClaudeDo.Ui/Views/TaskDetailView.axaml.cs index b8e3b79..f5d2f6d 100644 --- a/src/ClaudeDo.Ui/Views/TaskDetailView.axaml.cs +++ b/src/ClaudeDo.Ui/Views/TaskDetailView.axaml.cs @@ -33,13 +33,16 @@ public partial class TaskDetailView : UserControl this.FindControl("TitleBox")?.Focus(); } + private TaskDetailViewModel? _previousVm; + protected override void OnDataContextChanged(EventArgs e) { base.OnDataContextChanged(e); - if (DataContext is TaskDetailViewModel vm) - { - vm.PropertyChanged += OnViewModelPropertyChanged; - } + if (_previousVm is not null) + _previousVm.PropertyChanged -= OnViewModelPropertyChanged; + _previousVm = DataContext as TaskDetailViewModel; + if (_previousVm is not null) + _previousVm.PropertyChanged += OnViewModelPropertyChanged; } private void OnViewModelPropertyChanged(object? sender, PropertyChangedEventArgs e)