Changeset 520e477 in Klonkt for src/routes/posts.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/posts.js

    r1485933 r520e477  
    9595const router = express.Router();
    9696
     97// Feed page size for "Load more" (Solo, News, Messages, Cirkel). 72 is divisible
     98// by 2/3/4 so every grid column count ends on a full row.
     99const FEED_PAGE = 72;
     100
    97101// ==================== UPLOAD IMAGE (cover or content) ====================
    98102// Returns JSON {url} so the editor can stick it into the cover field or
     
    210214  `).all(site.id);
    211215
    212   // Regular posts: anything with pinned = 0
    213   const posts = db.prepare(`
     216  // Regular posts: anything with pinned = 0. Paged in blocks of 72 (Load more).
     217  const append = req.query.append === '1';
     218  const offset = Math.max(0, parseInt(req.query.offset, 10) || 0);
     219  const rows = db.prepare(`
    214220    SELECT p.*, u.username as author_username
    215221    FROM posts p JOIN users u ON p.author_id = u.id
    216222    WHERE p.site_id = ? AND p.status = 'published' AND p.pinned = 0
    217223    ORDER BY p.published_at DESC
    218     LIMIT 30
    219   `).all(site.id);
     224    LIMIT ? OFFSET ?
     225  `).all(site.id, FEED_PAGE + 1, offset);
     226  const hasMore = rows.length > FEED_PAGE;
     227  const posts = rows.slice(0, FEED_PAGE);
     228  const moreBase = res.locals.siteUrlBase || '';
     229
     230  if (append) {
     231    return renderPage(req, res, 'partials/home-append', { posts, hasMore, nextOffset: offset + FEED_PAGE, moreBase });
     232  }
    220233
    221234  recordPageview(site.id, req);
     
    224237    pinnedPosts,
    225238    posts,
     239    hasMore, nextOffset: offset + FEED_PAGE, moreBase,
    226240    pageTitle: site.title,
    227241    socialDescr: site.description || site.tagline || '',
     
    893907}
    894908
    895 const FEED_PAGE = 72; // divisible by 2/3/4 → every grid column count keeps full rows
    896909router.get('/news', requireSiteManager, (req, res) => {
    897910  const site = res.locals.site;
Note: See TracChangeset for help on using the changeset viewer.