Dorian Niemiec
8afbb6ae44
Some checks failed
Deploy Next.js application / deploy (push) Has been cancelled
230 lines
8.1 KiB
JavaScript
230 lines
8.1 KiB
JavaScript
"use client";
|
|
import ReactMarkdown from "react-markdown";
|
|
import { privacyPolicy } from "@/constants/guidelines";
|
|
import { useEffect } from "react";
|
|
|
|
function matomoOptOutPlugin() {
|
|
return (tree) => {
|
|
const paragraph = tree.children.find(
|
|
(node) =>
|
|
node.type === "element" &&
|
|
node.tagName == "p" &&
|
|
node.children[0].value === "MATOMOOPTOUT"
|
|
);
|
|
|
|
if (paragraph) {
|
|
const div = {
|
|
type: "element",
|
|
tagName: "div",
|
|
properties: {
|
|
id: "matomo-opt-out"
|
|
},
|
|
children: []
|
|
};
|
|
|
|
tree.children.splice(tree.children.indexOf(paragraph), 1, div);
|
|
}
|
|
};
|
|
}
|
|
|
|
function Contribute() {
|
|
useEffect(() => {
|
|
const settings = {
|
|
showIntro: true,
|
|
divId: "matomo-opt-out",
|
|
useSecureCookies: true,
|
|
cookiePath: null,
|
|
cookieDomain: null,
|
|
cookieSameSite: "Lax",
|
|
OptOutComplete:
|
|
"Opt-out complete; your visits to this website will not be recorded by the Web Analytics tool.",
|
|
OptOutCompleteBis:
|
|
"Note that if you clear your cookies, delete the opt-out cookie, or if you change computers or Web browsers, you will need to perform the opt-out procedure again.",
|
|
YouMayOptOut2:
|
|
"You may choose to prevent this website from aggregating and analyzing the actions you take here.",
|
|
YouMayOptOut3:
|
|
"Doing so will protect your privacy, but will also prevent the owner from learning from your actions and creating a better experience for you and other users.",
|
|
OptOutErrorNoCookies:
|
|
"The tracking opt-out feature requires cookies to be enabled.",
|
|
OptOutErrorNotHttps:
|
|
"The tracking opt-out feature may not work because this site was not loaded over HTTPS. Please reload the page to check if your opt out status changed.",
|
|
YouAreNotOptedOut: "You are not opted out.",
|
|
UncheckToOptOut: "Uncheck this box to opt-out.",
|
|
YouAreOptedOut: "You are currently opted out.",
|
|
CheckToOptIn: "Check this box to opt-in."
|
|
};
|
|
|
|
window.showContent = function (
|
|
consent,
|
|
errorMessage = null,
|
|
useTracker = false
|
|
) {
|
|
const errorBlock = '<p style="color: red; font-weight: bold;">';
|
|
|
|
const div = document.getElementById(settings.divId);
|
|
if (!div) {
|
|
const warningDiv = document.createElement("div");
|
|
const msg = `Unable to find opt-out content div: "${settings.divId}"`;
|
|
warningDiv.id = `${settings.divId}-warning`;
|
|
warningDiv.innerHTML = `${errorBlock}${msg}</p>`;
|
|
document.body.insertBefore(warningDiv, document.body.firstChild);
|
|
console.log(msg);
|
|
return;
|
|
}
|
|
|
|
if (!navigator || !navigator.cookieEnabled) {
|
|
div.innerHTML = `${errorBlock}${settings.OptOutErrorNoCookies}</p>`;
|
|
return;
|
|
}
|
|
|
|
if (errorMessage !== null) {
|
|
div.innerHTML = `${errorBlock}${errorMessage}</p>`;
|
|
return;
|
|
}
|
|
|
|
let content = "";
|
|
|
|
if (location.protocol !== "https:") {
|
|
content += `${errorBlock}${settings.OptOutErrorNotHttps}</p>`;
|
|
}
|
|
|
|
if (consent) {
|
|
if (settings.showIntro) {
|
|
content += `<p>${settings.YouMayOptOut2} ${settings.YouMayOptOut3}</p>`;
|
|
}
|
|
if (useTracker) {
|
|
content +=
|
|
'<input onclick="_paq.push([\'optUserOut\']);showContent(false, null, true);" id="trackVisits" type="checkbox" checked="checked" />';
|
|
} else {
|
|
content +=
|
|
'<input onclick="window.MatomoConsent.consentRevoked();showContent(false);" id="trackVisits" type="checkbox" checked="checked" />';
|
|
}
|
|
content += `<label for="trackVisits"><strong><span>${settings.YouAreNotOptedOut} ${settings.UncheckToOptOut}</span></strong></label>`;
|
|
} else {
|
|
if (settings.showIntro) {
|
|
content += `<p>${settings.OptOutComplete} ${settings.OptOutCompleteBis}</p>`;
|
|
}
|
|
if (useTracker) {
|
|
content +=
|
|
'<input onclick="_paq.push([\'forgetUserOptOut\']);showContent(true, null, true);" id="trackVisits" type="checkbox" />';
|
|
} else {
|
|
content +=
|
|
'<input onclick="window.MatomoConsent.consentGiven();showContent(true);" id="trackVisits" type="checkbox" />';
|
|
}
|
|
content += `<label for="trackVisits"><strong><span>${settings.YouAreOptedOut} ${settings.CheckToOptIn}</span></strong></label>`;
|
|
}
|
|
div.innerHTML = content;
|
|
};
|
|
|
|
window.MatomoConsent = {
|
|
cookiesDisabled: !navigator || !navigator.cookieEnabled,
|
|
CONSENT_COOKIE_NAME: "mtm_consent",
|
|
CONSENT_REMOVED_COOKIE_NAME: "mtm_consent_removed",
|
|
cookieIsSecure: false,
|
|
useSecureCookies: true,
|
|
cookiePath: "",
|
|
cookieDomain: "",
|
|
cookieSameSite: "Lax",
|
|
init: function (
|
|
useSecureCookies,
|
|
cookiePath,
|
|
cookieDomain,
|
|
cookieSameSite
|
|
) {
|
|
this.useSecureCookies = useSecureCookies;
|
|
this.cookiePath = cookiePath;
|
|
this.cookieDomain = cookieDomain;
|
|
this.cookieSameSite = cookieSameSite;
|
|
if (useSecureCookies && location.protocol !== "https:") {
|
|
console.log(
|
|
"Error with setting useSecureCookies: You cannot use this option on http."
|
|
);
|
|
} else {
|
|
this.cookieIsSecure = useSecureCookies;
|
|
}
|
|
},
|
|
hasConsent: function () {
|
|
const consentCookie = this.getCookie(this.CONSENT_COOKIE_NAME);
|
|
const removedCookie = this.getCookie(this.CONSENT_REMOVED_COOKIE_NAME);
|
|
if (!consentCookie && !removedCookie) {
|
|
return true; // No cookies set, so opted in
|
|
}
|
|
if (removedCookie && consentCookie) {
|
|
this.setCookie(this.CONSENT_COOKIE_NAME, "", -129600000);
|
|
return false;
|
|
}
|
|
return consentCookie || consentCookie !== 0;
|
|
},
|
|
consentGiven: function () {
|
|
this.setCookie(this.CONSENT_REMOVED_COOKIE_NAME, "", -129600000);
|
|
this.setCookie(
|
|
this.CONSENT_COOKIE_NAME,
|
|
new Date().getTime(),
|
|
946080000000
|
|
);
|
|
},
|
|
consentRevoked: function () {
|
|
this.setCookie(this.CONSENT_COOKIE_NAME, "", -129600000);
|
|
this.setCookie(
|
|
this.CONSENT_REMOVED_COOKIE_NAME,
|
|
new Date().getTime(),
|
|
946080000000
|
|
);
|
|
},
|
|
getCookie: function (cookieName) {
|
|
const cookiePattern = new RegExp("(^|;)[ ]*" + cookieName + "=([^;]*)");
|
|
const cookieMatch = cookiePattern.exec(document.cookie);
|
|
return cookieMatch ? window.decodeURIComponent(cookieMatch[2]) : 0;
|
|
},
|
|
setCookie: function (cookieName, value, msToExpire) {
|
|
const expiryDate = new Date();
|
|
expiryDate.setTime(new Date().getTime() + msToExpire);
|
|
document.cookie =
|
|
cookieName +
|
|
"=" +
|
|
window.encodeURIComponent(value) +
|
|
(msToExpire ? ";expires=" + expiryDate.toGMTString() : "") +
|
|
";path=" +
|
|
(this.cookiePath || "/") +
|
|
(this.cookieDomain ? ";domain=" + this.cookieDomain : "") +
|
|
(this.cookieIsSecure ? ";secure" : "") +
|
|
";SameSite=" +
|
|
this.cookieSameSite;
|
|
if (
|
|
(!msToExpire || msToExpire >= 0) &&
|
|
this.getCookie(cookieName) !== String(value)
|
|
) {
|
|
console.log(
|
|
`There was an error setting cookie \`${cookieName}\`. Please check domain and path.`
|
|
);
|
|
}
|
|
}
|
|
};
|
|
|
|
window.MatomoConsent.init(
|
|
settings.useSecureCookies,
|
|
settings.cookiePath,
|
|
settings.cookieDomain,
|
|
settings.cookieSameSite
|
|
);
|
|
showContent(window.MatomoConsent.hasConsent());
|
|
}, []);
|
|
|
|
return (
|
|
<main className="max-w-screen-xl mx-auto px-4 py-6 md:py-28 gap-2 flex flex-col">
|
|
<h1 className="text-3xl md:text-5xl pb-1 md:pb-2 font-bold">
|
|
Privacy Policy
|
|
</h1>
|
|
<p className="md:text-lg text-muted-foreground text-start mb-6">
|
|
Effective date: November 7, 2024
|
|
</p>
|
|
<div className="prose prose-a:text-primary max-w-full md:prose-lg dark:prose-invert">
|
|
<ReactMarkdown rehypePlugins={[matomoOptOutPlugin]}>
|
|
{privacyPolicy}
|
|
</ReactMarkdown>
|
|
</div>
|
|
</main>
|
|
);
|
|
}
|
|
|
|
export default Contribute;
|