"use strict"; document.addEventListener("DOMContentLoaded", () => { /* ========================================================= CONFIGURATION ========================================================= */ const COOKIE_CONSENT_KEY = "ammanaura-cookie-consent"; /* * Augmenter cette version permet de redemander * le consentement si le système évolue. */ const COOKIE_CONSENT_VERSION = "2"; /* * Durée de validité du choix : * 6 mois. */ const CONSENT_DURATION_DAYS = 180; const CONSENT_DURATION_MS = CONSENT_DURATION_DAYS * 24 * 60 * 60 * 1000; /* ========================================================= INITIALISATION ========================================================= */ createCookieBanner(); createCookieSettingsButton(); const existingConsent = readConsent(); applyConsent(existingConsent); if (!existingConsent) { openCookieBanner(false); } /* ========================================================= CRÉATION DU BANDEAU ========================================================= */ function createCookieBanner() { if (document.querySelector("#cookie-banner")) { return; } const banner = document.createElement("section"); banner.id = "cookie-banner"; banner.className = "cookie-banner"; banner.setAttribute( "aria-label", "Gestion de vos préférences" ); banner.setAttribute( "aria-hidden", "true" ); banner.innerHTML = ` `; document.body.appendChild(banner); const acceptButton = banner.querySelector( "#cookie-accept-button" ); const rejectButton = banner.querySelector( "#cookie-reject-button" ); acceptButton?.addEventListener( "click", () => { saveConsent("accepted"); applyConsent("accepted"); closeCookieBanner(); } ); rejectButton?.addEventListener( "click", () => { saveConsent("rejected"); applyConsent("rejected"); closeCookieBanner(); } ); } /* ========================================================= BOUTON "COOKIES" ========================================================= */ function createCookieSettingsButton() { if ( document.querySelector( "#cookie-settings-button" ) ) { return; } const button = document.createElement("button"); button.id = "cookie-settings-button"; button.className = "cookie-settings-button"; button.type = "button"; button.textContent = "Cookies"; button.setAttribute( "aria-label", "Modifier mes préférences de cookies" ); button.addEventListener( "click", () => { openCookieBanner(true); } ); document.body.appendChild(button); } /* ========================================================= OUVERTURE DU BANDEAU ========================================================= */ function openCookieBanner( focusBanner = true ) { const banner = document.querySelector( "#cookie-banner" ); if (!banner) { return; } banner.classList.add( "is-visible" ); banner.setAttribute( "aria-hidden", "false" ); if (focusBanner) { const firstButton = banner.querySelector( "button" ); firstButton?.focus(); } } /* ========================================================= FERMETURE DU BANDEAU ========================================================= */ function closeCookieBanner() { const banner = document.querySelector( "#cookie-banner" ); if (!banner) { return; } banner.classList.remove( "is-visible" ); banner.setAttribute( "aria-hidden", "true" ); const settingsButton = document.querySelector( "#cookie-settings-button" ); if ( settingsButton instanceof HTMLElement ) { settingsButton.focus(); } } /* ========================================================= ENREGISTREMENT DU CHOIX ========================================================= */ function saveConsent(value) { if ( ![ "accepted", "rejected" ].includes(value) ) { return; } const now = Date.now(); const consent = { version: COOKIE_CONSENT_VERSION, value, updatedAt: new Date(now).toISOString(), expiresAt: new Date( now + CONSENT_DURATION_MS ).toISOString() }; try { localStorage.setItem( COOKIE_CONSENT_KEY, JSON.stringify(consent) ); } catch (error) { console.warn( "Impossible d’enregistrer les préférences Ammanaura.", error ); } } /* ========================================================= LECTURE DU CHOIX ========================================================= */ function readConsent() { let storedValue = null; try { storedValue = localStorage.getItem( COOKIE_CONSENT_KEY ); } catch (error) { console.warn( "Impossible de lire les préférences Ammanaura.", error ); return null; } if (!storedValue) { return null; } try { const consent = JSON.parse(storedValue); /* * Vérification de la structure. */ if ( typeof consent !== "object" || consent === null ) { removeStoredConsent(); return null; } /* * Vérification de la version. */ if ( consent.version !== COOKIE_CONSENT_VERSION ) { removeStoredConsent(); return null; } /* * Vérification de la valeur. */ if ( ![ "accepted", "rejected" ].includes( consent.value ) ) { removeStoredConsent(); return null; } /* * Vérification de l'expiration. */ if (!consent.expiresAt) { removeStoredConsent(); return null; } const expirationDate = new Date( consent.expiresAt ); if ( Number.isNaN( expirationDate.getTime() ) ) { removeStoredConsent(); return null; } if ( Date.now() >= expirationDate.getTime() ) { removeStoredConsent(); return null; } return consent.value; } catch (error) { console.warn( "Préférences Ammanaura invalides.", error ); removeStoredConsent(); return null; } } /* ========================================================= SUPPRESSION DU CHOIX ========================================================= */ function removeStoredConsent() { try { localStorage.removeItem( COOKIE_CONSENT_KEY ); } catch (error) { console.warn( "Impossible de supprimer les préférences Ammanaura.", error ); } } /* ========================================================= APPLICATION DU CONSENTEMENT ========================================================= */ function applyConsent( consentValue ) { const validValue = [ "accepted", "rejected" ].includes( consentValue ) ? consentValue : "pending"; document.documentElement.dataset.cookieConsent = validValue; /* * ===================================================== * IMPORTANT * ===================================================== * * Aucun outil publicitaire ou outil de mesure * d'audience n'est actuellement activé. * * Si un service nécessitant un consentement * est ajouté plus tard, il devra être chargé * uniquement lorsque : * * validValue === "accepted" * * Exemple : * * if (validValue === "accepted") { * loadAnalytics(); * } * * Ne pas ajouter un outil de suivi directement * dans le HTML sans passer par la gestion * du consentement. */ } /* ========================================================= TOUCHE ÉCHAP ========================================================= */ document.addEventListener( "keydown", (event) => { if ( event.key !== "Escape" ) { return; } const banner = document.querySelector( "#cookie-banner" ); if ( !banner || !banner.classList.contains( "is-visible" ) ) { return; } /* * On autorise la fermeture avec Échap * uniquement lorsqu'un choix existe déjà. * * Lors de la première visite, * l'utilisateur doit choisir. */ const existingChoice = readConsent(); if (existingChoice) { closeCookieBanner(); } } ); });