diff --git a/ErsatzTV/Shared/AddToCollectionDialog.razor b/ErsatzTV/Shared/AddToCollectionDialog.razor index bd780a395..cec43055f 100644 --- a/ErsatzTV/Shared/AddToCollectionDialog.razor +++ b/ErsatzTV/Shared/AddToCollectionDialog.razor @@ -1,8 +1,11 @@ @using Microsoft.Extensions.Caching.Memory @using ErsatzTV.Application.MediaCollections +@using ErsatzTV.Application.MediaCollections.Commands @using ErsatzTV.Application.MediaCollections.Queries @inject IMediator Mediator @inject IMemoryCache MemoryCache +@inject ISnackbar Snackbar +@inject ILogger Logger @@ -18,10 +21,16 @@ @collection.Name } + + Cancel - + Add To Collection @@ -44,25 +53,58 @@ [Parameter] public string DetailHighlight { get; set; } + private readonly MediaCollectionViewModel _newCollection = new(-1, "(New Collection)"); + private string _newCollectionName; + private List _collections; private MediaCollectionViewModel _selectedCollection; + private bool CanSubmit() => + _selectedCollection != null && (_selectedCollection != _newCollection || !string.IsNullOrWhiteSpace(_newCollectionName)); + protected override async Task OnParametersSetAsync() { - _collections = await Mediator.Send(new GetAllCollections()); + _collections = await Mediator.Send(new GetAllCollections()) + .Map(list => new[] { _newCollection }.Append(list).ToList()); + if (MemoryCache.TryGetValue("AddToCollectionDialog.SelectedCollectionId", out int id)) { _selectedCollection = _collections.SingleOrDefault(c => c.Id == id); } + else + { + _selectedCollection = _newCollection; + } } private string FormatText() => $"Select the collection to add the {EntityType} {EntityName}"; - private void Submit() + private async Task Submit() { - MemoryCache.Set("AddToCollectionDialog.SelectedCollectionId", _selectedCollection.Id); - MudDialog.Close(DialogResult.Ok(_selectedCollection)); + if (_selectedCollection == _newCollection) + { + Either maybeResult = + await Mediator.Send(new CreateCollection(_newCollectionName)); + + maybeResult.Match( + collection => + { + MemoryCache.Set("AddToCollectionDialog.SelectedCollectionId", collection.Id); + MudDialog.Close(DialogResult.Ok(collection)); + }, + error => + { + Snackbar.Add(error.Value, Severity.Error); + Logger.LogError("Error creating new collection: {Error}", error.Value); + MudDialog.Close(DialogResult.Cancel()); + }); + } + else + { + MemoryCache.Set("AddToCollectionDialog.SelectedCollectionId", _selectedCollection.Id); + MudDialog.Close(DialogResult.Ok(_selectedCollection)); + } } private void Cancel() => MudDialog.Cancel();