using System.Collections.ObjectModel; using ClaudeDo.Ui.Localization; using ClaudeDo.Ui.Services; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; namespace ClaudeDo.Ui.ViewModels.Modals.Settings; public sealed partial class SessionSkillsSettingsTabViewModel : ViewModelBase { private readonly IWorkerClient _worker; [ObservableProperty] private string _installUrl = ""; [ObservableProperty] private string _statusMessage = ""; [ObservableProperty] private bool _isBusy; [ObservableProperty] private bool _isEmpty = true; public ObservableCollection Skills { get; } = new(); public SessionSkillsSettingsTabViewModel(IWorkerClient worker) => _worker = worker; public async Task LoadAsync() { IsBusy = true; try { var skills = await _worker.GetSessionSkillsAsync(); Skills.Clear(); foreach (var s in skills) Skills.Add(s); IsEmpty = Skills.Count == 0; } finally { IsBusy = false; } } [RelayCommand] private async Task InstallAsync() { if (string.IsNullOrWhiteSpace(InstallUrl)) return; IsBusy = true; StatusMessage = ""; try { var installed = await _worker.InstallSessionSkillAsync(InstallUrl.Trim()); StatusMessage = Loc.T("vm.sessionSkillsTab.installed", string.Join(", ", installed)); InstallUrl = ""; await LoadAsync(); } catch (Exception ex) { StatusMessage = Loc.T("vm.sessionSkillsTab.installFailed", ex.Message); } finally { IsBusy = false; } } [RelayCommand] private async Task UpdateAsync(string? sourceUrl) { if (string.IsNullOrWhiteSpace(sourceUrl)) return; IsBusy = true; StatusMessage = ""; try { await _worker.UpdateSessionSkillAsync(sourceUrl); StatusMessage = Loc.T("vm.sessionSkillsTab.updated"); await LoadAsync(); } catch (Exception ex) { StatusMessage = Loc.T("vm.sessionSkillsTab.updateFailed", ex.Message); } finally { IsBusy = false; } } [RelayCommand] private async Task RemoveAsync(string? sourceUrl) { if (string.IsNullOrWhiteSpace(sourceUrl)) return; IsBusy = true; StatusMessage = ""; try { await _worker.RemoveSessionSkillAsync(sourceUrl); StatusMessage = Loc.T("vm.sessionSkillsTab.removed"); await LoadAsync(); } catch (Exception ex) { StatusMessage = Loc.T("vm.sessionSkillsTab.removeFailed", ex.Message); } finally { IsBusy = false; } } }