Incognito-Wiki/public/matomo-consent.js

135 lines
4.4 KiB
JavaScript

(function initializeAnalyticsConsent(window, document) {
'use strict';
var storageKey = 'incognito.analytics-consent.v1';
var accepted = 'accepted';
var declined = 'declined';
var trackerOrigin = 'https://analytics.msvincognito.nl/';
if (window.__incognitoMatomoConsentController) return;
window.__incognitoMatomoConsentController = true;
function readDecision() {
try {
var value = window.localStorage.getItem(storageKey);
return value === accepted || value === declined ? value : null;
} catch (_error) {
return null;
}
}
function writeDecision(value) {
try {
window.localStorage.setItem(storageKey, value);
} catch (_error) {
// Consent applies to this page load only when browser storage is unavailable.
}
}
function initializeMatomo() {
var queue = window._paq = window._paq || [];
if (window.__incognitoMatomoInitialized) return;
window.__incognitoMatomoInitialized = true;
queue.push(['requireConsent']);
queue.push(['disableCookies']);
queue.push(['setConsentGiven']);
queue.push(['setTrackerUrl', trackerOrigin + 'matomo.php']);
queue.push(['setSiteId', '1']);
queue.push(['trackPageView']);
queue.push(['enableLinkTracking']);
var tracker = document.createElement('script');
tracker.id = 'incognito-matomo-script';
tracker.async = true;
tracker.src = trackerOrigin + 'matomo.js';
document.head.appendChild(tracker);
}
function createButton(id, label) {
var button = document.createElement('button');
button.id = id;
button.className = 'incognito-consent-action';
button.type = 'button';
button.textContent = label;
return button;
}
var banner = document.createElement('section');
banner.id = 'incognito-analytics-consent';
banner.setAttribute('role', 'dialog');
banner.setAttribute('aria-labelledby', 'incognito-analytics-consent-title');
banner.setAttribute('aria-describedby', 'incognito-analytics-consent-description');
banner.innerHTML =
'<div class="incognito-consent-copy">' +
'<h2 id="incognito-analytics-consent-title">Privacy-friendly analytics</h2>' +
'<p id="incognito-analytics-consent-description">MSV Incognito would like to use cookieless Matomo analytics to understand how the wiki is used. Nothing is sent to Matomo unless you accept. You can change your choice at any time.</p>' +
'<a href="https://msvincognito.nl/privacy-policy">Read our privacy policy</a>' +
'</div>';
var actions = document.createElement('div');
actions.className = 'incognito-consent-actions';
var acceptButton = createButton('incognito-analytics-accept', 'Accept analytics');
var declineButton = createButton('incognito-analytics-decline', 'Decline');
actions.appendChild(acceptButton);
actions.appendChild(declineButton);
banner.appendChild(actions);
var settingsButton = document.createElement('button');
settingsButton.id = 'incognito-privacy-settings';
settingsButton.type = 'button';
settingsButton.textContent = 'Privacy settings';
function showBanner(moveFocus) {
banner.hidden = false;
settingsButton.hidden = true;
if (moveFocus) acceptButton.focus();
}
function hideBanner(restoreFocus) {
banner.hidden = true;
settingsButton.hidden = false;
if (restoreFocus) settingsButton.focus();
}
acceptButton.addEventListener('click', function acceptAnalytics() {
if (banner.hidden) return;
writeDecision(accepted);
if (window.__incognitoMatomoInitialized) {
window._paq.push(['setConsentGiven']);
window._paq.push(['trackPageView']);
} else {
initializeMatomo();
}
hideBanner(true);
});
declineButton.addEventListener('click', function declineAnalytics() {
if (banner.hidden) return;
writeDecision(declined);
if (window._paq) {
window._paq.push(['forgetConsentGiven']);
window._paq.push(['deleteCookies']);
}
hideBanner(true);
});
settingsButton.addEventListener('click', function openPrivacySettings() {
showBanner(true);
});
document.body.appendChild(banner);
document.body.appendChild(settingsButton);
var decision = readDecision();
if (decision === accepted) {
banner.hidden = true;
settingsButton.hidden = false;
initializeMatomo();
} else if (decision === declined) {
banner.hidden = true;
settingsButton.hidden = false;
} else {
showBanner(false);
}
})(window, document);