feat(installer): mode-aware wizard page list + Update-mode step pipeline
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -3,15 +3,17 @@ using System.Diagnostics;
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using ClaudeDo.Installer.Core;
|
using ClaudeDo.Installer.Core;
|
||||||
|
using ClaudeDo.Installer.Steps;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
using CommunityToolkit.Mvvm.Input;
|
using CommunityToolkit.Mvvm.Input;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace ClaudeDo.Installer.Pages.InstallPage;
|
namespace ClaudeDo.Installer.Pages.InstallPage;
|
||||||
|
|
||||||
public partial class InstallPageViewModel : ObservableObject, IInstallerPage
|
public partial class InstallPageViewModel : ObservableObject, IInstallerPage
|
||||||
{
|
{
|
||||||
private readonly InstallContext _context;
|
private readonly InstallContext _context;
|
||||||
private readonly InstallerService _installerService;
|
private readonly IServiceProvider _serviceProvider;
|
||||||
private InstallPageView? _view;
|
private InstallPageView? _view;
|
||||||
private CancellationTokenSource? _cts;
|
private CancellationTokenSource? _cts;
|
||||||
|
|
||||||
@@ -29,22 +31,31 @@ public partial class InstallPageViewModel : ObservableObject, IInstallerPage
|
|||||||
[ObservableProperty] private bool _hasErrors;
|
[ObservableProperty] private bool _hasErrors;
|
||||||
[ObservableProperty] private double _overallProgress;
|
[ObservableProperty] private double _overallProgress;
|
||||||
|
|
||||||
public InstallPageViewModel(InstallContext context, InstallerService installerService)
|
public InstallPageViewModel(InstallContext context, IServiceProvider serviceProvider)
|
||||||
{
|
{
|
||||||
_context = context;
|
_context = context;
|
||||||
_installerService = installerService;
|
_serviceProvider = serviceProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task LoadAsync()
|
public Task LoadAsync()
|
||||||
{
|
{
|
||||||
Steps.Clear();
|
Steps.Clear();
|
||||||
Steps.Add(new StepViewModel("Publish ClaudeDo.App"));
|
if (_context.Mode == InstallerMode.Update)
|
||||||
Steps.Add(new StepViewModel("Publish ClaudeDo.Worker"));
|
{
|
||||||
Steps.Add(new StepViewModel("Deploy Binaries"));
|
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("Write Configuration"));
|
||||||
Steps.Add(new StepViewModel("Initialize Database"));
|
Steps.Add(new StepViewModel("Initialize Database"));
|
||||||
Steps.Add(new StepViewModel("Register Windows Service"));
|
Steps.Add(new StepViewModel("Register Windows Service"));
|
||||||
Steps.Add(new StepViewModel("Create Shortcuts"));
|
Steps.Add(new StepViewModel("Create Shortcuts"));
|
||||||
|
Steps.Add(new StepViewModel("Write Install Manifest"));
|
||||||
|
}
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,7 +96,24 @@ public partial class InstallPageViewModel : ObservableObject, IInstallerPage
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var results = await _installerService.ExecuteAsync(_context, progress, _cts.Token);
|
IEnumerable<IInstallStep> steps;
|
||||||
|
if (_context.Mode == InstallerMode.Update)
|
||||||
|
{
|
||||||
|
steps = new IInstallStep[]
|
||||||
|
{
|
||||||
|
_serviceProvider.GetRequiredService<StopServiceStep>(),
|
||||||
|
_serviceProvider.GetRequiredService<DownloadAndExtractStep>(),
|
||||||
|
_serviceProvider.GetRequiredService<StartServiceStep>(),
|
||||||
|
_serviceProvider.GetRequiredService<WriteInstallManifestStep>(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
steps = _serviceProvider.GetServices<IInstallStep>();
|
||||||
|
}
|
||||||
|
|
||||||
|
var runner = new InstallerService(steps);
|
||||||
|
var results = await runner.ExecuteAsync(_context, progress, _cts.Token);
|
||||||
HasErrors = results.Any(r => !r.Result.Success);
|
HasErrors = results.Any(r => !r.Result.Success);
|
||||||
}
|
}
|
||||||
catch (OperationCanceledException)
|
catch (OperationCanceledException)
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
|
using System.Linq;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using ClaudeDo.Installer.Core;
|
using ClaudeDo.Installer.Core;
|
||||||
|
using ClaudeDo.Installer.Pages.InstallPage;
|
||||||
|
using ClaudeDo.Installer.Pages.WelcomePage;
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
using CommunityToolkit.Mvvm.Input;
|
using CommunityToolkit.Mvvm.Input;
|
||||||
|
|
||||||
@@ -28,9 +31,14 @@ public partial class WizardViewModel : ObservableObject
|
|||||||
|
|
||||||
public WizardViewModel(PageResolver resolver, InstallContext context)
|
public WizardViewModel(PageResolver resolver, InstallContext context)
|
||||||
{
|
{
|
||||||
Pages = resolver.WizardPages;
|
|
||||||
_context = context;
|
_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)
|
if (Pages.Count > 0)
|
||||||
_ = InitAsync();
|
_ = InitAsync();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user