@page "/" @page "/Gallery" @inject ITagService tagService @inject IFeedService feedService @inject IUserService userService @inject IJSRuntime jsRuntime @implements IDisposable @attribute [Authorize] @Title @if(Ingest && !userService.UserSessionState.ShowNsfw) {

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 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; } [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; protected override void OnInitialized() => userService.UserSessionState.OnStateChange += ShowNsfwChanged; 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) { Media? key = displayMedia?.Any() ?? false && !initial ? displayMedia.Last() : null; if(initial) displayMedia = new(); SortOrder? sortOrder = null; if(Enum.TryParse(SortOrder, true, out var so)) sortOrder = so; 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, sortOrder: sortOrder ?? default)); } 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, sortOrder: sortOrder ?? default)); } else { displayMedia!.AddRange(feedService.LoadChunk( selectIngest: Ingest, includeNsfw: userService.UserSessionState.ShowNsfw, key: key, count: PageSize, sortOrder: sortOrder ?? default)); } StateHasChanged(); } private async void ShowNsfwChanged(UserSessionState userSessionState) { await InvokeAsync(() => { LoadMedia(true); }); } public void Dispose() => userService.UserSessionState.OnStateChange -= ShowNsfwChanged; }