@page "/media/sources/local" @using ErsatzTV.Application.Libraries @implements IDisposable @inject IDialogService Dialog @inject IMediator Mediator @inject IEntityLocker Locker Add Local Library
Local Libraries Name Media Kind @context.Name @StringForMediaKind(context.MediaKind)
@code { private readonly CancellationTokenSource _cts = new(); private IList _libraries; protected override void OnInitialized() => Locker.OnLibraryChanged += LockChanged; protected override async Task OnParametersSetAsync() => await LoadLibraries(_cts.Token); private async Task LoadLibraries(CancellationToken cancellationToken) => _libraries = await Mediator.Send(new GetAllLocalLibraries(), cancellationToken); private void LockChanged(object sender, EventArgs e) => InvokeAsync(StateHasChanged); private async Task DeleteLibrary(LocalLibraryViewModel library) { int count = await Mediator.Send(new CountMediaItemsByLibrary(library.Id), _cts.Token); var parameters = new DialogParameters { { "EntityType", "library" }, { "EntityName", library.Name }, { "DetailText", $"This library contains {count} media items." }, { "DetailHighlight", count.ToString() } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = await Dialog.ShowAsync("Delete Library", parameters, options); DialogResult result = await dialog.Result; if (result is { Canceled: false }) { await Mediator.Send(new DeleteLocalLibrary(library.Id), _cts.Token); await LoadLibraries(_cts.Token); } } private static string StringForMediaKind(LibraryMediaKind mediaKind) => mediaKind switch { LibraryMediaKind.Movies => "Movies", LibraryMediaKind.Shows => "Shows", LibraryMediaKind.MusicVideos => "Music Videos", LibraryMediaKind.OtherVideos => "Other Videos", LibraryMediaKind.Songs => "Songs", LibraryMediaKind.Images => "Images", LibraryMediaKind.RemoteStreams => "Remote Streams", _ => "Unknown" }; void IDisposable.Dispose() { Locker.OnLibraryChanged -= LockChanged; _cts.Cancel(); _cts.Dispose(); } }