| 1 | // De post-pagina: het "beantwoorden vanaf je eigen server"-veld (shaer-bqr).
|
|---|
| 2 | //
|
|---|
| 3 | // Stond inline in pages/post.ejs. Kwam je op een post via een link BINNEN de
|
|---|
| 4 | // site, dan arriveerde dat script via htmx met een nonce die het document niet
|
|---|
| 5 | // kent en weigerde de CSP het (shaer-0i6) -- dus deed de knop niets, precies op
|
|---|
| 6 | // de plek waar de meeste bezoekers binnenkomen.
|
|---|
| 7 | //
|
|---|
| 8 | // Kon ongewijzigd mee: alles is al gedelegeerd op document, er wordt geen enkel
|
|---|
| 9 | // pagina-element vastgehouden, en er staat een slot op. Dat is niet toevallig --
|
|---|
| 10 | // het is geschreven voor een popover die na een htmx-swap moet blijven werken.
|
|---|
| 11 |
|
|---|
| 12 | (function(){
|
|---|
| 13 | if (window.__fediRemoteWired) return; window.__fediRemoteWired = true;
|
|---|
| 14 | var current = null, currentBtn = null;
|
|---|
| 15 | function close(){ if (current) { current.remove(); current = null; currentBtn = null; } }
|
|---|
| 16 | function go(raw, uri){
|
|---|
| 17 | var d = (raw||'').trim().replace(/^@?[^@\s]*@/, '').replace(/^https?:\/\//i, '').replace(/\/.*$/, '').trim();
|
|---|
| 18 | if (d) { try { localStorage.setItem('pcmsFediServer', d); } catch(e){} location.href = 'https://' + d + '/authorize_interaction?uri=' + encodeURIComponent(uri||''); }
|
|---|
| 19 | }
|
|---|
| 20 | function place(f, b){
|
|---|
| 21 | var r = b.getBoundingClientRect();
|
|---|
| 22 | f.style.top = (r.bottom + window.scrollY + 6) + 'px';
|
|---|
| 23 | f.style.left = Math.max(8, Math.min(r.left + window.scrollX, window.scrollX + window.innerWidth - 340)) + 'px';
|
|---|
| 24 | }
|
|---|
| 25 | document.addEventListener('click', function(e){
|
|---|
| 26 | if (e.target.closest && e.target.closest('.fedi-remote-cancel')) { close(); return; }
|
|---|
| 27 | if (current && e.target.closest && e.target.closest('.fedi-remote-form')) return; // click inside → keep
|
|---|
| 28 | var b = e.target.closest && e.target.closest('.fedi-remote-reply-btn');
|
|---|
| 29 | if (b) {
|
|---|
| 30 | e.preventDefault();
|
|---|
| 31 | if (currentBtn === b) { close(); return; } // toggle off
|
|---|
| 32 | close();
|
|---|
| 33 | var f = document.createElement('form');
|
|---|
| 34 | f.className = 'fedi-remote-form';
|
|---|
| 35 | f.dataset.uri = b.getAttribute('data-fedi-uri') || '';
|
|---|
| 36 | f.innerHTML = '<input type="text" autocomplete="off" spellcheck="false">'
|
|---|
| 37 | + '<button type="submit" class="btn btn-primary fedi-remote-go" aria-label="ok">→</button>'
|
|---|
| 38 | + '<button type="button" class="fedi-remote-cancel" aria-label="x">×</button>';
|
|---|
| 39 | var _inp = f.querySelector('input');
|
|---|
| 40 | _inp.placeholder = b.getAttribute('data-fedi-ph') || 'mastodon.social';
|
|---|
| 41 | try { var _sv = localStorage.getItem('pcmsFediServer'); if (_sv) _inp.value = _sv; } catch(e){}
|
|---|
| 42 | document.body.appendChild(f); // floating popover → no layout reflow
|
|---|
| 43 | place(f, b); current = f; currentBtn = b;
|
|---|
| 44 | _inp.focus(); _inp.select();
|
|---|
| 45 | return;
|
|---|
| 46 | }
|
|---|
| 47 | if (current) close(); // click anywhere else closes it
|
|---|
| 48 | });
|
|---|
| 49 | document.addEventListener('submit', function(e){
|
|---|
| 50 | var f = e.target.closest && e.target.closest('.fedi-remote-form');
|
|---|
| 51 | if (!f) return; e.preventDefault();
|
|---|
| 52 | go(f.querySelector('input').value, f.dataset.uri);
|
|---|
| 53 | });
|
|---|
| 54 | document.addEventListener('keydown', function(e){ if (e.key === 'Escape') close(); });
|
|---|
| 55 | window.addEventListener('scroll', close, true);
|
|---|
| 56 | })();
|
|---|
| 57 |
|
|---|