LANCommander/LANCommander.Server/UI/Components/MediaGrabberDialog.razor
2025-02-12 21:38:18 -06:00

95 lines
2.8 KiB
Text

@inherits FeedbackComponent<MediaGrabberOptions, MediaGrabberResult>
@using LANCommander.SDK.Enums
@inject IMediaGrabberService MediaGrabberService
@inject IMessageService MessageService
@inject ILogger<MediaGrabberDialog> Logger
<GridRow Justify="RowJustify.SpaceBetween">
<GridCol Span="6">
<Search @bind-Value="Search" OnSearch="(x) => GetResults(Type, x)" DefaultValue="@Search" />
</GridCol>
<GridCol Span="12"></GridCol>
<GridCol Span="6">
<Slider TValue="double" @bind-Value="Size" DefaultValue="200" Min="50" Max="400" />
</GridCol>
</GridRow>
<Spin Spinning="Loading">
@foreach (var group in Results)
{
<div class="media-grabber-group">
<h2>@group.First().Group</h2>
<ImagePicker Size="Size" Images="@group.DistinctBy(g => g.Id).ToDictionary(r => r.Id, r => r.ThumbnailUrl)" ValueChanged="OnImageSelected" OnPicked="OnImagePicked" />
</div>
}
@if (Results.Count() == 0 && !Loading)
{
<Empty Description="@($"No results for \"{Search}\"")" />
}
</Spin>
@code {
[Parameter] public string Search { get; set; }
[Parameter] public MediaType Type { get; set; }
MediaGrabberResult Media { get; set; }
double Size { get; set; } = 200;
bool Loading { get; set; } = true;
IEnumerable<IEnumerable<MediaGrabberResult>> Results = new List<List<MediaGrabberResult>>();
Dictionary<string, string> Images { get; set; } = new Dictionary<string, string>();
protected override async Task OnFirstAfterRenderAsync()
{
Type = Options.Type;
Search = Options.Search;
await GetResults(Type, Search);
}
private async Task GetResults(MediaType type, string search)
{
try
{
Loading = true;
if (!String.IsNullOrWhiteSpace(search))
{
Results = (await MediaGrabberService.SearchAsync(type, search)).GroupBy(r => r.Group);
Loading = false;
await InvokeAsync(StateHasChanged);
}
}
catch (Exception ex)
{
MessageService.Error("An unknown error occurred when trying to get media results");
Logger.LogError(ex, "An unknown error occurred when trying to get media results");
Loading = false;
}
}
private void OnImageSelected(string key)
{
Media = Results.SelectMany(g => g).FirstOrDefault(r => r.Id == key);
}
private async Task OnImagePicked(string key)
{
OnImageSelected(key);
await base.OkCancelRefWithResult!.OnOk(Media);
await CloseFeedbackAsync();
}
public override async Task OnFeedbackOkAsync(ModalClosingEventArgs args)
{
await base.OkCancelRefWithResult!.OnOk(Media);
await CloseFeedbackAsync();
}
}