149 lines
5.3 KiB
Svelte
149 lines
5.3 KiB
Svelte
<script>
|
|
import { onMount, tick } from 'svelte';
|
|
import './app.css';
|
|
|
|
// Importer les composants communs
|
|
import Header from './components/Header.svelte';
|
|
import Footer from './components/Footer.svelte';
|
|
import CookieConsent from './components/CookieConsent.svelte';
|
|
import { hasUserMadeCookieChoice, startAnonymousTracking, stopAnonymousTracking } from './lib/cookieService.js';
|
|
import { trackPageView } from './lib/analyticsService.js';
|
|
|
|
// Importer les pages
|
|
import Accueil from './pages/Accueil.svelte';
|
|
import Fonctionnalites from './pages/Fonctionnalites.svelte';
|
|
import Contact from './pages/Contact.svelte';
|
|
import PolitiqueConfidentialite from './pages/PolitiqueConfidentialite.svelte';
|
|
import ConditionsUtilisation from './pages/ConditionsUtilisation.svelte';
|
|
import MentionsLegales from './pages/MentionsLegales.svelte';
|
|
|
|
// État pour la page active
|
|
let activePage = 'accueil';
|
|
|
|
// État pour la modal des cookies
|
|
let showCookieConsent = false;
|
|
|
|
// Fonction pour gérer le changement de page basé sur le pathname
|
|
function handleRouteChange() {
|
|
// Extraire le pathname sans le premier slash
|
|
const path = window.location.pathname.slice(1) || 'accueil';
|
|
activePage = path || 'accueil';
|
|
|
|
// Suivre la page vue si l'utilisateur a accepté les cookies
|
|
trackPageView(activePage);
|
|
}
|
|
|
|
// Gérer le consentement aux cookies
|
|
function handleCookieConsent(event) {
|
|
if (event.detail.accepted) {
|
|
startAnonymousTracking();
|
|
} else {
|
|
stopAnonymousTracking();
|
|
}
|
|
showCookieConsent = false;
|
|
}
|
|
|
|
onMount(async () => {
|
|
// Initialiser la page active au chargement
|
|
handleRouteChange();
|
|
|
|
// Configurer le gestionnaire de navigation pour écouter les clics sur les liens
|
|
// et intercepter la navigation
|
|
document.addEventListener('click', (e) => {
|
|
// Trouver le plus proche élément <a> depuis la cible du clic
|
|
const link = e.target.closest('a');
|
|
|
|
// Si nous n'avons pas de lien ou si le lien est externe ou a un attribut target,
|
|
// laisser le navigateur gérer normalement
|
|
if (!link || !link.href.startsWith(window.location.origin) ||
|
|
link.target || link.hasAttribute('download') ||
|
|
link.getAttribute('rel') === 'external') {
|
|
return;
|
|
}
|
|
|
|
// Empêcher le comportement par défaut (navigation du navigateur)
|
|
e.preventDefault();
|
|
|
|
// Extraire le chemin relatif de l'URL
|
|
const url = new URL(link.href);
|
|
const path = url.pathname;
|
|
|
|
// Mettre à jour l'historique du navigateur sans recharger la page
|
|
window.history.pushState({}, '', path);
|
|
|
|
// Mettre à jour la page active
|
|
const pagePath = path.slice(1) || 'accueil';
|
|
activePage = pagePath;
|
|
|
|
// Suivre la page vue si l'utilisateur a accepté les cookies
|
|
trackPageView(activePage);
|
|
});
|
|
|
|
// Écouter les événements popstate (boutons retour/avant du navigateur)
|
|
window.addEventListener('popstate', handleRouteChange);
|
|
|
|
// Vérifier si l'utilisateur a déjà fait un choix pour les cookies
|
|
// Permettre au DOM de se charger complètement avant d'afficher la modale
|
|
await tick();
|
|
|
|
// Si l'utilisateur n'a pas encore fait de choix, afficher la modal
|
|
if (!hasUserMadeCookieChoice()) {
|
|
showCookieConsent = true;
|
|
} else {
|
|
// Si l'utilisateur a déjà accepté, démarrer le suivi
|
|
startAnonymousTracking();
|
|
// Si l'utilisateur a déjà refusé, s'assurer que le suivi est désactivé
|
|
stopAnonymousTracking();
|
|
}
|
|
|
|
// Nettoyer les écouteurs d'événement lors du démontage
|
|
return () => {
|
|
window.removeEventListener('popstate', handleRouteChange);
|
|
};
|
|
});
|
|
</script>
|
|
|
|
<div class="fixed inset-0 bg-gradient-to-t from-blue-900 to-white z-[-20]">
|
|
<div class="absolute inset-0 z-[-10]">
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
|
|
<pattern id="pattern-circles" x="0" y="0" width="50" height="50" patternUnits="userSpaceOnUse" patternContentUnits="userSpaceOnUse">
|
|
<circle id="pattern-circle" cx="10" cy="10" r="5" fill="#FFF" opacity="0.1"></circle>
|
|
</pattern>
|
|
<rect id="rect" x="0" y="0" width="100%" height="100%" fill="url(#pattern-circles)"></rect>
|
|
</svg>
|
|
</div>
|
|
</div>
|
|
|
|
<main class="flex flex-col min-h-screen relative" class:blur-effect={showCookieConsent}>
|
|
<Header />
|
|
|
|
<div class="flex-grow">
|
|
{#if activePage === 'accueil'}
|
|
<Accueil />
|
|
{:else if activePage === 'fonctionnalites'}
|
|
<Fonctionnalites />
|
|
{:else if activePage === 'contact'}
|
|
<Contact />
|
|
{:else if activePage === 'politique-confidentialite'}
|
|
<PolitiqueConfidentialite />
|
|
{:else if activePage === 'conditions-utilisation'}
|
|
<ConditionsUtilisation />
|
|
{:else if activePage === 'mentions-legales'}
|
|
<MentionsLegales />
|
|
{:else}
|
|
<!-- Page 404 simple -->
|
|
<div class="container mx-auto px-4 py-16 text-center">
|
|
<h1 class="text-4xl font-bold mb-4">Page non trouvée</h1>
|
|
<p class="mb-8">La page que vous recherchez n'existe pas.</p>
|
|
<a href="/accueil" class="bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded"> Retour à l'accueil </a>
|
|
</div>
|
|
{/if}
|
|
</div>
|
|
|
|
<Footer />
|
|
</main>
|
|
|
|
{#if showCookieConsent}
|
|
<CookieConsent on:consent={handleCookieConsent} />
|
|
{/if}
|