From 6c06dfc4f83f30292e65c08a3cb0c48401d4bfa7 Mon Sep 17 00:00:00 2001 From: Jake Mannens Date: Wed, 25 Mar 2026 01:57:19 +1100 Subject: v0.2a --- Pages/Component/MediaTagTable.razor | 2 +- Pages/Gallery.razor | 133 +++++++++++++++--------------------- Pages/Gallery.razor.css | 2 +- Pages/TagDefinitions.razor | 2 +- 4 files changed, 59 insertions(+), 80 deletions(-) (limited to 'Pages') diff --git a/Pages/Component/MediaTagTable.razor b/Pages/Component/MediaTagTable.razor index e367f7f..e687529 100644 --- a/Pages/Component/MediaTagTable.razor +++ b/Pages/Component/MediaTagTable.razor @@ -19,7 +19,7 @@ } - + @if(e.isImplicit) { @e.tagDef.Name } else { diff --git a/Pages/Gallery.razor b/Pages/Gallery.razor index 762ef7f..c037979 100644 --- a/Pages/Gallery.razor +++ b/Pages/Gallery.razor @@ -1,8 +1,7 @@ @page "/" @page "/Gallery" -@inject IDbContextFactory dbFactory @inject ITagService tagService -@inject ISearchService searchService +@inject IFeedService feedService @inject IUserService userService @inject IJSRuntime jsRuntime @implements IDisposable @@ -11,31 +10,36 @@ @Title @if(Ingest && !userService.UserSessionState.ShowNsfw) { -
+

Ingest feed is not available unless NSFW mode is enabled!

You must enable NSFW mode to continue...

-} - -
- @foreach(var media 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!; - - - - } -
+} 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 media 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; } @@ -64,13 +72,11 @@ } private List displayMedia; - private Media[] queryResult; - private IEnumerator mediaEnumerator; protected override void OnInitialized() => userService.UserSessionState.OnStateChange += ShowNsfwChanged; - protected override void OnParametersSet() => LoadMedia(); + protected override void OnParametersSet() => LoadMedia(true); protected override void OnAfterRender(bool firstRender) { if(firstRender) @@ -79,71 +85,44 @@ DotNetObjectReference.Create(this)); } - private void LoadMedia() { - using var db = dbFactory.CreateDbContext(); - - if(Query is not null) { - queryResult = searchService.Search(Query) - .OrderByDescending(m => m.ObjectId) - .ToArray(); + [JSInvokable("LoadMedia")] + public void LoadMedia(bool initial = false) { + Media? key = displayMedia?.Any() ?? false && !initial ? displayMedia.Last() : null; + + if(initial) + displayMedia = new(); + + if(TagId is not null && Query is null) { + displayMedia!.AddRange(feedService.LoadChunk( + selectIngest: Ingest, + includeNsfw: userService.UserSessionState.ShowNsfw, + tagId: (Guid) TagId!, + key: key, + count: PageSize)); + } else if(Query is not null && TagId is null) { + displayMedia!.AddRange(feedService.LoadChunk( + selectIngest: Ingest, + includeNsfw: userService.UserSessionState.ShowNsfw, + query: string.IsNullOrWhiteSpace(Query) ? null : Query, + key: key, + count: PageSize)); } else { - queryResult = db.Media - .Include(m => m.Tags) - .Include(m => m.CurrentUploadedFile) - .OrderByDescending(m => m.ObjectId) - .ToArray(); + displayMedia!.AddRange(feedService.LoadChunk( + selectIngest: Ingest, + includeNsfw: userService.UserSessionState.ShowNsfw, + key: key, + count: PageSize)); } - mediaEnumerator = FilterMedia(queryResult).GetEnumerator(); - - displayMedia = new(); - - LoadMore(); - } - - [JSInvokable("LoadMore")] - public void LoadMore() { - for(int i = 0; i < PageSize; i++) { - if(!mediaEnumerator.MoveNext()) - break; - displayMedia.Add(mediaEnumerator.Current); - } - StateHasChanged(); - } - - private IEnumerable FilterMedia(IEnumerable media) { - var nsfwTags = tagService.TagsThatImply(HBContext.NsfwTag) - .Select(td => td.ObjectId) - .ToArray(); - - using var enumerator = media.GetEnumerator(); - - while(true) { - bool success = enumerator.MoveNext(); - if(!success) - break; - Media? m = enumerator.Current; - - if(!userService.UserSessionState.ShowNsfw) - if(m.Tags.Select(t => t.TagDefinitionId).Intersect(nsfwTags).Any() || m.IsIngest) - continue; - - if(m.IsIngest != Ingest) - continue; - - yield return m; - } + StateHasChanged(); } private async void ShowNsfwChanged(UserSessionState userSessionState) { await InvokeAsync(() => { - LoadMedia(); - StateHasChanged(); + LoadMedia(true); }); } - public void Dispose() { - mediaEnumerator.Dispose(); - userService.UserSessionState.OnStateChange -= ShowNsfwChanged; - } + public void Dispose() => + userService.UserSessionState.OnStateChange -= ShowNsfwChanged; } diff --git a/Pages/Gallery.razor.css b/Pages/Gallery.razor.css index 0e01e0e..989e252 100644 --- a/Pages/Gallery.razor.css +++ b/Pages/Gallery.razor.css @@ -3,7 +3,7 @@ max-height: 200px; } -div#ingest-warning { +div#feed-error { position: relative; top: 50%; left: 50%; diff --git a/Pages/TagDefinitions.razor b/Pages/TagDefinitions.razor index e2e4df6..f3dca0f 100644 --- a/Pages/TagDefinitions.razor +++ b/Pages/TagDefinitions.razor @@ -26,7 +26,7 @@ @tagDef.Alias - + @tagDef.Name -- cgit v1.3