Files
HexaHost-Web-Prod/public/assets/js/cookie-consent.js

211 lines
6.9 KiB
JavaScript

(function () {
"use strict";
const CONSENT_COOKIE_NAME = "hexahost_cookie_consent";
const CONSENT_DAYS = 365;
const cookieBanner = document.getElementById("cookieConsent");
const settingsPanel = document.getElementById("cookieSettingsPanel");
const acceptAllButton = document.getElementById("cookieAcceptAll");
const acceptEssentialButton = document.getElementById("cookieAcceptEssential");
const settingsButton = document.getElementById("cookieSettings");
const saveSettingsButton = document.getElementById("cookieSaveSettings");
const closeSettingsButton = document.getElementById("cookieCloseSettings");
const analyticsCheckbox = document.getElementById("cookieAnalytics");
const marketingCheckbox = document.getElementById("cookieMarketing");
const cookieStore = {
set: function (name, value, days) {
const expiresDate = new Date();
expiresDate.setTime(expiresDate.getTime() + days * 24 * 60 * 60 * 1000);
const expiresString = "expires=" + expiresDate.toUTCString();
document.cookie = name + "=" + JSON.stringify(value) + ";" + expiresString + ";path=/;SameSite=Lax;Secure";
},
get: function (name) {
const prefix = name + "=";
const cookies = document.cookie.split(";");
for (let index = 0; index < cookies.length; index++) {
let cookie = cookies[index].trim();
if (cookie.indexOf(prefix) === 0) {
try {
return JSON.parse(cookie.substring(prefix.length));
} catch (parseError) {
return null;
}
}
}
return null;
},
delete: function (name) {
document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;";
}
};
const cookieConsentManager = {
defaultConsent: {
essential: true,
analytics: false,
marketing: false,
timestamp: null
},
init: function () {
if (!cookieBanner) {
return;
}
const storedConsent = this.getConsent();
if (storedConsent && storedConsent.timestamp) {
this.hideBanner();
this.applyConsent(storedConsent);
} else {
this.showBanner();
}
this.bindEvents();
},
bindEvents: function () {
if (acceptAllButton) {
acceptAllButton.addEventListener("click", () => this.acceptAll());
}
if (acceptEssentialButton) {
acceptEssentialButton.addEventListener("click", () => this.acceptEssential());
}
if (settingsButton) {
settingsButton.addEventListener("click", () => this.showSettings());
}
if (saveSettingsButton) {
saveSettingsButton.addEventListener("click", () => this.saveSettings());
}
if (closeSettingsButton) {
closeSettingsButton.addEventListener("click", () => this.hideSettings());
}
document.addEventListener("keydown", event => {
if (event.key === "Escape" && settingsPanel && settingsPanel.style.display !== "none") {
this.hideSettings();
}
});
},
acceptAll: function () {
const allConsent = {
essential: true,
analytics: true,
marketing: true,
timestamp: new Date().toISOString()
};
this.saveConsent(allConsent);
this.hideBanner();
this.applyConsent(allConsent);
this.showNotification("Alle Cookies wurden akzeptiert.", "success");
},
acceptEssential: function () {
const essentialConsent = {
essential: true,
analytics: false,
marketing: false,
timestamp: new Date().toISOString()
};
this.saveConsent(essentialConsent);
this.hideBanner();
this.applyConsent(essentialConsent);
this.showNotification("Nur notwendige Cookies wurden akzeptiert.", "info");
},
saveSettings: function () {
const customConsent = {
essential: true,
analytics: analyticsCheckbox ? analyticsCheckbox.checked : false,
marketing: marketingCheckbox ? marketingCheckbox.checked : false,
timestamp: new Date().toISOString()
};
this.saveConsent(customConsent);
this.hideSettings();
this.hideBanner();
this.applyConsent(customConsent);
this.showNotification("Cookie-Einstellungen wurden gespeichert.", "success");
},
saveConsent: function (consent) {
cookieStore.set(CONSENT_COOKIE_NAME, consent, CONSENT_DAYS);
},
getConsent: function () {
return cookieStore.get(CONSENT_COOKIE_NAME);
},
applyConsent: function (consent) {
const eventPayload = {
detail: consent
};
window.dispatchEvent(new CustomEvent("cookieConsentUpdated", eventPayload));
if (consent.analytics) {
this.enableAnalytics();
} else {
this.disableAnalytics();
}
if (consent.marketing) {
this.enableMarketing();
} else {
this.disableMarketing();
}
},
enableAnalytics: function () {
console.log("Analytics enabled");
},
disableAnalytics: function () {
console.log("Analytics disabled");
},
enableMarketing: function () {
console.log("Marketing enabled");
},
disableMarketing: function () {
console.log("Marketing disabled");
},
showBanner: function () {
if (cookieBanner) {
cookieBanner.classList.remove("hide");
cookieBanner.classList.add("show");
cookieBanner.setAttribute("aria-hidden", "false");
setTimeout(() => {
if (acceptAllButton) {
acceptAllButton.focus();
}
}, 100);
}
},
hideBanner: function () {
if (cookieBanner) {
cookieBanner.classList.remove("show");
cookieBanner.classList.add("hide");
cookieBanner.setAttribute("aria-hidden", "true");
}
},
showSettings: function () {
if (settingsPanel) {
const savedConsent = this.getConsent() || this.defaultConsent;
if (analyticsCheckbox) {
analyticsCheckbox.checked = savedConsent.analytics;
}
if (marketingCheckbox) {
marketingCheckbox.checked = savedConsent.marketing;
}
settingsPanel.style.display = "block";
settingsPanel.setAttribute("aria-hidden", "false");
}
},
hideSettings: function () {
if (settingsPanel) {
settingsPanel.style.display = "none";
settingsPanel.setAttribute("aria-hidden", "true");
}
},
showNotification: function (message, type) {
if (window.HexaHost && typeof window.HexaHost.showNotification === "function") {
window.HexaHost.showNotification(message, type);
}
},
resetConsent: function () {
cookieStore.delete(CONSENT_COOKIE_NAME);
this.showBanner();
if (settingsPanel) {
settingsPanel.style.display = "none";
}
}
};
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", () => cookieConsentManager.init());
} else {
cookieConsentManager.init();
}
window.CookieConsent = cookieConsentManager;
})();