@page "/search" @using ErsatzTV.Application.MediaCards @using ErsatzTV.Application.MediaCards.Queries @using ErsatzTV.Application.MediaCollections @using ErsatzTV.Application.MediaCollections.Commands @using Microsoft.AspNetCore.WebUtilities @using Microsoft.Extensions.Primitives @using Unit = LanguageExt.Unit @inject NavigationManager NavigationManager @inject IMediator Mediator @inject ILogger Logger @inject ISnackbar Snackbar @inject IDialogService Dialog @inject ChannelWriter Channel
Search Results: "@_query"
@if (_data?.MovieCards.Any() == true) { Movies @foreach (MovieCardViewModel card in _data.MovieCards) { } } @if (_data?.ShowCards.Any() == true) { Television Shows @foreach (TelevisionShowCardViewModel card in _data.ShowCards) { } }
@code { private string _query; private SearchCardResultsViewModel _data; protected override async Task OnInitializedAsync() { string query = new Uri(NavigationManager.Uri).Query; if (QueryHelpers.ParseQuery(query).TryGetValue("query", out StringValues value)) { _query = value; Either maybeResults = await Mediator.Send(new GetSearchCards(_query)); maybeResults.IfRight(results => _data = results); } } private async Task AddToCollection(MediaCardViewModel card) { if (card is MovieCardViewModel movie) { var parameters = new DialogParameters { { "EntityType", "movie" }, { "EntityName", movie.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 AddMovieToCollection(collection.Id, movie.MovieId); Either addResult = await Mediator.Send(request); addResult.Match( Left: error => { Snackbar.Add($"Unexpected error adding movie to collection: {error.Value}"); Logger.LogError("Unexpected error adding movie to collection: {Error}", error.Value); }, Right: _ => Snackbar.Add($"Added {movie.Title} to collection {collection.Name}", Severity.Success)); } } 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)); } } } }