@page "/media/trakt/lists" @using ErsatzTV.Application.Configuration @using ErsatzTV.Application.MediaCollections @implements IDisposable @inject IDialogService Dialog @inject IMediator Mediator @inject IEntityLocker Locker @inject ChannelWriter WorkerChannel Add Trakt List
Trakt Lists Id Name Match Status @context.Slug @context.Name @context.MatchCount of @context.ItemCount
@code { private CancellationTokenSource _cts; private MudTable _traktListsTable; private int _traktListsRowsPerPage = 10; public void Dispose() { _cts?.Cancel(); _cts?.Dispose(); } protected override void OnInitialized() => Locker.OnTraktChanged += LockChanged; protected override async Task OnParametersSetAsync() { _cts?.Cancel(); _cts?.Dispose(); _cts = new CancellationTokenSource(); var token = _cts.Token; try { _traktListsRowsPerPage = await Mediator.Send(new GetConfigElementByKey(ConfigElementKey.TraktListsPageSize), token) .Map(maybeRows => maybeRows.Match(ce => int.TryParse(ce.Value, out int rows) ? rows : 10, () => 10)); } catch (OperationCanceledException) { // do nothing } } private void LockChanged(object sender, EventArgs e) => InvokeAsync(async () => { StateHasChanged(); if (_traktListsTable != null && !Locker.IsTraktLocked()) { await _traktListsTable.ReloadServerData(); } }); private async Task MatchListItems(TraktListViewModel traktList) { if (Locker.LockTrakt()) { await WorkerChannel.WriteAsync(new MatchTraktListItems(traktList.Id), _cts.Token); } } private async Task DeleteTraktList(TraktListViewModel traktList) { if (Locker.LockTrakt()) { var parameters = new DialogParameters { { "EntityType", "Trakt List" }, { "EntityName", traktList.Name } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = await Dialog.ShowAsync("Delete Trakt List", parameters, options); DialogResult result = await dialog.Result; if (result is { Canceled: false }) { await WorkerChannel.WriteAsync(new DeleteTraktList(traktList.Id), _cts.Token); } else { Locker.UnlockTrakt(); } } } private async Task> ServerReloadTraktLists(TableState state, CancellationToken cancellationToken) { try { await Mediator.Send(new SaveConfigElementByKey(ConfigElementKey.TraktListsPageSize, state.PageSize.ToString()), cancellationToken); PagedTraktListsViewModel data = await Mediator.Send(new GetPagedTraktLists(state.Page, state.PageSize), cancellationToken); return new TableData { TotalItems = data.TotalCount, Items = data.Page }; } catch (Exception) { return new TableData { TotalItems = 0, Items = [] }; } } private async Task AddTraktList() { if (Locker.LockTrakt()) { var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small }; IDialogReference dialog = await Dialog.ShowAsync("Add Trakt List", options); DialogResult result = await dialog.Result; if (result is { Canceled: false, Data: string url }) { await WorkerChannel.WriteAsync(Application.MediaCollections.AddTraktList.FromUrl(url), _cts.Token); } else { Locker.UnlockTrakt(); } } } }