@page "/media/browser/images" @using System.Net @using ErsatzTV.Application.Images @implements IDisposable @inject IDialogService Dialog @inject IMediator Mediator
Images
@item.Value.Text
@item.Value.EndText @{ string query = GetSearchQuery(item.Value); if (!string.IsNullOrWhiteSpace(query)) { } }
@code { private CancellationTokenSource _cts; private List> TreeItems { get; set; } = []; public void Dispose() { _cts?.Cancel(); _cts?.Dispose(); } protected override async Task OnParametersSetAsync() { _cts?.Cancel(); _cts?.Dispose(); _cts = new CancellationTokenSource(); var token = _cts.Token; try { List imageFolders = await Mediator.Send(new GetImageFolders(Option.None), token); TreeItems = imageFolders.Map(g => new TreeItemData { Value = new ImageTreeItemViewModel(g) }).ToList(); } catch (OperationCanceledException) { // do nothing } } private async Task>> LoadServerData(ImageTreeItemViewModel parentNode) { List result = await Mediator.Send(new GetImageFolders(parentNode.LibraryFolderId), _cts.Token); foreach (ImageFolderViewModel imageFolder in result) { parentNode.TreeItems.Add(new TreeItemData { Value = new ImageTreeItemViewModel(imageFolder) }); } return parentNode.TreeItems; } private static string GetSearchQuery(ImageTreeItemViewModel item) { var query = $"library_folder_id:{item.LibraryFolderId}"; return WebUtility.UrlEncode(query); } private async Task EditImageFolderDuration(ImageTreeItemViewModel item) { var parameters = new DialogParameters { { "ImageFolderDuration", item.ImageFolderDuration } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraLarge }; IDialogReference dialog = await Dialog.ShowAsync("Edit Image Folder Duration", parameters, options); DialogResult result = await dialog.Result; if (result is { Canceled: false }) { double? duration = await Mediator.Send(new UpdateImageFolderDuration(item.LibraryFolderId, result.Data as double?), _cts.Token); item.UpdateDuration(duration); await InvokeAsync(StateHasChanged); } } }