/* ========================================================================== CONSENT: Cookie-/Speicher-Einwilligung und Altersbestaetigung. Zwei getrennte Dinge, die nur die Darstellung teilen: 1. Die Einwilligung entscheidet, ob die Analytics laufen duerfen. Der Session-Cookie ist technisch notwendig und steht nicht zur Wahl, die Analytics schon. Ablehnen ist genauso einfach wie Zustimmen, sonst ist die Einwilligung keine. 2. Die Altersbestaetigung ist kein Datenschutzthema, sondern ein Inhaltsthema: die Wissensbasis behandelt Pharmakologie. Wer angemeldet ist, hat bei der Registrierung bestaetigt und wird nicht erneut gefragt. Beides blockiert die Seite nicht laenger als noetig und speichert nichts, bevor entschieden wurde. ========================================================================== */ /* --- Altersbestaetigung --------------------------------------------------- */ function AgeGate({ onConfirm }) { return (

{BB.t("Inhalte ab 18 Jahren")}

{BB.t("Diese Seite dokumentiert unter anderem Pharmakologie und Hormonphysiologie. Die Inhalte richten sich an volljährige Personen und sind keine medizinische Beratung.")}

{BB.t("Seite verlassen")}

{BB.t("Die Bestätigung wird nur lokal in deinem Browser gespeichert.")}

); } /* --- Einwilligung in die Messung ------------------------------------------ */ function ConsentBanner({ onChoose }) { const [details, setDetails] = useState(false); return (
{BB.t("Messung nur mit deiner Zustimmung")}

{BB.t("Wir messen anonym, wie die Seite genutzt wird: selbst gehostet, ohne Werbenetzwerke und ohne Weitergabe an Dritte. Dafür wird eine zufällige Kennung für 24 Stunden in deinem Browser abgelegt. Ohne Zustimmung passiert nichts davon.")}

{details && (
  • {BB.t("Notwendig")} {": "} {BB.t("Ein Cookie hält deine Anmeldung. Ohne ihn kannst du dich nicht einloggen. Er lässt sich nicht abwählen.")}
  • {BB.t("Messung")} {": "} {BB.t("Zufällige Kennung für maximal 24 Stunden, gespeichert wird davon nur ein Hash. Keine IP-Adresse, keine Verknüpfung mit deinem Konto, keine Weitergabe.")}
)}

{BB.t("Datenschutz")} {" · "} {BB.t("Impressum")}

); } /* Aenderung der Entscheidung, eingebunden in /einstellungen. Eine einmal erteilte Einwilligung muss jederzeit widerrufbar sein. */ function ConsentSetting() { const [value, setValue] = useState(() => BB.consent.current()); const set = (yes) => { setValue(yes ? BB.consent.accept() : BB.consent.reject()); }; return (

{BB.t("Messung")}

{BB.t("Anonyme Nutzungsmessung, selbst gehostet. Du kannst deine Entscheidung jederzeit ändern.")}

{value && (

{BB.t("Zuletzt geändert")}: {BB.when(value.at)}

)}
); } /* --- Reihenfolge ---------------------------------------------------------- */ /* Erst das Alter, dann die Messung. Beides an einer Stelle, damit die zweite Frage nicht schon unter der ersten steht. */ function ConsentLayer() { const { user, ready } = useAuth(); const [ageDone, setAgeDone] = useState(() => BB.ageGate.confirmed()); const [consentDone, setConsentDone] = useState(() => BB.consent.decided()); // Wer angemeldet ist, hat bei der Registrierung bestaetigt. Das wird lokal // mitgeschrieben, damit die Abfrage nach dem Abmelden nicht zurueckkommt. useEffect(() => { if (user && !BB.ageGate.confirmed()) BB.ageGate.confirm(); if (user) setAgeDone(true); }, [user]); if (!ready) return null; if (!ageDone) { return { BB.ageGate.confirm(); setAgeDone(true); }} />; } if (!consentDone) { return ( { if (yes) BB.consent.accept(); else BB.consent.reject(); setConsentDone(true); }} /> ); } return null; } Object.assign(window, { AgeGate, ConsentBanner, ConsentLayer, ConsentSetting });