[frontend] Fix VirtualScroller logic error

This commit is contained in:
Lilian 2024-06-19 01:55:33 +02:00
parent 4e150ec42f
commit 9a5312e57c
No known key found for this signature in database
GPG key ID: 007CA12D692829E1

View file

@ -11,8 +11,8 @@
@inject StateService StateService @inject StateService StateService
<div @ref="@Scroller" class="scroller"> <div @ref="@Scroller" class="scroller">
<div @ref="@padTopRef" class="padding top" style="height: @(State.PadTop + "px")"></div> <div @ref="@_padTopRef" class="padding top" style="height: @(State.PadTop + "px")"></div>
@if(loadingTop){ @if(_loadingTop){
<div class="target"> <div class="target">
Loading! Loading!
</div> </div>
@ -29,7 +29,7 @@
Loading! Loading!
</div> </div>
} }
<div @ref="@padBotRef" class="padding bottom" style="height: @(State.PadBottom + "px")"></div> <div @ref="@_padBotRef" class="padding bottom" style="height: @(State.PadBottom + "px")"></div>
</div> </div>
@code { @code {
@ -46,25 +46,26 @@
private IntersectionObserver? OvrscrlObsvBottom { get; set; } private IntersectionObserver? OvrscrlObsvBottom { get; set; }
private bool _overscrollTop = false; private bool _overscrollTop = false;
private bool _overscrollBottom = false; private bool _overscrollBottom = false;
private ElementReference padTopRef; private ElementReference _padTopRef;
private ElementReference padBotRef; private ElementReference _padBotRef;
private ElementReference Scroller; private ElementReference Scroller;
private bool loadingTop = false; private bool _loadingTop = false;
private bool loadingBottom = false; private bool loadingBottom = false;
private bool setScroll = false; public bool setScroll = false;
private ElementReference Ref private ElementReference Ref
{ {
set => _refs.Add(value); set => _refs.Add(value);
} }
private bool interlock = false; private bool _interlock = false;
private IJSObjectReference Module { get; set; } private IJSObjectReference Module { get; set; }
private void InitialRender(string? id) private void InitialRender(string? id)
{ {
var a = new List<NoteResponse>(); var a = new List<NoteResponse>();
a = NoteResponseList.GetRange(0, _count); a = NoteResponseList.Count < _count ? NoteResponseList : NoteResponseList.GetRange(0, _count);
State.RenderedList = a; State.RenderedList = a;
} }
@ -79,10 +80,10 @@
private async Task LoadNewer() private async Task LoadNewer()
{ {
loadingTop = true; _loadingTop = true;
StateHasChanged(); StateHasChanged();
await ReachedStart.InvokeAsync(); await ReachedStart.InvokeAsync();
loadingTop = false; _loadingTop = false;
StateHasChanged(); StateHasChanged();
} }
@ -140,11 +141,11 @@
State.RenderedList.AddRange(a); State.RenderedList.AddRange(a);
await RemoveAbove(UpdateCount); await RemoveAbove(UpdateCount);
interlock = false; _interlock = false;
StateHasChanged(); StateHasChanged();
} }
await OvrscrlObsvBottom.Observe(padBotRef); await OvrscrlObsvBottom.Observe(_padBotRef);
} }
private async Task Up() private async Task Up()
@ -170,8 +171,8 @@
State.RenderedList.InsertRange(0, a); State.RenderedList.InsertRange(0, a);
State.RenderedList.RemoveRange(State.RenderedList.Count - UpdateCount, UpdateCount); State.RenderedList.RemoveRange(State.RenderedList.Count - UpdateCount, UpdateCount);
StateHasChanged(); StateHasChanged();
interlock = false; _interlock = false;
await OvrscrlObsvTop.Observe(padTopRef); await OvrscrlObsvTop.Observe(_padTopRef);
} }
private async Task SetupObservers() private async Task SetupObservers()
@ -184,8 +185,8 @@
OvrscrlObsvTop = await ObserverService.Create(OverscrollCallbackTop); OvrscrlObsvTop = await ObserverService.Create(OverscrollCallbackTop);
OvrscrlObsvBottom = await ObserverService.Create(OverscrollCallbackBottom); OvrscrlObsvBottom = await ObserverService.Create(OverscrollCallbackBottom);
await OvrscrlObsvTop.Observe(padTopRef); await OvrscrlObsvTop.Observe(_padTopRef);
await OvrscrlObsvBottom.Observe(padBotRef); await OvrscrlObsvBottom.Observe(_padBotRef);
} }
@ -195,7 +196,7 @@
var entry = list.First(); var entry = list.First();
_overscrollTop = entry.IsIntersecting; _overscrollTop = entry.IsIntersecting;
if (interlock == false) if (_interlock == false)
{ {
var index = NoteResponseList.IndexOf(State.RenderedList.First()); var index = NoteResponseList.IndexOf(State.RenderedList.First());
if (index == 0) if (index == 0)
@ -205,7 +206,7 @@
return; return;
} }
interlock = true; _interlock = true;
Console.WriteLine("first observed"); Console.WriteLine("first observed");
if (list.First().IsIntersecting) if (list.First().IsIntersecting)
@ -214,7 +215,7 @@
await Up(); await Up();
} }
interlock = false; _interlock = false;
} }
} }
@ -223,9 +224,9 @@
Console.WriteLine("Bottom callback fired"); Console.WriteLine("Bottom callback fired");
var entry = list.First(); var entry = list.First();
_overscrollBottom = entry.IsIntersecting; _overscrollBottom = entry.IsIntersecting;
if (interlock == false) if (_interlock == false)
{ {
interlock = true; _interlock = true;
Console.WriteLine("last observerd"); Console.WriteLine("last observerd");
if (list.First().IsIntersecting) if (list.First().IsIntersecting)
{ {
@ -233,7 +234,7 @@
await Down(); await Down();
} }
interlock = false; _interlock = false;
} }
} }