Le popup de confidentialité réapparaissait systématiquement après chaque déconnexion/reconnexion car localStorage.clear() supprimait la clé 'odentas_info_suivi_ack_v1'. Solution: Sauvegarder et restaurer cette clé lors du nettoyage du localStorage dans LogoutButton.tsx. Fixes: Popup s'affiche plusieurs fois par jour au lieu d'une seule fois
6.7 KiB
Popup d'Information sur la Confidentialité
Documentation du popup d'information sur la confidentialité et le suivi affiché aux utilisateurs.
📍 Localisation
Le popup s'affiche en bas à gauche de l'écran sur toutes les pages de l'Espace Paie.
🎯 Fonctionnement
Affichage
- Le popup apparaît 1,2 seconde après le chargement de la page
- Il s'affiche avec une animation fluide (spring animation)
- Il est non intrusif et peut être fermé facilement
Persistance
Le popup utilise le localStorage du navigateur pour se souvenir que l'utilisateur l'a déjà vu :
- Clé de stockage :
odentas_info_suivi_ack_v1 - Valeur :
"1"quand l'utilisateur a cliqué sur "J'ai compris" - Le popup ne s'affiche qu'une seule fois par navigateur
Réaffichage
Pour forcer le réaffichage du popup (utile pour les tests ou après une mise à jour) :
- Ouvrir la console du navigateur (F12)
- Exécuter :
localStorage.removeItem('odentas_info_suivi_ack_v1') - Rafraîchir la page
Ou changer la version dans le code : storageKey = "odentas_info_suivi_ack_v2"
📝 Contenu
Message principal
Transparence & confidentialité
L'Espace Paie Odentas utilise des cookies essentiels pour votre authentification
et votre sécurité, ainsi qu'un outil d'analyse (PostHog) pour améliorer
nos services. Vos données sont hébergées en France 🇫🇷 et ne sont jamais
revendues. En utilisant l'Espace Paie, vous acceptez notre Politique de
Confidentialité.
Actions disponibles
- "J'ai compris" - Ferme le popup et enregistre l'acceptation
- "En savoir plus" - Ouvre la politique de confidentialité dans un nouvel onglet
- Bouton X - Ferme le popup sans enregistrer (il réapparaîtra au prochain chargement)
🎨 Design
Style visuel
- Position : Fixed, bas gauche (left-4 bottom-4)
- Taille : 384px max-width (responsive sur mobile)
- Arrière-plan : Gradient blanc vers gris avec backdrop blur
- Bordure : Border slate-200
- Ombre : Shadow-lg
- Icône : ShieldCheck en bleu (sky-700)
Animation
- Type : Spring animation
- Stiffness : 380
- Damping : 28
- Effet : Apparition en fondu avec légère translation verticale et scale
Responsive
- Desktop : 384px de largeur
- Mobile : 92vw (92% de la largeur de l'écran)
- S'adapte automatiquement à la taille de l'écran
🔧 Intégration technique
Fichiers
- Composant :
components/PopupInfoSuivi.tsx - Intégration :
app/layout.tsx(layout racine)
Dépendances
- framer-motion - Pour les animations fluides
- lucide-react - Pour les icônes (ShieldCheck, X)
- React hooks - useState, useEffect
Props
{
policyUrl?: string; // URL de la politique de confidentialité
// Par défaut: "/politique-confidentialite"
storageKey?: string; // Clé localStorage pour la persistance
// Par défaut: "odentas_info_suivi_ack_v1"
}
Utilisation
import PopupInfoSuivi from "@/components/PopupInfoSuivi";
// Dans le layout ou une page
<PopupInfoSuivi policyUrl="/politique-confidentialite" />
🔒 Conformité RGPD
Le popup informe les utilisateurs de :
- ✅ L'utilisation de cookies essentiels (authentification, sécurité)
- ✅ L'utilisation d'un outil d'analyse (PostHog)
- ✅ L'hébergement des données en France 🇫🇷
- ✅ La non-revente des données personnelles
- ✅ Le lien vers la politique de confidentialité complète
🎯 Bonnes pratiques
UX
- Non bloquant : L'utilisateur peut continuer à naviguer
- Discret : Petit format en bas à gauche
- Clair : Message court et compréhensible
- Actions simples : 2 boutons principaux
Accessibilité
- role="dialog" - Indique qu'il s'agit d'une boîte de dialogue
- aria-live="polite" - Annonce le contenu aux lecteurs d'écran
- aria-label - Décrit le contenu du popup
- Focus trap - Non implémenté car non bloquant
Performance
- Lazy loading : Le popup ne se charge qu'après 1,2 seconde
- Lightweight : Code minimal et optimisé
- Exit animation : Animation de sortie fluide
🧪 Tests
Test manuel
- Ouvrir l'Espace Paie en navigation privée
- Vérifier que le popup apparaît après 1,2 seconde
- Cliquer sur "J'ai compris"
- Rafraîchir la page
- Vérifier que le popup ne réapparaît pas
Test responsive
- Ouvrir en mode mobile (DevTools)
- Vérifier que le popup s'adapte à la largeur
- Vérifier la lisibilité sur petit écran
Test accessibilité
- Tester avec un lecteur d'écran
- Naviguer au clavier (Tab, Enter)
- Vérifier les labels ARIA
📊 Statistiques d'utilisation
Pour suivre l'utilisation du popup avec PostHog :
- Événement d'affichage : Peut être ajouté dans useEffect
- Événement de clic "J'ai compris" : Peut être ajouté dans acknowledge()
- Événement de fermeture (X) : Peut être ajouté dans setOpen(false)
🔄 Mises à jour futures
Possibles améliorations
- Multi-langues - Ajouter support i18n
- Personnalisation - Adapter le message selon le rôle (staff/client)
- Analytics - Tracker les interactions avec PostHog
- A/B testing - Tester différentes variantes du message
- Animations avancées - Ajouter des micro-interactions
Versions
- v1 (actuelle) - Version initiale avec message de confidentialité
- v2 (future) - Ajout d'analytics et personnalisation
🐛 Dépannage
Le popup ne s'affiche pas
- Vérifier que framer-motion est installé :
npm list framer-motion - Vérifier la console pour les erreurs JS
- Vérifier le localStorage :
localStorage.getItem('odentas_info_suivi_ack_v1')
Le popup réapparaît alors qu'il a été fermé
- L'utilisateur a peut-être cliqué sur X au lieu de "J'ai compris"
- Le localStorage a été effacé (navigation privée, clear cookies)
- Vérifier que la clé de stockage n'a pas changé
⚠️ Bug corrigé (décembre 2024) : Le popup réapparaissait à chaque déconnexion/reconnexion car le LogoutButton appelait localStorage.clear(), ce qui supprimait la clé odentas_info_suivi_ack_v1. Solution : sauvegarder et restaurer cette clé lors du nettoyage du localStorage.
Animation saccadée
- Vérifier la version de framer-motion
- Désactiver les extensions de navigateur qui peuvent bloquer les animations
- Tester sur un autre navigateur