using System.IO; using System.Windows.Controls; using ClaudeDo.Installer.Core; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Microsoft.Win32; namespace ClaudeDo.Installer.Pages.WelcomePage; public partial class WelcomePageViewModel : ObservableObject, IInstallerPage { private readonly InstallContext _context; private WelcomePageView? _view; public string Title => "Welcome"; public string Icon => "\uE80F"; public int Order => 0; public bool ShowInWizard => true; public bool ShowInSettings => false; public UserControl View => _view ??= new WelcomePageView { DataContext = this }; [ObservableProperty] private string _sourceDirectory = ""; [ObservableProperty] private string _installDirectory = @"C:\Program Files\ClaudeDo"; [ObservableProperty] private string? _sourceError; [ObservableProperty] private string? _installError; public WelcomePageViewModel(InstallContext context) { _context = context; _sourceDirectory = DetectSourceDirectory(); } public Task LoadAsync() { if (!string.IsNullOrEmpty(_context.SourceDirectory)) SourceDirectory = _context.SourceDirectory; if (!string.IsNullOrEmpty(_context.InstallDirectory)) InstallDirectory = _context.InstallDirectory; return Task.CompletedTask; } public Task ApplyAsync() { _context.SourceDirectory = SourceDirectory; _context.InstallDirectory = InstallDirectory; return Task.CompletedTask; } public bool Validate() { var valid = true; if (string.IsNullOrWhiteSpace(SourceDirectory) || !File.Exists(Path.Combine(SourceDirectory, "ClaudeDo.slnx"))) { SourceError = "Source directory must contain ClaudeDo.slnx"; valid = false; } else { SourceError = null; } if (string.IsNullOrWhiteSpace(InstallDirectory)) { InstallError = "Install directory is required"; valid = false; } else { InstallError = null; } return valid; } [RelayCommand] private void BrowseSource() { var dialog = new OpenFolderDialog { Title = "Select ClaudeDo source directory" }; if (dialog.ShowDialog() == true) SourceDirectory = dialog.FolderName; } [RelayCommand] private void BrowseInstall() { var dialog = new OpenFolderDialog { Title = "Select installation directory" }; if (dialog.ShowDialog() == true) InstallDirectory = dialog.FolderName; } private static string DetectSourceDirectory() { var dir = AppContext.BaseDirectory; for (var i = 0; i < 8; i++) { if (File.Exists(Path.Combine(dir, "ClaudeDo.slnx"))) return dir; var parent = Directory.GetParent(dir)?.FullName; if (parent is null) break; dir = parent; } return ""; } }