summaryrefslogtreecommitdiff
path: root/Pages
diff options
context:
space:
mode:
authorJake Mannens <jake@asger.xyz>2026-03-25 01:57:19 +1100
committerJake Mannens <jake@asger.xyz>2026-03-25 01:57:46 +1100
commit6c06dfc4f83f30292e65c08a3cb0c48401d4bfa7 (patch)
tree511f88873fa6173637115a38c31ec5f8018e108e /Pages
parentc751709b1b4fe6f16fd84647e8e071455e7b78d6 (diff)
v0.2av0.2a
Diffstat (limited to 'Pages')
-rw-r--r--Pages/Component/MediaTagTable.razor2
-rw-r--r--Pages/Gallery.razor131
-rw-r--r--Pages/Gallery.razor.css2
-rw-r--r--Pages/TagDefinitions.razor2
4 files changed, 58 insertions, 79 deletions
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 @@
}
</td>
<td>
- <a href="/Gallery?q=@(e.tagDef.Name)" class="nondecorated">
+ <a href="/Gallery?t=@(e.tagDef.Guid)" class="nondecorated">
@if(e.isImplicit) {
<i>@e.tagDef.Name</i>
} 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<HBContext> dbFactory
@inject ITagService tagService
-@inject ISearchService searchService
+@inject IFeedService feedService
@inject IUserService userService
@inject IJSRuntime jsRuntime
@implements IDisposable
@@ -11,31 +10,36 @@
<PageTitle>@Title</PageTitle>
@if(Ingest && !userService.UserSessionState.ShowNsfw) {
- <div id="ingest-warning">
+ <div id="feed-error">
<p><center>Ingest feed is not available unless NSFW mode is enabled!</center></p>
<p><center><i>You must enable NSFW mode to continue...</i></center></p>
</div>
-}
-
-<div style="padding:var(--size-default-gap);">
- @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!;
- <a href="/ViewMedia?m=@(media.Guid)">
- <img src="/media/thumb/@(media.Guid)?h=200" width=@width height="200"/>
- </a>
- }
-</div>
+} else if(TagId is not null && Query is not null) {
+ <div id="feed-error">
+ <p><center>Invalid query parameters! Both a search query and</center></p>
+ <p><center>a tag ID have been specified!</center></p>
+ </div>
+} else {
+ <div style="padding:var(--size-default-gap);">
+ @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!;
+ <a href="/ViewMedia?m=@(media.Guid)">
+ <img src="/media/thumb/@(media.Guid)?h=200" width=@width height="200"/>
+ </a>
+ }
+ </div>
-<div id="canary"/>
+ <div id="canary"/>
+}
<script suppress-error="BL9992">
function registerScrollObserver(dotNetObject) {
var scrollObserver = new IntersectionObserver(
async (e) => {
if(e[0].isIntersecting) {
- await dotNetObject.invokeMethodAsync('LoadMore');
+ await dotNetObject.invokeMethodAsync('LoadMedia', false);
}
},
{ threshold: [1] });
@@ -45,6 +49,10 @@
@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<Media> displayMedia;
- private Media[] queryResult;
- private IEnumerator<Media> 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();
+ [JSInvokable("LoadMedia")]
+ public void LoadMedia(bool initial = false) {
+ Media? key = displayMedia?.Any() ?? false && !initial ? displayMedia.Last() : null;
+
+ if(initial)
+ displayMedia = new();
- if(Query is not null) {
- queryResult = searchService.Search(Query)
- .OrderByDescending(m => m.ObjectId)
- .ToArray();
+ 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<Media> FilterMedia(IEnumerable<Media> 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 @@
<tr data-guid="@tagDef.Guid">
<td>@tagDef.Alias</td>
<td>
- <a href="/Gallery?q=@tagDef.Name" class="nondecorated">
+ <a href="/Gallery?t=@tagDef.Guid" class="nondecorated">
@tagDef.Name
</a>
</td>