source: Klonkt/src/assets/js/mod/paid-gate.js@ a8364ee

main
Last change on this file since a8364ee was a8364ee, checked in by Robin <roboburr@…>, 5 weeks ago

Alle element-bedrade modules herstarten per paginawissel (shaer-5s1, vervolg)

Het recept van 4b5db37, toegepast op de rest van de familie. Twaalf modules
exporteren nu init(): download (de auto-start liep alleen bij import, dus na
een htmx-bezoek startte er niets), auth-register, admin-settings, admin-epk,
admin-paid, admin-help, admin-push, admin-site-edit, authorize-interaction,
paid-gate, paid-passkey en news.

Twee verdienen een woord:

authorize-interaction blok 1 bedraadde een element achter een WINDOW-vlag:

na een swap is de knop een nieuw element en
blokkeerde de vlag het herbedraden voorgoed. De vlag
zit nu op het element zelf.

news de gif- en lees-meer-scanners claimden in hun

commentaar per render te draaien, maar deden dat als
module niet meer. Ze zijn nu benoemde functies:
init() draait ze per navigatie, en een gedelegeerde
htmx:afterSettle draait ze ook na feed-paginering --
binnengehaalde items kregen anders geen lees-meer en
geen gif-gedrag.

Bewust ONaangeraakt, met reden: chrome (gedelegeerd, en de profile-sheet
staat BUITEN de geswapte #pcms-chrome dus zijn element-referenties blijven
geldig), post en messages (gedelegeerd; messages herstart zichzelf al via
pcmsNav), track-editor en playlist-editor (gedelegeerd / globale functie).

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

  • Property mode set to 100644
File size: 2.9 KB
Line 
1// De betaalmuur -- verplaatst uit inline script, shaer-bqr.
2//
3// Inline script wordt door de CSP geweigerd zodra deze pagina via een link
4// BINNEN de site binnenkomt (shaer-0i6). Servergegevens komen uit pageData();
5// interpolatie kan niet in een statisch bestand.
6
7import { pageData } from './lib.js';
8
9// Element-bedrading leeft zo lang als de pagina; de bootstrap roept init()
10// aan bij elke paginawissel waarop deze module actief is (shaer-5s1).
11export function init() { run(); }
12
13function run() {
14(function () {
15 var _d = pageData();
16 var base = _d.base || "";
17 var slug = _d.slug || "";
18 var hasPatron = !!_d.hasPatron;
19 var I = _d.i18n || {};
20 var btn = document.getElementById('pg-unlock');
21 var status = document.getElementById('pg-status');
22 function say(msg, err) { status.hidden = false; status.textContent = msg; status.classList.toggle('is-err', !!err); }
23 function toLink() { location.href = base + '/paid/link?post=' + encodeURIComponent(slug); }
24
25 // No WebAuthn here: an assertion is impossible. With a Patreon page there is
26 // already a "Word supporter" button, so hide the (dead) unlock button rather
27 // than turn it into a second "Word supporter". Without one, this IS the button.
28 if (!window.SimpleWebAuthnBrowser || !window.PublicKeyCredential) {
29 if (hasPatron) { btn.style.display = 'none'; }
30 else { btn.textContent = I.join; btn.addEventListener('click', toLink); }
31 return;
32 }
33
34 btn.addEventListener('click', function () {
35 btn.disabled = true;
36 say(I.confirm);
37 fetch(base + '/paid/challenge?post=' + encodeURIComponent(slug))
38 .then(function (r) { if (!r.ok) throw { link: true }; return r.json(); })
39 .then(function (data) {
40 return window.SimpleWebAuthnBrowser.startAuthentication({ optionsJSON: data.options })
41 .then(function (response) {
42 return fetch(base + '/paid/unlock', {
43 method: 'POST', headers: { 'Content-Type': 'application/json' },
44 body: JSON.stringify({ response: response, blob: data.blob }),
45 });
46 });
47 })
48 .then(function (r) { return r.json().then(function (j) { return { status: r.status, j: j }; }); })
49 .then(function (res) {
50 if (res.j && res.j.ok && res.j.redirect) {
51 // Reload the real post page via the one-shot unlock capability, so it
52 // renders through its normal template (layout, styles, audio).
53 location.href = res.j.redirect;
54 } else if (res.status === 403) {
55 toLink(); // no valid passkey yet (or lapsed tier): link via Patreon
56 } else {
57 btn.disabled = false; say(I.failed, true);
58 }
59 })
60 .catch(function (e) {
61 if (e && e.link) { toLink(); return; }
62 if (e && e.name === 'NotAllowedError') { toLink(); return; } // cancelled / no passkey -> link
63 btn.disabled = false; say(I.error, true);
64 });
65 });
66})();
67}
Note: See TracBrowser for help on using the repository browser.