@using ErsatzTV.Application.MediaSources @implements IDisposable @inject IMediator Mediator @inject NavigationManager NavigationManager @inject ILogger Logger @inject ISnackbar Snackbar @inject IEntityLocker Locker Save Changes
@_source?.Name Libraries Name Media Kind Synchronize @context.Name @context.MediaKind
@code { private CancellationTokenSource _cts; [Parameter] public int Id { get; set; } [Parameter] public string Name { get; set; } [Parameter] public Func>> GetMediaSourceById { get; set; } [Parameter] public Func>> GetLibrariesBySourceId { get; set; } [Parameter] public Func, IRequest>> GetUpdateLibraryRequest { get; set; } [Parameter] public Func> SynchronizeLibraryByIdIfNeeded { get; set; } private RemoteMediaSourceViewModel _source; private List _libraries; public record SynchronizeParameters(int LibraryId, int MediaSourceId); public void Dispose() { _cts?.Cancel(); _cts?.Dispose(); } protected override Task OnParametersSetAsync() => LoadData(); private async Task LoadData() { _cts?.Cancel(); _cts?.Dispose(); _cts = new CancellationTokenSource(); var token = _cts.Token; try { Option maybeSource = await GetMediaSourceById(Id, token); foreach (var source in maybeSource) { _source = source; _libraries = await GetLibrariesBySourceId(Id, token); } if (maybeSource.IsNone) { NavigationManager.NavigateTo("404"); } } catch (OperationCanceledException) { // do nothing } } private async Task SaveChanges() { using var cts = new CancellationTokenSource(); IRequest> request = GetUpdateLibraryRequest(_libraries); Either result = await Mediator.Send(request, cts.Token); foreach (var error in result.LeftToSeq()) { Snackbar.Add($"Unexpected error saving {Name.ToLowerInvariant()} libraries: {error.Value}", Severity.Error); Logger.LogError("Unexpected error saving {MediaSource} libraries: {Error}", Name, error.Value); } if (result.IsRight) { foreach (int libraryId in _libraries.Filter(l => l.ShouldSyncItems).Map(l => l.Id)) { if (Locker.LockLibrary(libraryId)) { await SynchronizeLibraryByIdIfNeeded(new SynchronizeParameters(libraryId, Id), cts.Token); } } NavigationManager.NavigateTo($"media/sources/{Name.ToLowerInvariant()}"); } } }