@page "/" @page "/{id:guid}" @using LANCommander.Launcher.Data.Models @using LANCommander.Launcher.Models.Enums @using LANCommander.Launcher.Models @using System.Diagnostics @using LANCommander.Launcher.UI.Library.Components @using LANCommander.SDK.Helpers @inject SDK.Client Client @inject NavigationManager NavigationManager @inject LibraryService LibraryService @inject InstallService InstallService @inject GameService GameService @inject ModalService ModalService @inject ConfirmService ConfirmService @inject ImportService ImportService @inject LocalizationService LocalizationService
@if (SelectedGame != null) {
@if (SelectedGame.Media.Any(m => m.Type == SDK.Enums.MediaType.Logo)) {
@if (SelectedItem.State == ListItemState.Installed) { } else if (SelectedItem.State == ListItemState.NotInstalled) { } else if (SelectedItem.State == ListItemState.Queued) { } else if (SelectedItem.State == ListItemState.UpdateAvailable) { } else if (SelectedItem.State == ListItemState.Installing) { } else if (SelectedItem.State == ListItemState.Uninstalling) { } @if (SelectedItem.State == ListItemState.NotInstalled && Connected) { }
@if (SelectedGame.Media.Any(m => m.Type == SDK.Enums.MediaType.Cover)) { }
}
@code { [Parameter] public Guid Id { get; set; } [CascadingParameter] public bool Connected { get; set; } [CascadingParameter] public bool OfflineMode { get; set; } Models.ListItem SelectedItem { get; set; } Data.Models.Game SelectedGame { get; set; } SDK.Models.Game RemoteGame { get; set; } Settings Settings = SettingService.GetSettings(); protected override async Task OnInitializedAsync() { InstallService.OnQueueChanged += OnQueueChanged; InstallService.OnInstallFail += OnInstallFail; InstallService.OnInstallComplete += OnInstallComplete; GameService.OnUninstall += OnUninstall; GameService.OnUninstallComplete += OnUninstallComplete; await LoadData(); } protected override async Task OnParametersSetAsync() { if (Id != Guid.Empty) { await OnLibraryItemSelected(await LibraryService.GetItemAsync(Id)); if (SelectedGame != null && (Connected && !OfflineMode)) RemoteGame = await Client.Games.GetAsync(SelectedGame.Id); } await InvokeAsync(StateHasChanged); } async Task LoadData() { await LibraryService.RefreshItemsAsync(); await InvokeAsync(StateHasChanged); } async Task SelectLibraryItem(Guid id) { NavigationManager.NavigateTo($"/{id}"); } async Task OnLibraryItemSelected(Models.ListItem item) { if (item != null && item.DataItem is Data.Models.Game) { SelectedItem = item; SelectedGame = item.DataItem as Data.Models.Game; await InvokeAsync(StateHasChanged); } } async Task Install(Models.ListItem item) { var game = item.DataItem as Game; var addons = await Client.Games.GetAddonsAsync(game.Id); if (Settings.Games.InstallDirectories.Length > 1 || (addons != null && addons.Any())) { var modalOptions = new ModalOptions() { Title = LocalizationService.GetString("InstallGame", item.Name), Maximizable = false, DefaultMaximized = false, Closable = true, OkText = LocalizationService.GetString("Install"), Draggable = true, Centered = true, WrapClassName = "ant-modal-wrap-no-padding", Footer = null, }; var modalRef = ModalService.CreateModal(modalOptions, item); } else { await InstallService.Add(game); } } async Task Update(Models.ListItem item) { var game = item.DataItem as Game; await InstallService.Add(game); } async Task OnQueueChanged() { var queueItem = InstallService.Queue.FirstOrDefault(i => SelectedItem != null && i.Id == SelectedItem.Key); if (queueItem != null) { SelectedItem = await LibraryService.GetItemAsync(SelectedItem); switch (queueItem.Status) { case SDK.Enums.InstallStatus.Downloading: case SDK.Enums.InstallStatus.InstallingRedistributables: case SDK.Enums.InstallStatus.InstallingMods: case SDK.Enums.InstallStatus.InstallingExpansions: case SDK.Enums.InstallStatus.RunningScripts: case SDK.Enums.InstallStatus.DownloadingSaves: SelectedItem.State = ListItemState.Installing; break; case SDK.Enums.InstallStatus.Queued: SelectedItem.State = ListItemState.Queued; break; case SDK.Enums.InstallStatus.Failed: case SDK.Enums.InstallStatus.Canceled: SelectedItem.State = ListItemState.NotInstalled; break; case SDK.Enums.InstallStatus.Complete: SelectedItem.State = ListItemState.Installed; break; } await OnLibraryItemSelected(SelectedItem); await InvokeAsync(StateHasChanged); } } async Task OnInstallComplete(Data.Models.Game game) { await LoadData(); if (SelectedItem.DataItem is Game selectedGame) { if (selectedGame.Id == game.Id) await OnLibraryItemSelected(LibraryService.Items.FirstOrDefault(i => i.Key == selectedGame.Id)); } } async Task OnInstallFail(Data.Models.Game game) { var result = await ConfirmService.Show( LocalizationService.GetString("InstallationFailedMessage", game.Title), LocalizationService.GetString("InstallationFailed"), ConfirmButtons.RetryCancel, ConfirmIcon.Error ); await LibraryService.LibraryChanged(); if (result == ConfirmResult.Retry) { var libraryItem = LibraryService.GetItem(game.Id); Install(libraryItem); } } async Task OnUninstall(Data.Models.Game game) { if (SelectedItem.Key == game.Id) { SelectedItem.State = ListItemState.Uninstalling; await Task.Yield(); await InvokeAsync(StateHasChanged); } } async Task OnUninstallComplete(Data.Models.Game game) { await LoadData(); if (SelectedItem.Key == game.Id) { SelectedItem.State = ListItemState.NotInstalled; await OnLibraryItemSelected(LibraryService.Items.FirstOrDefault(i => i.Key == SelectedGame.Id)); } } long GetDownloadSize() { long size = 0; if (RemoteGame != null && RemoteGame.Archives.Any()) size = RemoteGame.Archives.OrderByDescending(a => a.CreatedOn).First().CompressedSize; return size; } string GetPlayTime(Data.Models.Game game) { var totalTime = new TimeSpan(game.PlaySessions .Where(ps => ps.End != null && ps.Start != null) .Select(ps => ps.End.Value.Subtract(ps.Start.Value)) .Sum(ts => ts.Ticks)); if (totalTime.TotalMinutes < 1) return LocalizationService.GetString("None"); else if (totalTime.TotalHours < 1) return LocalizationService.GetString("PlayTimeMinutes", totalTime.TotalMinutes.ToString("0")); else return LocalizationService.GetString("PlayTimeHours", totalTime.TotalHours.ToString("0.##")); } string GetLastPlayed(Data.Models.Game game) { var lastSession = game.PlaySessions.Where(ps => ps.End != null && ps.Start != null).OrderByDescending(ps => ps.End).FirstOrDefault(); if (lastSession == null) return LocalizationService.GetString("Never"); else return lastSession.End.Value.ToRelativeDate(); } public void Dispose() { InstallService.OnQueueChanged -= OnQueueChanged; InstallService.OnInstallFail -= OnInstallFail; InstallService.OnInstallComplete -= OnInstallComplete; GameService.OnUninstall -= OnUninstall; GameService.OnUninstallComplete -= OnUninstallComplete; } }