Files
landing/static/assets/js/cookie-consent.js
2026-03-12 16:31:58 -03:00

142 lines
4.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Cookie consent banner & third-party analytics loader
// - Stores preference in localStorage
// - Shows a bottom banner until user accepts or rejects
// - Loads Google Analytics and Microsoft Clarity only when accepted
(function () {
'use strict';
var STORAGE_KEY = 'mifi-ventures-cookie-consent';
var BANNER_ID = 'cookie-banner';
var BANNER_VISIBLE_CLASS = 'is-visible';
var hasLoadedThirdParty = false;
// Trusted Types support (for CSP `require-trusted-types-for 'script'`)
var ttPolicy = null;
try {
if (
window.trustedTypes &&
typeof window.trustedTypes.createPolicy === 'function'
) {
ttPolicy = window.trustedTypes.createPolicy('mifi-ventures-policy', {
createScriptURL: function (url) {
return url;
},
});
}
} catch (_) {
ttPolicy = null;
}
function setScriptSrc(el, url) {
if (!el) return;
if (ttPolicy) {
// When Trusted Types are enforced, wrap URLs via our policy
el.src = ttPolicy.createScriptURL(url);
} else {
el.src = url;
}
}
function loadThirdPartyAnalytics() {
if (hasLoadedThirdParty) return;
hasLoadedThirdParty = true;
// Google Analytics (gtag.js + ga-init.js)
try {
var gtagScript = document.createElement('script');
gtagScript.async = true;
setScriptSrc(
gtagScript,
'https://www.googletagmanager.com/gtag/js?id=G-36F29PDKRT',
);
gtagScript.onload = function () {
// Load the existing ga-init.js helper once gtag is ready
var gaInit = document.createElement('script');
gaInit.defer = true;
setScriptSrc(gaInit, '/assets/js/ga-init.js');
document.head.appendChild(gaInit);
};
document.head.appendChild(gtagScript);
} catch (e) {
// Fail silently analytics are non-essential
console.error('Failed to load Google Analytics', e);
}
// Microsoft Clarity
try {
var clarityScript = document.createElement('script');
clarityScript.defer = true;
setScriptSrc(clarityScript, 'https://www.clarity.ms/tag/vuo5q3yf79?ref=bwt');
document.head.appendChild(clarityScript);
} catch (e2) {
console.error('Failed to load Microsoft Clarity', e2);
}
}
function hideBanner(banner) {
if (!banner) return;
banner.classList.remove(BANNER_VISIBLE_CLASS);
}
function showBanner(banner) {
if (!banner) return;
banner.classList.add(BANNER_VISIBLE_CLASS);
}
function init() {
var banner = document.getElementById(BANNER_ID);
if (!banner) return;
var acceptBtn = banner.querySelector('[data-consent="accept"]');
var rejectBtn = banner.querySelector('[data-consent="reject"]');
var pref;
try {
pref = window.localStorage.getItem(STORAGE_KEY);
} catch (_) {
pref = null;
}
if (pref === 'accept') {
hideBanner(banner);
loadThirdPartyAnalytics();
} else if (pref === 'reject') {
hideBanner(banner);
} else {
showBanner(banner);
}
if (acceptBtn) {
acceptBtn.addEventListener('click', function () {
try {
window.localStorage.setItem(STORAGE_KEY, 'accept');
} catch (_) {
// ignore
}
hideBanner(banner);
loadThirdPartyAnalytics();
});
}
if (rejectBtn) {
rejectBtn.addEventListener('click', function () {
try {
window.localStorage.setItem(STORAGE_KEY, 'reject');
} catch (_) {
// ignore
}
hideBanner(banner);
});
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();