diff options
Diffstat (limited to 'Pages/Gallery.razor')
| -rw-r--r-- | Pages/Gallery.razor | 131 |
1 files changed, 55 insertions, 76 deletions
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; } |
