Changeset 520e477 in Klonkt for src/routes/circle.js


Ignore:
Timestamp:
07/20/2026 07:35:55 AM (7 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
22d2f5a8
Parents:
1485933
git-author:
Robin <roboburr@…> (07/20/2026 07:26:51 AM)
git-committer:
Robin <roboburr@…> (07/20/2026 07:35:55 AM)
Message:

Feature: Load more on Solo + Cirkel, page 72 (klonkt-demo-r9u, slice 3/4)

The home feed (Solo) and the Cirkel feed now page in 72s instead of a
hard 30/80 cap. Both render two containers (list + grid, CSS-toggled),
so the append fragment (partials/home-append) sends the post-cards as
the primary beforeend swap into #post-list and OOB-appends the same
posts as tiles into #grid-tiles. htmx 1.9.12 unwraps the OOB wrapper's
children on a positional swap, so the tiles land as direct grid items
(the display:contents wrapper is a belt-and-braces fallback). The
button lives once below both views and OOB-replaces itself with the
next offset, dropping on the last page. Pinned posts stay on page 1
only. getCirkelPosts gains an offset arg; FEED_PAGE hoisted to the top
of posts.js.

Browser-verified both feeds: 72 -> 144 -> 150 in list AND grid, then
the button disappears.

Co-Authored-By: Claude Opus 4.8 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/circle.js

    r1485933 r520e477  
    4242}
    4343
     44const CIRKEL_PAGE = 72; // matches FEED_PAGE in posts.js: divisible by 2/3/4
     45
    4446router.get('/cirkel', (req, res, next) => {
    4547  const site = res.locals.site;
    4648  if (!site || !apEnabled() || (ActivityPubService.autoBoostCount(site.slug) === 0 && ActivityPubService.boostedCount(site.slug) === 0)) return next();
    4749
    48   const posts = ActivityPubService.getCirkelPosts(site.slug, 80).map((r) => {
     50  const append = req.query.append === '1';
     51  const offset = Math.max(0, parseInt(req.query.offset, 10) || 0);
     52  const rows = ActivityPubService.getCirkelPosts(site.slug, CIRKEL_PAGE + 1, offset);
     53  const hasMore = rows.length > CIRKEL_PAGE;
     54  const posts = rows.slice(0, CIRKEL_PAGE).map((r) => {
    4955    const text = tidySnippet(htmlToText(r.content));
    5056    // Show ONLY the title (the bold first line a Klonkt note carries), not the whole
     
    7783  });
    7884
     85  const moreBase = res.locals.siteUrlBase || '';
     86  if (append) {
     87    return renderPage(req, res, 'partials/home-append', { posts, hasMore, nextOffset: offset + CIRKEL_PAGE, moreBase, morePath: '/cirkel' });
     88  }
     89
    7990  const sites = ActivityPubService.getCirkelMembers(site.slug)
    8091    .map((s) => ({ name: s.name || 'Onbekend', url: safeUrl(s.url), avatar: safeUrl(s.icon) }));
    8192
    82   renderPage(req, res, 'pages/circle-feed', { pageTitle: 'Cirkel', bodyClass: 'on-cirkel', posts, sites });
     93  renderPage(req, res, 'pages/circle-feed', {
     94    pageTitle: 'Cirkel', bodyClass: 'on-cirkel', posts, sites,
     95    hasMore, nextOffset: offset + CIRKEL_PAGE, moreBase,
     96  });
    8397});
    8498
Note: See TracChangeset for help on using the changeset viewer.