summaryrefslogtreecommitdiff
path: root/Server.Client/Pages/Gallery.razor
diff options
context:
space:
mode:
Diffstat (limited to 'Server.Client/Pages/Gallery.razor')
-rw-r--r--Server.Client/Pages/Gallery.razor151
1 files changed, 151 insertions, 0 deletions
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]*@
+
+<PageTitle>@Title</PageTitle>
+
+@if(Ingest && !hb.HasNsfwClaim) {
+ <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>
+} 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 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!; *@
+ <a href="/ViewMedia?m=@mediaId">
+ <img src="/media/thumb/@mediaId?h=200" height="200"/>
+ </a>
+ }
+ <div id="canary" style="height:1px;"></div>
+ </div>
+}
+
+<script suppress-error="BL9992">
+ function registerScrollObserver(dotNetObject) {
+ var scrollObserver = new IntersectionObserver(
+ async (e) => {
+ if(e[0].isIntersecting) {
+ await dotNetObject.invokeMethodAsync('LoadMedia', false);
+ }
+ },
+ {
+ root: document.getElementById('content'),
+ threshold: 0
+ });
+ scrollObserver.observe(document.getElementById("canary"));
+ }
+</script>
+
+@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<Guid> 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<ApiModels.SortOrder>(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;
+}