@page "/media/tv/seasons/{SeasonId:int}" @using ErsatzTV.Extensions @using ErsatzTV.Application.Television @using ErsatzTV.Application.Television.Queries @using ErsatzTV.Application.MediaCards @using ErsatzTV.Application.MediaCards.Queries @using ErsatzTV.Application.MediaCollections @using ErsatzTV.Application.MediaCollections.Commands @using ErsatzTV.Application.ProgramSchedules @using ErsatzTV.Application.ProgramSchedules.Commands @using Unit = LanguageExt.Unit @inject IMediator Mediator @inject ILogger Logger @inject ISnackbar Snackbar @inject IDialogService Dialog @inject NavigationManager NavigationManager @inject ChannelWriter Channel @inject IJSRuntime JsRuntime
@if (!string.IsNullOrWhiteSpace(_season.FanArt)) { fan art }
@if (!string.IsNullOrWhiteSpace(_season.Poster)) { show poster }
@_season.Title @_season.Name
Add To Collection Add To Schedule
@foreach (TelevisionEpisodeCardViewModel episode in _data.Cards) {
@if (!string.IsNullOrWhiteSpace(episode.Poster)) { }
@episode.Episode. @episode.Title @episode.Plot
Add To Collection
}
@code { [Parameter] public int SeasonId { get; set; } private TelevisionSeasonViewModel _season; private int _pageSize => 100; private readonly int _pageNumber = 1; private TelevisionEpisodeCardResultsViewModel _data; protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { await NavigationManager.NavigateToFragmentAsync(JsRuntime); } } protected override Task OnParametersSetAsync() => RefreshData(); private async Task RefreshData() { await Mediator.Send(new GetTelevisionSeasonById(SeasonId)) .IfSomeAsync(vm => _season = vm); _data = await Mediator.Send(new GetTelevisionEpisodeCards(SeasonId, _pageNumber, _pageSize)); } private async Task AddToCollection() { var parameters = new DialogParameters { { "EntityType", "season" }, { "EntityName", $"{_season.Title} - {_season.Name}" } }; 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) { await Mediator.Send(new AddSeasonToCollection(collection.Id, SeasonId)); NavigationManager.NavigateTo($"/media/collections/{collection.Id}"); } } private async Task AddToSchedule() { var parameters = new DialogParameters { { "EntityType", "season" }, { "EntityName", $"{_season.Title} - {_season.Name}" } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = Dialog.Show("Add To Schedule", parameters, options); DialogResult result = await dialog.Result; if (!result.Cancelled && result.Data is ProgramScheduleViewModel schedule) { await Mediator.Send(new AddProgramScheduleItem(schedule.Id, StartType.Dynamic, null, PlayoutMode.One, ProgramScheduleItemCollectionType.TelevisionSeason, null, SeasonId, null, null, null, null)); NavigationManager.NavigateTo($"/schedules/{schedule.Id}/items"); } } private async Task AddEpisodeToCollection(TelevisionEpisodeCardViewModel episode) { var parameters = new DialogParameters { { "EntityType", "episode" }, { "EntityName", episode.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 AddEpisodeToCollection(collection.Id, episode.EpisodeId); Either addResult = await Mediator.Send(request); addResult.Match( Left: error => { Snackbar.Add($"Unexpected error adding episode to collection: {error.Value}"); Logger.LogError("Unexpected error adding episode to collection: {Error}", error.Value); }, Right: _ => Snackbar.Add($"Added {episode.Title} to collection {collection.Name}", Severity.Success)); } } }