@page "/media/sources/local" @using ErsatzTV.Application.Libraries @implements IDisposable @inject IDialogService Dialog @inject IMediator Mediator @inject IEntityLocker Locker Local Libraries Name Media Kind @context.Name @context.MediaKind
Add Local Library
@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.Canceled) { await Mediator.Send(new DeleteLocalLibrary(library.Id), _cts.Token); await LoadLibraries(_cts.Token); } } void IDisposable.Dispose() { Locker.OnLibraryChanged -= LockChanged; _cts.Cancel(); _cts.Dispose(); } }