diff --git a/Iceshrimp.Frontend/Components/LazyNote.razor b/Iceshrimp.Frontend/Components/LazyNote.razor index 7a032115..379048f1 100644 --- a/Iceshrimp.Frontend/Components/LazyNote.razor +++ b/Iceshrimp.Frontend/Components/LazyNote.razor @@ -1,22 +1,32 @@ @using Iceshrimp.Shared.Schemas +@using Ljbc1994.Blazor.IntersectionObserver @using Ljbc1994.Blazor.IntersectionObserver.API @using Ljbc1994.Blazor.IntersectionObserver.Components @inject IJSRuntime Js - +@if(_init) // FIXME: We need to wait for the Component to render once before initializing the Intersection Observer. + // With the Component this is AFAIK only possible by not rendering it until then. + // The proper fix for this is to change to the Service Pattern. + // But that requires the IntersectionObserver Library to be modified to return what element an observation update is for. +{ +
@if (_isIntersecting) { }else { -
+
}
+} @code { - [Parameter] public required NoteResponse Note { get; set; } - private IJSObjectReference? _module; - private int? Height { get; set; } = null; - private bool _isIntersecting = true; + [Parameter][EditorRequired] public required NoteResponse Note { get; set; } + [Parameter][EditorRequired] public ElementReference Scroller { get; set; } + private IJSObjectReference? _module; + private int? Height { get; set; } = null; + private bool _isIntersecting = true; + private string margin = "200%"; + private bool _init = false; protected override async Task OnAfterRenderAsync(bool firstRender) { @@ -24,12 +34,22 @@ { _module = await Js.InvokeAsync("import", "./Components/LazyNote.razor.js"); + } } - private async Task Change(string id, IntersectionObserverEntry entry) + protected override void OnAfterRender(bool firstRender) { - if (id == Note.Id && entry.IsIntersecting == false) + if (firstRender) + { + _init = true; + } + + } + + private async Task Change (IntersectionObserverEntry entry) + { + if (entry.IsIntersecting == false) { Height = await GetHeight(); _isIntersecting = false; @@ -37,7 +57,7 @@ return; } - if (id == Note.Id && entry.IsIntersecting) + if (entry.IsIntersecting) { _isIntersecting = true; } diff --git a/Iceshrimp.Frontend/Components/RecursiveNote.razor b/Iceshrimp.Frontend/Components/RecursiveNote.razor new file mode 100644 index 00000000..215239be --- /dev/null +++ b/Iceshrimp.Frontend/Components/RecursiveNote.razor @@ -0,0 +1,5 @@ +

RecursiveNote

+ +@code { + +} \ No newline at end of file diff --git a/Iceshrimp.Frontend/Components/RecursiveNote.razor.css b/Iceshrimp.Frontend/Components/RecursiveNote.razor.css new file mode 100644 index 00000000..e69de29b diff --git a/Iceshrimp.Frontend/Components/TimelineComponent.razor b/Iceshrimp.Frontend/Components/TimelineComponent.razor index 247cfb16..dce10e96 100644 --- a/Iceshrimp.Frontend/Components/TimelineComponent.razor +++ b/Iceshrimp.Frontend/Components/TimelineComponent.razor @@ -6,13 +6,15 @@ @inject ApiService ApiService @if (_init) { - @foreach (var note in Timeline) - { - - } - -
END!
-
+
+ @foreach (var note in Timeline) + { + + } + +
END!
+
+
} else { @@ -25,6 +27,7 @@ else private string? MaxId { get; set; } private string? MinId { get; set; } private bool LockFetch { get; set; } + public ElementReference Scroller { get; set; } private async Task Initialize() { diff --git a/Iceshrimp.Frontend/Components/TimelineComponent.razor.css b/Iceshrimp.Frontend/Components/TimelineComponent.razor.css index e69de29b..86f4ac4e 100644 --- a/Iceshrimp.Frontend/Components/TimelineComponent.razor.css +++ b/Iceshrimp.Frontend/Components/TimelineComponent.razor.css @@ -0,0 +1,8 @@ +.scroller { + display: flex; + flex-direction: column; + overflow: scroll; + max-height: 100vh; + width: 100%; + align-items: center; +} \ No newline at end of file diff --git a/Iceshrimp.Frontend/Core/Services/SessionService.cs b/Iceshrimp.Frontend/Core/Services/SessionService.cs index d15d4878..f63744d0 100644 --- a/Iceshrimp.Frontend/Core/Services/SessionService.cs +++ b/Iceshrimp.Frontend/Core/Services/SessionService.cs @@ -73,5 +73,6 @@ internal class SessionService LocalStorage.SetItem("last_user", user.Id); ((IJSInProcessRuntime)Js).InvokeVoid("eval", $"document.cookie = \"session={user.Id}; expires=Fri, 31 Dec 9999 23:59:59 GMT; SameSite=Strict\""); + // Security implications of this need a second pass? user.Id should never be user controllable, but still. } } \ No newline at end of file diff --git a/Iceshrimp.Frontend/Pages/SingleNote.razor b/Iceshrimp.Frontend/Pages/SingleNote.razor new file mode 100644 index 00000000..68fd0160 --- /dev/null +++ b/Iceshrimp.Frontend/Pages/SingleNote.razor @@ -0,0 +1,6 @@ +@page "/SingleNote" +

SingleNote

+ +@code { + +} \ No newline at end of file diff --git a/Iceshrimp.Frontend/Pages/SingleNote.razor.css b/Iceshrimp.Frontend/Pages/SingleNote.razor.css new file mode 100644 index 00000000..e69de29b diff --git a/Iceshrimp.Frontend/Pages/TimelinePage.razor b/Iceshrimp.Frontend/Pages/TimelinePage.razor index 8f66ef65..358b5469 100644 --- a/Iceshrimp.Frontend/Pages/TimelinePage.razor +++ b/Iceshrimp.Frontend/Pages/TimelinePage.razor @@ -1,8 +1,6 @@ @page "/" @using Iceshrimp.Frontend.Components -
- -
+ @code { diff --git a/Iceshrimp.Frontend/Pages/TimelinePage.razor.css b/Iceshrimp.Frontend/Pages/TimelinePage.razor.css index 86f4ac4e..e69de29b 100644 --- a/Iceshrimp.Frontend/Pages/TimelinePage.razor.css +++ b/Iceshrimp.Frontend/Pages/TimelinePage.razor.css @@ -1,8 +0,0 @@ -.scroller { - display: flex; - flex-direction: column; - overflow: scroll; - max-height: 100vh; - width: 100%; - align-items: center; -} \ No newline at end of file