1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00
Artemis/src/Artemis.UI/Screens/Workshop/Library/SubmissionManagementViewModel.cs

98 lines
3.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Disposables;
using System.Threading;
using System.Threading.Tasks;
using Artemis.UI.Screens.Workshop.Parameters;
using Artemis.UI.Screens.Workshop.SubmissionWizard;
using Artemis.UI.Shared.Routing;
using Artemis.UI.Shared.Services;
using Artemis.WebClient.Workshop;
using Artemis.WebClient.Workshop.Services;
using PropertyChanged.SourceGenerator;
using ReactiveUI;
using StrawberryShake;
namespace Artemis.UI.Screens.Workshop.Library;
public partial class SubmissionManagementViewModel : RoutableHostScreen<RoutableScreen, WorkshopDetailParameters>
{
private readonly IWorkshopClient _client;
private readonly IWindowService _windowService;
private readonly IRouter _router;
private readonly IWorkshopService _workshopService;
private readonly SubmissionDetailsViewModel _detailsViewModel;
[Notify] private IGetSubmittedEntryById_Entry? _entry;
[Notify] private List<IGetSubmittedEntryById_Entry_Releases>? _releases;
[Notify] private IGetSubmittedEntryById_Entry_Releases? _selectedRelease;
public SubmissionManagementViewModel(IWorkshopClient client, IRouter router, IWindowService windowService, IWorkshopService workshopService, SubmissionDetailsViewModel detailsViewModel)
{
_detailsViewModel = detailsViewModel;
_client = client;
_router = router;
_windowService = windowService;
_workshopService = workshopService;
this.WhenActivated(d =>
{
this.WhenAnyValue(vm => vm.SelectedRelease)
.WhereNotNull()
.Subscribe(r => _router.Navigate($"workshop/library/submissions/{Entry?.Id}/releases/{r.Id}"))
.DisposeWith(d);
});
}
public override RoutableScreen DefaultScreen => _detailsViewModel;
public async Task ViewWorkshopPage()
{
if (Entry != null)
await _workshopService.NavigateToEntry(Entry.Id, Entry.EntryType);
}
public async Task CreateRelease()
{
if (Entry != null)
await _windowService.ShowDialogAsync<ReleaseWizardViewModel>(Entry);
}
public async Task DeleteSubmission()
{
if (Entry == null)
return;
bool confirmed = await _windowService.ShowConfirmContentDialog(
"Delete submission?",
"You cannot undo this by yourself.\r\n" +
"Users that have already downloaded your submission will keep it.");
if (!confirmed)
return;
IOperationResult<IRemoveEntryResult> result = await _client.RemoveEntry.ExecuteAsync(Entry.Id);
result.EnsureNoErrors();
await _router.Navigate("workshop/library/submissions");
}
public override async Task OnNavigating(WorkshopDetailParameters parameters, NavigationArguments args, CancellationToken cancellationToken)
{
// If there is a 2nd parameter, it's a release ID
SelectedRelease = args.RouteParameters.Length > 1 ? Releases?.FirstOrDefault(r => r.Id == (long) args.RouteParameters[1]) : null;
IOperationResult<IGetSubmittedEntryByIdResult> result = await _client.GetSubmittedEntryById.ExecuteAsync(parameters.EntryId, cancellationToken);
if (result.IsErrorResult())
return;
Entry = result.Data?.Entry;
Releases = Entry?.Releases.OrderByDescending(r => r.CreatedAt).ToList();
await _detailsViewModel.SetEntry(Entry, cancellationToken);
}
public override async Task OnClosing(NavigationArguments args)
{
await _detailsViewModel.OnClosing(args);
}
}