@page "/media/tv/shows" @using ErsatzTV.Application.MediaCards @using ErsatzTV.Application.MediaCards.Queries @using ErsatzTV.Application.MediaCollections @using ErsatzTV.Application.MediaCollections.Commands @using Unit = LanguageExt.Unit @inject ILogger Logger @inject ISnackbar Snackbar @inject IMediator Mediator @inject IDialogService Dialog @inject ChannelWriter Channel @Math.Min((_pageNumber - 1) * _pageSize + 1, _data.Count)-@Math.Min(_data.Count, _pageNumber * _pageSize) of @_data.Count @foreach (TelevisionShowCardViewModel card in _data.Cards.OrderBy(s => s.SortTitle)) { } @code { private int _pageSize => 100; private int _pageNumber = 1; private TelevisionShowCardResultsViewModel _data; protected override Task OnParametersSetAsync() => RefreshData(); private async Task RefreshData() => _data = await Mediator.Send(new GetTelevisionShowCards(_pageNumber, _pageSize)); private async Task PrevPage() { _pageNumber -= 1; await RefreshData(); } private async Task NextPage() { _pageNumber += 1; await RefreshData(); } private async Task AddToCollection(MediaCardViewModel card) { if (card is TelevisionShowCardViewModel show) { var parameters = new DialogParameters { { "EntityType", "show" }, { "EntityName", show.Title } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = Dialog.Show("Add To Collection", parameters, options); DialogResult result = await dialog.Result; if (!result.Cancelled && result.Data is MediaCollectionViewModel collection) { var request = new AddShowToCollection(collection.Id, show.TelevisionShowId); Either addResult = await Mediator.Send(request); addResult.Match( Left: error => { Snackbar.Add($"Unexpected error adding show to collection: {error.Value}"); Logger.LogError("Unexpected error adding show to collection: {Error}", error.Value); }, Right: _ => Snackbar.Add($"Added {show.Title} to collection {collection.Name}", Severity.Success)); } } } }