| 1 | /**
|
|---|
| 2 | * De leesweergave: tikken op een bericht opent dat bericht.
|
|---|
| 3 | *
|
|---|
| 4 | * Dit was een heel scherm met een eigen route, dat zijn buren zelf ophaalde, de
|
|---|
| 5 | * scrollpositie corrigeerde bij invoegen en de balken wegschoof. Dat is allemaal
|
|---|
| 6 | * weg, en dat is winst: Lezen is nu een DERDE WEERGAVE van de feed
|
|---|
| 7 | * (body[data-feed-view="reader"]), naast Tijdlijn en Grid. De feed levert de
|
|---|
| 8 | * berichten al, "meer laden" vult al aan, en het snappen naar berichtgrenzen
|
|---|
| 9 | * doet CSS. Wat overblijft is dit ene gemak.
|
|---|
| 10 | *
|
|---|
| 11 | * De titel en de voetlink in read-article.ejs zijn echte <a>'s en doen het werk
|
|---|
| 12 | * voor toetsenbord en schermlezer; dit hier is er voor een duim.
|
|---|
| 13 | *
|
|---|
| 14 | * Vier uitzonderingen, want een tik die je niet bedoelde is erger dan geen tik:
|
|---|
| 15 | * iets dat zelf al een doel heeft (link, knop, veld) houdt zijn eigen werking,
|
|---|
| 16 | * een geselecteerde tekst is geen tik, een verschoven vinger is scrollen, en
|
|---|
| 17 | * cmd/ctrl-klik hoort de browser zelf af te handelen.
|
|---|
| 18 | */
|
|---|
| 19 |
|
|---|
| 20 | let tapX = 0, tapY = 0;
|
|---|
| 21 | function onPointerDown(e) { tapX = e.clientX; tapY = e.clientY; }
|
|---|
| 22 |
|
|---|
| 23 | function onTap(e) {
|
|---|
| 24 | if (e.defaultPrevented || e.button !== 0) return;
|
|---|
| 25 | if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
|
|---|
| 26 | const t = e.target;
|
|---|
| 27 | if (!t || typeof t.closest !== 'function') return;
|
|---|
| 28 | const art = t.closest('.read-post');
|
|---|
| 29 | if (!art) return;
|
|---|
| 30 | if (t.closest('a, button, input, textarea, select, label, summary, [role="button"]')) return;
|
|---|
| 31 | if (Math.abs(e.clientX - tapX) > 10 || Math.abs(e.clientY - tapY) > 10) return;
|
|---|
| 32 | const sel = window.getSelection && window.getSelection();
|
|---|
| 33 | if (sel && String(sel).trim()) return;
|
|---|
| 34 | const slug = art.dataset.slug;
|
|---|
| 35 | if (!slug) return;
|
|---|
| 36 | location.href = (art.dataset.base || '') + '/' + encodeURIComponent(slug);
|
|---|
| 37 | }
|
|---|
| 38 |
|
|---|
| 39 | export function init() {
|
|---|
| 40 | const s = document.getElementById('read-stream');
|
|---|
| 41 | if (!s) return;
|
|---|
| 42 | // Op de stroom, niet per artikel: wat "meer laden" erbij zet doet vanzelf mee.
|
|---|
| 43 | // init() draait bij ELKE paginawissel, dus eerst losmaken -- anders stapelt
|
|---|
| 44 | // dezelfde afhandelaar zich op en vuurt hij twee keer.
|
|---|
| 45 | s.removeEventListener('pointerdown', onPointerDown);
|
|---|
| 46 | s.removeEventListener('click', onTap);
|
|---|
| 47 | s.addEventListener('pointerdown', onPointerDown, { passive: true });
|
|---|
| 48 | s.addEventListener('click', onTap);
|
|---|
| 49 | }
|
|---|
| 50 |
|
|---|
| 51 | export default { init };
|
|---|