@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 @foreach (MediaCollectionViewModel collection in _collections) { @collection.Name } Cancel Add To Collection @code { [CascadingParameter] MudDialogInstance MudDialog { get; set; } [Parameter] public string EntityType { get; set; } [Parameter] public string EntityName { get; set; } [Parameter] public string DetailText { get; set; } [Parameter] public string DetailHighlight { get; set; } private readonly MediaCollectionViewModel _newCollection = new(-1, "(New Collection)"); private string _newCollectionName; private List _collections; private MediaCollectionViewModel _selectedCollection; private record DummyModel; private readonly DummyModel _dummyModel = new(); private bool CanSubmit() => _selectedCollection != null && (_selectedCollection != _newCollection || !string.IsNullOrWhiteSpace(_newCollectionName)); protected override async Task OnParametersSetAsync() { _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) ?? _newCollection; } else { _selectedCollection = _newCollection; } } private string FormatText() => $"Select the collection to add the {EntityType} {EntityName}"; private async Task Submit() { if (!CanSubmit()) { return; } 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 async Task Cancel(MouseEventArgs e) { // this is gross, but [enter] seems to sometimes trigger cancel instead of submit if (e.Detail == 0) { await Submit(); } else { MudDialog.Cancel(); } } }