Een dating-app op basis van brieven, niet van gezichten!

main

Deze repository wordt als momentopname gepubliceerd: een clone bevat de volledige inhoud, maar geen commitgeschiedenis.

6.2 kB Ruw bestand
import { page, esc } from "./huisstijl.js";
import { PRIVACY_TITLE, PRIVACY_INTRO, PRIVACY_SECTIONS } from "../src/content/privacy.js";
import { CHILD_SAFETY_TITLE, CHILD_SAFETY_INTRO, CHILD_SAFETY_SECTIONS } from "../src/content/child-safety.js";
import { GENERAL_CONTACT, PRIVACY_CONTACT, MODERATION_CONTACT, COMPLAINTS_CONTACT, CHILD_SAFETY_CONTACT, MIN_CHARS } from "../src/constants.js";

/*
 * De publieke website van het domein — onderdeel van de server, server-gerenderd, zonder framework
 * en zonder iets van buiten dit domein. Papier, palet en letters komen uit server/huisstijl.js, dat
 * ze deelt met de beheerpagina, het rapport en de post. Er draait bewust géén web-versie van de
 * app; dit is alles wat een browser op liefdesbrieven.bramluiken.org te zien krijgt:
 *   GET /         landingHtml — kale voordeur: wat dit is, link naar de verklaring, contact
 *   GET /privacy  privacyHtml — de privacyverklaring, dezelfde tekst als in de app. De URL voor
 *                 de Google Play-console (privacybeleid + 'account verwijderen zonder de app').
 */

const paragraph = (p) => (Array.isArray(p) ? `<ul>${p.map((li) => `<li>${esc(li)}</li>`).join("")}</ul>` : `<p>${esc(p)}</p>`);

export function privacyHtml() {
  const sections = PRIVACY_SECTIONS.map(
    (s) => `<section><h2>${esc(s.heading)}</h2>${s.paragraphs.map(paragraph).join("")}</section>`
  ).join("\n");
  return page(
    PRIVACY_TITLE,
    `<h1>${esc(PRIVACY_TITLE)}</h1>
<p class="mute">${esc(PRIVACY_INTRO)}</p>
${sections}
<p class="mute mono" style="margin-top:32px"><a href="/">← Liefdesbrieven</a></p>`
  );
}

/*
 * De normen tegen kindermisbruik. Google Play eist voor apps in Dating/Social een openbaar
 * gepubliceerde URL met deze normen; die URL staat in de console onder Child safety standards.
 */
export function childSafetyHtml() {
  const sections = CHILD_SAFETY_SECTIONS.map(
    (s) => `<section><h2>${esc(s.heading)}</h2>${s.paragraphs.map(paragraph).join("")}</section>`
  ).join("\n");
  return page(
    CHILD_SAFETY_TITLE,
    `<h1>${esc(CHILD_SAFETY_TITLE)}</h1>
<p class="mute">${esc(CHILD_SAFETY_INTRO)}</p>
${sections}
<p class="mute mono" style="margin-top:32px"><a href="/">← Liefdesbrieven</a> · <a href="/privacy">privacyverklaring</a></p>`
  );
}

/* De index: een overzicht van wat de app is en hoe hij werkt — geen verkooppagina */
export function landingHtml() {
  return page(
    "Liefdesbrieven",
    `<h1>Liefdesbrieven</h1>
<p class="mute">Een dating-app op basis van brieven. Voor je telefoon (Android; iOS later) — dit is alleen de
uitleg.</p>

<h2>Het idee</h2>
<p>Profielen zijn alleen tekst: wie je bent, wat je leest, waar je heen loopt. Foto's horen in brieven — maximaal
één per brief, en niet in een eerste brief: er gaat pas beeld mee als de ander jou geschreven heeft. En je schrijft
geen berichtjes maar brieven: minimaal ${MIN_CHARS} tekens. Wie iemand wil leren kennen, neemt er de tijd voor.</p>

<h2>Hoe het werkt</h2>
<ol>
  <li><strong>Account.</strong> Naam, e-mail, wachtwoord, wie je bent (vrouw, man, non-binair — met of zonder
  <em>trans</em>) en je geboortedatum. Je moet 18 of ouder zijn.</li>
  <li><strong>Profiel.</strong> Je relatiestatus, je profieltekst en optioneel je locatie. En wie je wilt zien:
  gender, leeftijd, en of je ook mensen in een relatie en/of trans personen wilt zien, eventueel binnen een straal.</li>
  <li><strong>Zoeken.</strong> Fulltext in profielteksten. Je ziet alleen mensen bij wie jullie filters
  <em>wederzijds</em> passen — en zij jou dus ook. Wie in een relatie is of trans is, verschijnt alleen bij mensen
  die daar bewust voor openstaan.</li>
  <li><strong>Brief schrijven.</strong> Aan iemand die past, of terug aan iemand met wie je al schrijft.</li>
  <li><strong>Postvak.</strong> Eén regel per correspondentie, ongelezen brieven gemarkeerd. Favorieten staan
  bovenaan; blokkeren kan altijd, stil, en is terug te draaien.</li>
</ol>

<h2>Wat anderen van je zien</h2>
<p>Je naam, leeftijd, gender, relatiestatus, profieltekst, hoe lang geleden je actief was en — als jullie allebei
een locatie hebben — de afstand in kilometers. Nooit je e-mailadres, geboortedatum of locatie. Brieven zijn
alleen voor schrijver en ontvanger.</p>

<h2>Veiligheid</h2>
<p>Blokkeren werkt meteen en stil: de ander merkt er niets van. Melden gaat naar de beheerder, die kan
waarschuwen, een brief weghalen, iemand schorsen of een account verwijderen. Wat we niet toestaan als het om
kinderen gaat, hoe je het meldt en wat er daarna gebeurt, staat bij
<a href="/kinderveiligheid">kinderveiligheid</a>.</p>

<h2>Je gegevens</h2>
<p>In de app kun je alles opvragen wat we van je bewaren, je gegevens wijzigen en je account met alles erin
verwijderen. Wat we bewaren, waarom en hoe lang staat in de <a href="/privacy">privacyverklaring</a> — daar
staat ook hoe je je account laat verwijderen als je de app niet meer hebt.</p>

<h2>Hoe het ervoor staat</h2>
<p>Een datingapp kan van alles beweren over hoeveel leden hij heeft. Wat je wilt weten is of je hier antwoord
krijgt. Dat staat, één keer per maand ververst en met de tegenvallers erbij, bij
<a href="/cijfers">de cijfers</a>.</p>

<h2>Voor de nieuwsgierige</h2>
<p>Hoe de app een afstand berekent zonder kaartendienst, wat er in een fotobestand verstopt zit, en welke
kromme het leeftijdsfilter tekent: de techniek achter de app staat, met de formules erbij, bij
<a href="/weetjes">de weetjes</a>.</p>

<h2>Contact</h2>
<p>Vijf adressen, zodat post niet op één stapel belandt en een melding niet achter een factuur
komt te liggen:</p>
<ul>
  <li><a href="mailto:${esc(GENERAL_CONTACT)}">${esc(GENERAL_CONTACT)}</a> — gewone post: een vraag,
  een suggestie, iets wat nergens anders past</li>
  <li><a href="mailto:${esc(PRIVACY_CONTACT)}">${esc(PRIVACY_CONTACT)}</a> — je gegevens: inzage,
  wijzigen, verwijderen, bezwaar</li>
  <li><a href="mailto:${esc(MODERATION_CONTACT)}">${esc(MODERATION_CONTACT)}</a> — misbruik melden,
  ook zonder account</li>
  <li><a href="mailto:${esc(COMPLAINTS_CONTACT)}">${esc(COMPLAINTS_CONTACT)}</a> — het er niet mee eens
  zijn: bezwaar tegen een waarschuwing of schorsing</li>
  <li><a href="mailto:${esc(CHILD_SAFETY_CONTACT)}">${esc(CHILD_SAFETY_CONTACT)}</a> — alles wat met
  <a href="/kinderveiligheid">kinderveiligheid</a> te maken heeft</li>
</ul>`
  );
}