@using ErsatzTV.Application.MediaCollections @using Microsoft.Extensions.Caching.Memory @implements IDisposable @inject IMediator Mediator @inject IMemoryCache MemoryCache @foreach (PlaylistGroupViewModel playlistGroup in _playlistGroups) { @playlistGroup.Name } @foreach (PlaylistViewModel playlist in _playlists) { @playlist.Name } Cancel Add To Playlist @code { private CancellationTokenSource _cts; [CascadingParameter] IMudDialogInstance 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 List _playlistGroups = []; private readonly List _playlists = []; private PlaylistGroupViewModel _selectedPlaylistGroup; private PlaylistViewModel _selectedPlaylist; private record DummyModel; private readonly DummyModel _dummyModel = new(); public void Dispose() { _cts?.Cancel(); _cts?.Dispose(); } private bool CanSubmit() => _selectedPlaylist != null; protected override async Task OnParametersSetAsync() { _cts?.Cancel(); _cts?.Dispose(); _cts = new CancellationTokenSource(); var token = _cts.Token; try { _playlistGroups.AddRange(await Mediator.Send(new GetAllPlaylistGroups(), token)); if (MemoryCache.TryGetValue("AddToPlaylistDialog.SelectedPlaylistGroupId", out int groupId)) { _selectedPlaylistGroup = _playlistGroups.SingleOrDefault(pg => pg.Id == groupId); if (_selectedPlaylistGroup is not null) { await UpdatePlaylistGroupItems(_selectedPlaylistGroup); if (MemoryCache.TryGetValue("AddToPlaylistDialog.SelectedPlaylistId", out int id)) { _selectedPlaylist = _playlists.SingleOrDefault(c => c.Id == id); } } } } catch (OperationCanceledException) { // do nothing } } private string FormatText() => $"Select the playlist to add the {EntityType} {EntityName}"; private async Task UpdatePlaylistGroupItems(PlaylistGroupViewModel playlistGroup) { _selectedPlaylistGroup = playlistGroup; _playlists.Clear(); _playlists.AddRange(await Mediator.Send(new GetPlaylistsByPlaylistGroupId(playlistGroup.Id), _cts.Token)); } private async Task Submit() { if (!CanSubmit()) { return; } await Task.CompletedTask; MemoryCache.Set("AddToPlaylistDialog.SelectedPlaylistGroupId", _selectedPlaylistGroup.Id); MemoryCache.Set("AddToPlaylistDialog.SelectedPlaylistId", _selectedPlaylist.Id); MudDialog.Close(DialogResult.Ok(_selectedPlaylist)); } 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(); } } }