diff --git a/src/ClaudeDo.Installer/Pages/InstallPage/InstallPageViewModel.cs b/src/ClaudeDo.Installer/Pages/InstallPage/InstallPageViewModel.cs index 1993391..fed4636 100644 --- a/src/ClaudeDo.Installer/Pages/InstallPage/InstallPageViewModel.cs +++ b/src/ClaudeDo.Installer/Pages/InstallPage/InstallPageViewModel.cs @@ -3,15 +3,17 @@ using System.Diagnostics; using System.Windows; using System.Windows.Controls; using ClaudeDo.Installer.Core; +using ClaudeDo.Installer.Steps; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; +using Microsoft.Extensions.DependencyInjection; namespace ClaudeDo.Installer.Pages.InstallPage; public partial class InstallPageViewModel : ObservableObject, IInstallerPage { private readonly InstallContext _context; - private readonly InstallerService _installerService; + private readonly IServiceProvider _serviceProvider; private InstallPageView? _view; private CancellationTokenSource? _cts; @@ -29,22 +31,31 @@ public partial class InstallPageViewModel : ObservableObject, IInstallerPage [ObservableProperty] private bool _hasErrors; [ObservableProperty] private double _overallProgress; - public InstallPageViewModel(InstallContext context, InstallerService installerService) + public InstallPageViewModel(InstallContext context, IServiceProvider serviceProvider) { _context = context; - _installerService = installerService; + _serviceProvider = serviceProvider; } public Task LoadAsync() { Steps.Clear(); - Steps.Add(new StepViewModel("Publish ClaudeDo.App")); - Steps.Add(new StepViewModel("Publish ClaudeDo.Worker")); - Steps.Add(new StepViewModel("Deploy Binaries")); - Steps.Add(new StepViewModel("Write Configuration")); - Steps.Add(new StepViewModel("Initialize Database")); - Steps.Add(new StepViewModel("Register Windows Service")); - Steps.Add(new StepViewModel("Create Shortcuts")); + if (_context.Mode == InstallerMode.Update) + { + Steps.Add(new StepViewModel("Stop Worker Service")); + Steps.Add(new StepViewModel("Download and Extract")); + Steps.Add(new StepViewModel("Start Worker Service")); + Steps.Add(new StepViewModel("Write Install Manifest")); + } + else + { + Steps.Add(new StepViewModel("Download and Extract")); + Steps.Add(new StepViewModel("Write Configuration")); + Steps.Add(new StepViewModel("Initialize Database")); + Steps.Add(new StepViewModel("Register Windows Service")); + Steps.Add(new StepViewModel("Create Shortcuts")); + Steps.Add(new StepViewModel("Write Install Manifest")); + } return Task.CompletedTask; } @@ -85,7 +96,24 @@ public partial class InstallPageViewModel : ObservableObject, IInstallerPage try { - var results = await _installerService.ExecuteAsync(_context, progress, _cts.Token); + IEnumerable steps; + if (_context.Mode == InstallerMode.Update) + { + steps = new IInstallStep[] + { + _serviceProvider.GetRequiredService(), + _serviceProvider.GetRequiredService(), + _serviceProvider.GetRequiredService(), + _serviceProvider.GetRequiredService(), + }; + } + else + { + steps = _serviceProvider.GetServices(); + } + + var runner = new InstallerService(steps); + var results = await runner.ExecuteAsync(_context, progress, _cts.Token); HasErrors = results.Any(r => !r.Result.Success); } catch (OperationCanceledException) diff --git a/src/ClaudeDo.Installer/Views/WizardViewModel.cs b/src/ClaudeDo.Installer/Views/WizardViewModel.cs index 45f6d66..7b775aa 100644 --- a/src/ClaudeDo.Installer/Views/WizardViewModel.cs +++ b/src/ClaudeDo.Installer/Views/WizardViewModel.cs @@ -1,5 +1,8 @@ +using System.Linq; using System.Windows; using ClaudeDo.Installer.Core; +using ClaudeDo.Installer.Pages.InstallPage; +using ClaudeDo.Installer.Pages.WelcomePage; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; @@ -28,9 +31,14 @@ public partial class WizardViewModel : ObservableObject public WizardViewModel(PageResolver resolver, InstallContext context) { - Pages = resolver.WizardPages; _context = context; + var all = resolver.WizardPages; + Pages = context.Mode == InstallerMode.Update + ? all.Where(p => p is WelcomePageViewModel + || p is InstallPageViewModel).ToList() + : all; + if (Pages.Count > 0) _ = InitAsync(); }