aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/features/messages.js29
1 files changed, 26 insertions, 3 deletions
diff --git a/src/features/messages.js b/src/features/messages.js
index 648f22d..eb55d88 100644
--- a/src/features/messages.js
+++ b/src/features/messages.js
@@ -12143,8 +12143,8 @@ export function messagesFeature(ctx) {
playSlide(e.target);
pagerCounts(e.target);
// near the end: ask the feed for more, the pager picks them up
- const slides = scroller.children;
- if ([...slides].indexOf(e.target) >= slides.length - 3) crawlMedia().catch(() => {});
+ if (pager.fromFeed) pagerFeedAhead();
+ else { const slides = scroller.children; if ([...slides].indexOf(e.target) >= slides.length - 3) crawlMedia().catch(() => {}); }
}
}, { root: scroller, threshold: [0.6] });
growPager();
@@ -12162,7 +12162,30 @@ export function messagesFeature(ctx) {
pager.onResize = () => { if (pager && pager.cur) pager.scroller.scrollTop = pager.cur.offsetTop; };
window.addEventListener('resize', pager.onResize);
// new posts land in the feed while the pager is open; counts move
- pager.tick = setInterval(() => { if (pager) { growPager(); if (el.classList.contains('show')) pagerCounts(pager.cur); } }, 1500);
+ pager.tick = setInterval(() => { if (pager) { growPager(); pagerFeedAhead(); if (el.classList.contains('show')) pagerCounts(pager.cur); } }, 1500);
+ }
+ // A pager opened from the feed walks the feed's own posts, which page in
+ // ten at a time as the feed is scrolled. Swiping is the scrolling here:
+ // with only a few slides left past the one on screen, the feed pages on
+ // (the posts it holds, then older ones from the relays) until there are
+ // more — several pages if those posts carry none. A page that brings
+ // nothing (the feed busy, or at its end) stops it; the tick tries again.
+ const PAGER_AHEAD = 3;
+ let pagerFeeding = false;
+ async function pagerFeedAhead() {
+ if (pagerFeeding || !pager || !pager.fromFeed) return;
+ pagerFeeding = true;
+ try {
+ const c = feedNow();
+ for (let pages = 0; pages < 8 && pager && pager.fromFeed; pages++) {
+ const slides = [...pager.scroller.children];
+ if (slides.length - 1 - slides.indexOf(pager.cur) > PAGER_AHEAD) break;
+ const shown = c.shown, held = c.notes.length;
+ await loadOlderFeed();
+ growPager();
+ if (c.shown === shown && c.notes.length === held) break;
+ }
+ } catch {} finally { pagerFeeding = false; }
}
// Slides for feed items the pager doesn't have yet, appended (never
// inserted above the one on screen).