QrRapido/wwwroot/js/cookie-consent.js
2025-08-10 14:45:53 -03:00

182 lines
5.4 KiB
JavaScript

// Cookie Consent Manager for QR Rapido
class CookieConsentManager {
constructor() {
this.CONSENT_COOKIE = 'qrrapido_cookie_consent';
this.CONSENT_EXPIRY_DAYS = 365;
this.banner = null;
this.init();
}
init() {
// Wait for DOM to be ready
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => this.setup());
} else {
this.setup();
}
}
setup() {
this.banner = document.getElementById('cookie-consent-banner');
if (!this.banner) {
console.warn('Cookie consent banner not found');
return;
}
// Check if user has already given consent
if (!this.hasConsent()) {
this.showBanner();
}
// Setup event listeners
this.setupEventListeners();
}
setupEventListeners() {
const acceptAllBtn = document.getElementById('cookie-accept-all');
const acceptEssentialBtn = document.getElementById('cookie-accept-essential');
if (acceptAllBtn) {
acceptAllBtn.addEventListener('click', () => this.acceptAll());
}
if (acceptEssentialBtn) {
acceptEssentialBtn.addEventListener('click', () => this.acceptEssential());
}
}
hasConsent() {
const consent = this.getCookie(this.CONSENT_COOKIE);
return consent === 'all' || consent === 'essential';
}
acceptAll() {
this.setConsent('all');
this.enableAnalytics();
this.hideBanner();
console.log('✅ User accepted all cookies - Analytics enabled');
}
acceptEssential() {
this.setConsent('essential');
this.disableAnalytics();
this.hideBanner();
console.log('⚡ User accepted essential cookies only - Analytics disabled');
}
setConsent(type) {
const expiryDate = new Date();
expiryDate.setTime(expiryDate.getTime() + (this.CONSENT_EXPIRY_DAYS * 24 * 60 * 60 * 1000));
document.cookie = `${this.CONSENT_COOKIE}=${type}; expires=${expiryDate.toUTCString()}; path=/; SameSite=Lax`;
}
enableAnalytics() {
// Enable Google Analytics if gtag is available
if (typeof gtag !== 'undefined') {
gtag('consent', 'update', {
'analytics_storage': 'granted'
});
}
// Enable other tracking if needed
this.enableGoogleAnalytics();
}
disableAnalytics() {
// Disable Google Analytics
if (typeof gtag !== 'undefined') {
gtag('consent', 'update', {
'analytics_storage': 'denied'
});
}
// Clear existing analytics cookies
this.clearAnalyticsCookies();
}
enableGoogleAnalytics() {
// Google Analytics is already loaded in _Layout.cshtml
// This just ensures consent is properly granted
if (typeof gtag !== 'undefined') {
// Send a page view event to confirm analytics is working
gtag('event', 'cookie_consent_granted', {
'event_category': 'Cookie Consent',
'event_label': 'Analytics Enabled'
});
}
}
clearAnalyticsCookies() {
// Clear Google Analytics cookies
const gaCookies = ['_ga', '_gid', '_gat', '_gtag_GA_MEASUREMENT_ID'];
gaCookies.forEach(cookieName => {
// Clear for current domain
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/;`;
// Clear for parent domain
const domain = window.location.hostname.replace(/^www\./, '.');
document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${domain};`;
});
console.log('🧹 Analytics cookies cleared');
}
showBanner() {
if (this.banner) {
this.banner.style.display = 'block';
// Add body padding to prevent content overlap
document.body.style.paddingBottom = this.banner.offsetHeight + 'px';
}
}
hideBanner() {
if (this.banner) {
this.banner.classList.add('hidden');
// Remove body padding
document.body.style.paddingBottom = '0';
setTimeout(() => {
this.banner.style.display = 'none';
this.banner.classList.remove('hidden');
}, 300);
}
}
getCookie(name) {
const nameEQ = name + '=';
const ca = document.cookie.split(';');
for (let i = 0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) === ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
}
return null;
}
// Public method to check consent status
getConsentStatus() {
return this.getCookie(this.CONSENT_COOKIE);
}
// Public method to revoke consent (for privacy settings)
revokeConsent() {
document.cookie = `${this.CONSENT_COOKIE}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/;`;
this.clearAnalyticsCookies();
this.showBanner();
}
}
// Initialize cookie consent manager
const cookieConsent = new CookieConsentManager();
// Make it globally available for debugging/manual control
window.cookieConsent = cookieConsent;