Changeset 8b65e67 in Klonkt for src/services/PostAccessService.js


Ignore:
Timestamp:
08/18/2026 06:47:58 PM (3 weeks ago)
Author:
Bart <bart@…>
Branches:
main
Children:
f5cf299
Parents:
b1b7652
git-author:
Bart <bart@…> (08/17/2026 07:37:17 PM)
git-committer:
Bart <bart@…> (08/18/2026 06:47:58 PM)
Message:

Een gesloten bericht houdt zijn plek, en zijn tekst blijft thuis

Tweede stap voor de tijdlijn (Barts idee, naar bartoverkamp.nl): hele berichten
in de stroom in plaats van kaartjes. Een poort kan dan geen pagina meer zijn --
een betaald of fan-bericht moet ter plekke zeggen wat er is, met behoud van zijn
plek. Weglaten zou erger zijn: dan zien een supporter en een vreemde een andere
tijdlijn met andere buren, en klopt "vorige/volgende" voor niemand.

postEntry() is met opzet een functie en geen sjabloonconditie. Het lijf wordt
alleen GERENDERD als het ook getoond mag worden, dus bij een dichte poort reist
de tekst niet mee. Een <% if %> in een sjabloon krijgt hem wel in het model,
en dan staat er één vergeten conditie -- of één partial die net iets anders
samenstelt -- tussen de betaalmuur en de tekst erachter.

partials/post-body.ejs kiest alleen de vorm en gebruikt de woorden van de
bestaande poorten (pgate./fgate.), zodat ze niet uiteen gaan lopen na de eerste
tekstwijziging. Het ontgrendelen zelf blijft op de eigen pagina, want daar zit
de passkey-code; één knop ernaartoe is eerlijker dan een halve poort.

Vijf toetsen erbij, waaronder dat er bij een dichte poort niets van de tweede
alinea in het model zit.

Co-Authored-By: Claude Opus 5 <claude@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/PostAccessService.js

    rb1b7652 r8b65e67  
    6969export function canReadBody(post, viewer) { return postAccess(post, viewer) === 'full'; }
    7070
    71 export default { postAccess, canReadBody, paidTeaser };
     71/**
     72 * Eén bericht, klaar voor de tijdlijn.
     73 *
     74 * DE HELE REDEN DAT DIT EEN FUNCTIE IS: het lijf wordt alleen GERENDERD als het
     75 * ook getoond mag worden. Een sjabloon dat zelf `<% if (access === 'full') %>`
     76 * doet krijgt de volledige tekst tóch mee in het model, en dan is het één
     77 * vergeten conditie -- of één `?partial=1` die net iets anders samenstelt --
     78 * tussen een betaalmuur en de tekst erachter. Hier komt hij niet eens mee.
     79 *
     80 * `renderBody` wordt ingespoten (posts.js levert renderPostBodyHtml), zodat
     81 * deze module niets van routes of sjablonen hoeft te weten.
     82 */
     83export function postEntry(post, viewer, { renderBody } = {}) {
     84  const access = postAccess(post, viewer);
     85  const full = access === 'full';
     86  return {
     87    slug: post && post.slug,
     88    title: (post && post.title) || '',
     89    access,
     90    // Alleen bij een gesloten poort een teaser, en nooit allebei: de teaser is
     91    // de vervanging van het lijf, niet een voorproefje ernaast.
     92    teaser: full || access === 'forbidden' ? null : paidTeaser(post),
     93    content_html: full && typeof renderBody === 'function' ? renderBody(post) : null,
     94  };
     95}
     96
     97export default { postAccess, canReadBody, paidTeaser, postEntry };
Note: See TracChangeset for help on using the changeset viewer.