wabbajack/Wabbajack.App.Blazor/Pages/Gallery.razor.cs

108 lines
3.5 KiB
C#
Raw Normal View History

2022-01-20 08:34:38 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
2022-01-21 13:41:37 +00:00
using System.Reactive.Linq;
2022-01-20 08:34:38 +00:00
using System.Threading.Tasks;
2022-01-21 04:57:59 +00:00
using System.Windows.Shell;
2022-01-20 08:34:38 +00:00
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Logging;
using Wabbajack.App.Blazor.State;
using Wabbajack.Common;
using Wabbajack.DTOs;
using Wabbajack.Paths.IO;
using Wabbajack.RateLimiter;
using Wabbajack.Services.OSIntegrated.Services;
namespace Wabbajack.App.Blazor.Pages;
public partial class Gallery
{
2022-01-21 13:41:37 +00:00
[Inject] private ILogger<Gallery> Logger { get; set; } = default!;
[Inject] private IStateContainer StateContainer { get; set; } = default!;
[Inject] private NavigationManager NavigationManager { get; set; } = default!;
[Inject] private ModListDownloadMaintainer Maintainer { get; set; } = default!;
2022-01-20 08:34:38 +00:00
2022-01-21 15:11:44 +00:00
private Percent DownloadProgress { get; set; } = Percent.Zero;
private ModlistMetadata? DownloadingMetaData { get; set; }
2022-01-20 08:34:38 +00:00
2022-01-21 13:41:37 +00:00
private IEnumerable<ModlistMetadata> Modlists => StateContainer.Modlists;
private bool _errorLoadingModlists;
private bool _shouldRender;
protected override bool ShouldRender() => _shouldRender;
2022-01-20 08:34:38 +00:00
protected override async Task OnInitializedAsync()
{
2022-01-21 13:41:37 +00:00
if (!StateContainer.Modlists.Any())
2022-01-20 08:34:38 +00:00
{
2022-01-21 13:41:37 +00:00
var res = await StateContainer.LoadModlistMetadata();
if (!res)
{
_errorLoadingModlists = true;
_shouldRender = true;
return;
}
2022-01-20 08:34:38 +00:00
}
2022-01-21 13:41:37 +00:00
_shouldRender = true;
2022-01-20 08:34:38 +00:00
}
2022-01-21 15:11:44 +00:00
private async Task OnClickDownload(ModlistMetadata metadata)
2022-01-20 08:34:38 +00:00
{
// GlobalState.NavigationAllowed = !GlobalState.NavigationAllowed;
await Download(metadata);
}
2022-01-21 15:11:44 +00:00
private async Task OnClickInformation(ModlistMetadata metadata)
2022-01-20 08:34:38 +00:00
{
// TODO: [High] Implement information modal.
}
private async Task Download(ModlistMetadata metadata)
{
2022-01-21 13:41:37 +00:00
StateContainer.NavigationAllowed = false;
2022-01-21 15:11:44 +00:00
DownloadingMetaData = metadata;
2022-01-21 13:41:37 +00:00
2022-01-21 15:11:44 +00:00
// TODO: download progress should be in ProgressBar component so it can refresh independently
2022-01-20 08:34:38 +00:00
try
{
2022-01-21 13:41:37 +00:00
var (progress, task) = Maintainer.DownloadModlist(metadata);
2022-01-21 04:57:59 +00:00
2022-01-21 13:41:37 +00:00
var dispose = progress
.DistinctUntilChanged(p => p.Value)
.Throttle(TimeSpan.FromMilliseconds(100))
.Subscribe(p =>
2022-01-21 04:57:59 +00:00
{
2022-01-21 15:11:44 +00:00
DownloadProgress = p;
2022-01-21 13:41:37 +00:00
StateContainer.TaskBarState = new TaskBarState
{
Description = $"Downloading {metadata.Title}",
State = TaskbarItemProgressState.Indeterminate,
ProgressValue = p.Value
};
2022-01-21 15:11:44 +00:00
InvokeAsync(StateHasChanged);
// Dispatcher.CreateDefault().InvokeAsync(StateHasChanged);
2022-01-21 13:41:37 +00:00
}, () => { StateContainer.TaskBarState = new TaskBarState(); });
2022-01-20 08:34:38 +00:00
await task;
dispose.Dispose();
2022-01-21 13:41:37 +00:00
var path = KnownFolders.EntryPoint.Combine("downloaded_mod_lists", metadata.Links.MachineURL).WithExtension(Ext.Wabbajack);
StateContainer.ModlistPath = path;
NavigationManager.NavigateTo(Configure.Route);
2022-01-20 08:34:38 +00:00
}
catch (Exception e)
{
2022-01-21 13:41:37 +00:00
Logger.LogError(e, "Exception downloading Modlist {Name}", metadata.Title);
}
finally
{
StateContainer.TaskBarState = new TaskBarState();
StateContainer.NavigationAllowed = true;
2022-01-20 08:34:38 +00:00
}
}
}