Browse Source

Detect when publication loading is done in component

master
buttercat1791 10 months ago
parent
commit
da2cae365f
  1. 44
      src/lib/components/Publication.svelte

44
src/lib/components/Publication.svelte

@ -32,6 +32,7 @@
let leaves = $state<NDKEvent[]>([]); let leaves = $state<NDKEvent[]>([]);
let loadedAddresses = $state<Set<string>>(new Set()); let loadedAddresses = $state<Set<string>>(new Set());
let isLoading = $state<boolean>(false); let isLoading = $state<boolean>(false);
let isDone = $state<boolean>(false);
let lastElementRef = $state<HTMLElement | null>(null); let lastElementRef = $state<HTMLElement | null>(null);
let observer: IntersectionObserver; let observer: IntersectionObserver;
@ -40,9 +41,18 @@
isLoading = true; isLoading = true;
for (let i = 0; i < count; i++) { for (let i = 0; i < count; i++) {
const nextItem = await publicationTree.next(); const iterResult = await publicationTree.next();
const { done, value } = iterResult;
const nextAddress = nextItem.value?.tagAddress(); console.debug('Iterator result:', iterResult, 'done type:', typeof done);
if (done) {
console.debug('Done condition met, setting isDone to true');
isDone = true;
break;
}
const nextAddress = value?.tagAddress();
if (nextAddress && loadedAddresses.has(nextAddress)) { if (nextAddress && loadedAddresses.has(nextAddress)) {
continue; continue;
} }
@ -50,13 +60,18 @@
if (nextAddress && !loadedAddresses.has(nextAddress)) { if (nextAddress && !loadedAddresses.has(nextAddress)) {
loadedAddresses.add(nextAddress); loadedAddresses.add(nextAddress);
} }
if (leaves.includes(nextItem.value) || (nextItem.done && nextItem.value === null)) { if (value == null) {
isLoading = false;
break;
}
if (leaves.includes(value)) {
isLoading = false; isLoading = false;
return; break;
} }
leaves.push(nextItem.value); leaves.push(value);
} }
isLoading = false; isLoading = false;
@ -73,8 +88,17 @@
return; return;
} }
observer.observe(lastElementRef!); if (isDone) {
return () => observer.unobserve(lastElementRef!); observer?.unobserve(lastElementRef!);
return;
}
observer?.observe(lastElementRef!);
return () => observer?.unobserve(lastElementRef!);
});
$effect(() => {
console.debug('isDone changed to:', isDone);
}); });
// #endregion // #endregion
@ -149,7 +173,7 @@
// Set up the intersection observer. // Set up the intersection observer.
observer = new IntersectionObserver((entries) => { observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => { entries.forEach((entry) => {
if (entry.isIntersecting && !isLoading) { if (entry.isIntersecting && !isLoading && !isDone) {
loadMore(1); loadMore(1);
} }
}); });
@ -221,7 +245,7 @@
<Button disabled color="primary"> <Button disabled color="primary">
Loading... Loading...
</Button> </Button>
{:else} {:else if !isDone}
<Button color="primary" on:click={() => loadMore(1)}> <Button color="primary" on:click={() => loadMore(1)}>
Show More Show More
</Button> </Button>

Loading…
Cancel
Save