using System.IO; using System.Threading.Tasks; using CommandLineWrapper; using CommandLineWrapper.JsonResults.Implements; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; namespace JVDesktop.ViewModels; public partial class DashboardViewModel : ViewModel { // Getters private StatusResultGetter? _statusResultGetter; private InfoResultGetter? _infoResultGetter; private AccountListResultGetter? _accountListResultGetter; private HereResultGetter? _hereResultGetter; private ShareListResultGetter? _shareListResultGetter; private ShareSeeResultGetter? _shareSeeResultGetter; private SheetAlignTasksResultGetter? _sheetAlignTasksResultGetter; private SheetListResultGetter? _sheetListResultGetter; /// /// Workspace object /// [ObservableProperty] private JVCSWorkspace? _workspace; /// /// If the workspace object exists, it proves the workspace is initialized /// public bool WorkspaceInitialized => Workspace != null; /// /// Current workspace directory /// [ObservableProperty] private string _currentWorkspaceDirectory = ""; /// /// Currently used account /// [ObservableProperty] private string _currentAccount = "unknown"; /// /// Whether HOST mode is currently enabled /// [ObservableProperty] private bool? _hostMode; /// /// Currently used structure sheet (empty means no sheet is used) /// [ObservableProperty] private string? _currentSheet; /// /// Upstream of the current workspace /// [ObservableProperty] private string _currentUpstream = "127.0.0.1"; /// /// Result from the last alignment check /// [ObservableProperty] private AlignResult? _alignResult; /// /// Result from the last current directory information collection /// [ObservableProperty] private HereResult? _hereResult; /// /// Result from the last change status collection /// [ObservableProperty] private StatusResult? _statusResult; /// /// Result from the last sheet detection /// [ObservableProperty] private SheetListResult? _sheetListResult; /// /// Result from the last account detection /// [ObservableProperty] private AccountListResult? _accountListResult; /// /// Triggered when the workspace changes /// partial void OnWorkspaceChanged(JVCSWorkspace? value) { // Update workspace initialization status OnPropertyChanged(nameof(WorkspaceInitialized)); // Clear status if (value == null) { StatusClean(); return; } // Initial load _ = ReloadFromWorkspace(value); } /// /// Clear status /// private void StatusClean() { CurrentWorkspaceDirectory = ""; CurrentAccount = "unknown"; HostMode = null; CurrentSheet = null; CurrentUpstream = "127.0.0.1"; AlignResult = null; HereResult = null; StatusResult = null; SheetListResult = null; } /// /// Load status from the workspace object /// /// Workspace private async Task ReloadFromWorkspace(JVCSWorkspace workspace) { InitializeGetters(workspace); var alignTask = _sheetAlignTasksResultGetter?.Get(workspace)!; var hereTask = _hereResultGetter?.Get(workspace)!; var statusTask = _statusResultGetter?.Get(workspace)!; var sheetListTask = _sheetListResultGetter?.Get(workspace)!; var accountListTask = _accountListResultGetter?.Get(workspace)!; await Task.WhenAll(alignTask, hereTask, statusTask, sheetListTask, accountListTask); AlignResult = await alignTask; HereResult = await hereTask; StatusResult = await statusTask; SheetListResult = await sheetListTask; AccountListResult = await accountListTask; } /// /// Initializes all getters if they are null. /// /// Workspace private void InitializeGetters(JVCSWorkspace workspace) { if (Workspace == null) return; var workspaceDirectory = ""; if (Workspace.SuccessInitialized) workspaceDirectory = Workspace.WorkspaceDirectory; _statusResultGetter ??= new StatusResultGetter(); _infoResultGetter ??= new InfoResultGetter(""); _accountListResultGetter ??= new AccountListResultGetter(); _hereResultGetter ??= new HereResultGetter(new DirectoryInfo(workspaceDirectory)); _shareListResultGetter ??= new ShareListResultGetter(); _shareSeeResultGetter ??= new ShareSeeResultGetter(""); _sheetAlignTasksResultGetter ??= new SheetAlignTasksResultGetter(); _sheetListResultGetter ??= new SheetListResultGetter(); } }