using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Threading; using System.Threading.Tasks; using Artemis.UI.Screens.Workshop.Entries.Details; using Artemis.UI.Screens.Workshop.Entries.List; using Artemis.UI.Screens.Workshop.Parameters; using Artemis.UI.Shared.Routing; using Artemis.WebClient.Workshop; using PropertyChanged.SourceGenerator; using StrawberryShake; namespace Artemis.UI.Screens.Workshop.Profile; public partial class ProfileDetailsViewModel : RoutableScreen { private readonly IWorkshopClient _client; private readonly Func _getEntryInfoViewModel; private readonly Func _getEntryReleasesViewModel; private readonly Func _getEntryImagesViewModel; private readonly Func _getEntryListViewModel; [Notify] private IEntryDetails? _entry; [Notify] private EntryInfoViewModel? _entryInfoViewModel; [Notify] private EntryReleasesViewModel? _entryReleasesViewModel; [Notify] private EntryImagesViewModel? _entryImagesViewModel; [Notify] private ReadOnlyObservableCollection? _dependencies; public ProfileDetailsViewModel(IWorkshopClient client, Func getEntryInfoViewModel, Func getEntryReleasesViewModel, Func getEntryImagesViewModel, Func getEntryListViewModel) { _client = client; _getEntryInfoViewModel = getEntryInfoViewModel; _getEntryReleasesViewModel = getEntryReleasesViewModel; _getEntryImagesViewModel = getEntryImagesViewModel; _getEntryListViewModel = getEntryListViewModel; } public override async Task OnNavigating(WorkshopDetailParameters parameters, NavigationArguments args, CancellationToken cancellationToken) { await GetEntry(parameters.EntryId, cancellationToken); } private async Task GetEntry(long entryId, CancellationToken cancellationToken) { IOperationResult result = await _client.GetEntryById.ExecuteAsync(entryId, cancellationToken); if (result.IsErrorResult()) return; Entry = result.Data?.Entry; EntryInfoViewModel = Entry != null ? _getEntryInfoViewModel(Entry) : null; EntryReleasesViewModel = Entry != null ? _getEntryReleasesViewModel(Entry) : null; EntryImagesViewModel = Entry != null ? _getEntryImagesViewModel(Entry) : null; IReadOnlyList? dependencies = (await _client.GetLatestDependencies.ExecuteAsync(entryId, cancellationToken)).Data?.Entry?.LatestRelease?.Dependencies; Dependencies = dependencies != null && dependencies.Any() ? new ReadOnlyObservableCollection(new ObservableCollection(dependencies.Select(_getEntryListViewModel))) : null; } }