From 12eaa5814ef20b0910e8d64a753378b6f6797989 Mon Sep 17 00:00:00 2001 From: Jake Mannens Date: Fri, 22 May 2026 00:52:16 +1000 Subject: Initial commit --- Server.Client/Pages/Gallery.razor | 151 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 Server.Client/Pages/Gallery.razor (limited to 'Server.Client/Pages/Gallery.razor') diff --git a/Server.Client/Pages/Gallery.razor b/Server.Client/Pages/Gallery.razor new file mode 100644 index 0000000..b3391d1 --- /dev/null +++ b/Server.Client/Pages/Gallery.razor @@ -0,0 +1,151 @@ +@page "/" +@page "/Gallery" +@inject IJSRuntime jsRuntime +@inject HBSession hb +@* @implements IDisposable +@attribute [Authorize]*@ + +@Title + +@if(Ingest && !hb.HasNsfwClaim) { +
+

Ingest feed is not available unless NSFW mode is enabled!

+

You must enable NSFW mode to continue...

+
+} else if(TagId is not null && Query is not null) { +
+

Invalid query parameters! Both a search query and

+

a tag ID have been specified!

+
+} else { +
+ @foreach(var mediaId in displayMedia) { + // Precalculate thumbnail size to help the browser + // lay out the images during initial page load + @* int width = (int) media.CurrentUploadedFile!.Width! * 200 / (int) media.CurrentUploadedFile.Height!; *@ + + + + } +
+
+} + + + +@code { + [Parameter] + [SupplyParameterFromQuery(Name = "t")] + public Guid? TagId { get; set; } + + [Parameter] + [SupplyParameterFromQuery(Name = "q")] + public string? Query { get; set; } + + [Parameter] + [SupplyParameterFromQuery(Name = "s")] + public string? SortOrder { get; set; } + + [Parameter] + [SupplyParameterFromQuery] + public bool Ingest { get; set; } = false; + + public const int PageSize = 50; + + private string Title { + get { + if(Query is null) + return Ingest ? "Ingest Feed" : "Gallery"; + else + return "Search Results"; + } + } + + private List displayMedia = new(); + + // protected override void OnInitialized() => + // userService.UserSessionState.OnStateChange += ShowNsfwChanged; + + protected override void OnInitialized() => + Console.WriteLine("PENUS"); + + protected override void OnParametersSet() => LoadMedia(true); + + protected override void OnAfterRender(bool firstRender) { + if(firstRender) + jsRuntime.InvokeVoidAsync( + "registerScrollObserver", + DotNetObjectReference.Create(this)); + } + + [JSInvokable("LoadMedia")] + public void LoadMedia(bool initial = false) { + Guid? key = + displayMedia?.Any() ?? false && !initial ? displayMedia.Last() : null; + + if(initial) + displayMedia = new(); + + ApiModels.SortOrder? sortOrder = null; + if(Enum.TryParse(SortOrder, true, out var so)) + sortOrder = so; + + FeedRequest feedRequest = new FeedRequest() { + SelectIngest = Ingest, + IncludeNsfw = hb.HasNsfwClaim, + ContinuationToken = key, + Count = PageSize, + SortOrder = sortOrder ?? default + }; + + if(TagId is not null && Query is null) { + feedRequest = new FeedTagRequest() { + SelectIngest = Ingest, + IncludeNsfw = hb.HasNsfwClaim, + TagId = (Guid) TagId!, + ContinuationToken = key, + Count = PageSize, + SortOrder = sortOrder ?? default + }; + } else if(Query is not null && TagId is null) { + feedRequest = new FeedSearchRequest() { + SelectIngest = Ingest, + IncludeNsfw = hb.HasNsfwClaim, + Query = string.IsNullOrWhiteSpace(Query) ? null : Query, + ContinuationToken = key, + Count = PageSize, + SortOrder = sortOrder ?? default + }; + } + + hb.Feed + .LoadChunkAsync(feedRequest) + .ContinueWith(async m => { + displayMedia!.AddRange(await m); + await InvokeAsync(() => StateHasChanged()); + }); + } + + // private async void ShowNsfwChanged(UserSessionState userSessionState) { + // await InvokeAsync(() => { + // LoadMedia(true); + // }); + // } + + // public void Dispose() => + // userService.UserSessionState.OnStateChange -= ShowNsfwChanged; +} -- cgit v1.3