Application web moderne pour la gestion de l’enrôlement et de l’identification biométrique des citoyens au Sénégal 🇸🇳
"La sécurité en un regard"
- Framework : React 18 + TypeScript
- Outil de build : Vite
- Styling : Tailwind CSS (via
@tailwindcss/vite) - Gestion d’état : Zustand (avec persistance)
- Routing : React Router DOM v6
- Formulaires : React Hook Form + Zod
- Icônes : Heroicons
- Animations : Framer Motion
- Requêtes : TanStack React Query
- Tests : Vitest
- Storybook : Développement de composants isolés
src/
├── components/ # Composants UI réutilisables
│ ├── Button.tsx
│ ├── Layout.tsx # Layout principal avec navigation
│ └── ...
├── pages/ # Pages correspondant aux routes
│ ├── Login.tsx # Connexion opérateur
│ ├── Dashboard.tsx # Tableau de bord
│ ├── enrollment/ # Assistant d'enrôlement (wizard)
│ │ ├── EnrollmentData.tsx # Données personnelles
│ │ ├── EnrollmentPhoto.tsx # Capture photo + upload Supabase
│ │ ├── EnrollmentIris.tsx # Scan iris réaliste (9 étapes)
│ │ └── EnrollmentSuccess.tsx # Confirmation + CNI générée
│ ├── Identification.tsx # Identification biométrique
│ ├── CitizensList.tsx
│ ├── CitizenDetail.tsx
│ ├── History.tsx
│ └── Settings.tsx
├── store/ # Gestion d’état global
│ └── authStore.ts # État d’authentification (session Supabase)
├── types/ # Définitions TypeScript
│ └── idCard.ts # Types citoyen, CNI, etc.
├── utils/ # Fonctions utilitaires
│ ├── senegalUtils.ts # Générateurs de données sénégalaises (noms, régions, CNI)
│ └── idCardGenerator.ts
├── constants/ # Constantes de l’application
│ └── cniPixels.ts # Positions pour génération de carte d’identité
└── App.tsx # Configuration des routes
- Connexion via Supabase Auth (email + mot de passe)
- Session persistante grâce à Zustand + Supabase auth state listener
- Utilisateur demo :
demo@eyedentify.sn/eyedentify2025(créé dans Supabase Dashboard)
- Assistant multi-étapes :
- Saisie des données personnelles (prénoms, nom, date/lieu naissance, sexe, taille, profession, adresse, etc.)
- Capture photo via webcam → upload réel vers bucket Supabase
photos-cni - Scan iris réaliste avec analyse 9 étapes technique et métriques de qualité
- Enregistrement final dans la table
citoyensavec :- Génération automatique du numéro CNI (
SN-YYYY-######) operateur_idlié à l'opérateur connecté (viaauth.uid()→operateurs.user_id)- Dates d'émission/expiration
- URL de la photo uploadée
- Génération automatique du numéro CNI (
- Validation complète avec Zod
- Scanner iris réaliste avec analyse 9 étapes technique
- Recherche 1:N dans la base de données complète
- Métriques de qualité en temps réel (mise au point, éclairage, occlusion)
- Score de confiance calculé automatiquement
- Redirection vers la fiche détaillée du citoyen identifié
- Liste complète des citoyens avec recherche/filtrage
- Fiche détaillée avec photo et toutes les informations
- Carte interactive (Leaflet) avec marqueurs géolocalisés (PostGIS)
- Impression de résumé (client-side)
- Statistiques en temps réel :
- Total citoyens
- Enrôlements du jour
- Accès rapide aux modules Enrôler / Identifier
- Couleurs nationales : Vert (#009639), Jaune (#FCD116), Rouge (#EF3340)
- Génération de numéros CNI au format officiel
- Noms, régions, professions authentiques
- Interface entièrement en français
- Géolocalisation sur le territoire sénégalais
Page d'authentification élégante avec:
- Logo EyeDentify animé avec effet de scale et rotation
- Formulaire email/mot de passe avec icônes Heroicons
- Arrière-plan animé avec gradients verts et jaunes sénégalais
- Pulsations sur les éléments interactifs
- Mentions de sécurité et conformité RGPD
- Bouton de connexion avec effet shimmer et animations hover
- Design glassmorphism avec backdrop-blur
Interface principale avec vue d'ensemble complète:
- En-tête avec logo: Logo EyeDentify dans conteneur blanc arrondi avec ombre colorée
- Statistiques principales: 3 tuiles avec gradients (vert/jaune/rouge) affichant citoyens enregistrés, IDs du jour, enrôlements du jour
- Actions rapides: Cartes avec icônes pour "Identifier un citoyen" et "Enrôler un citoyen"
- Activité récente: Liste des dernières opérations avec statuts colorés (succès/en cours/info)
- État du système: Métriques de performance avec indicateurs visuels (scanner iris, base de données, temps de réponse)
- Animations d'entrée progressives et effets hover sur les cartes
Gestion complète de la base de données citoyens:
- Filtres avancés: Recherche par nom/prénoms/CNI/lieu, tri par date/nom/CNI, filtre "aujourd'hui uniquement"
- Cartes citoyens: Design glass avec photo, informations personnelles, badges de statut, vignettes iris simulées
- Carte interactive: Leaflet avec marqueurs géolocalisés sur le territoire sénégalais
- Statistiques démographiques: Répartition par genre et âge
- Animations au scroll et effets hover sur les cartes
Fiche complète et professionnelle:
- Photo d'identité: Affichage avec fallback en cas d'absence
- Scans iris: Simulation avec métriques de qualité (95%/92%)
- Informations personnelles: Grille responsive avec labels et valeurs
- Coordonnées: Téléphone, email, adresse complète
- Données d'enrôlement: Dates d'émission/expiration, autorité, numéro CNI
- Actions: Boutons retour, impression avec icône
- Layout responsive avec sections organisées
Journal d'audit complet avec analyse:
- Statistiques: Total opérations, succès, échecs, erreurs
- Filtres: Période (aujourd'hui/7j/30j/tout), type (enrôlement/identification), résultat
- Table détaillée: Colonnes date/heure, type, agent, citoyen, résultat, durée
- Graphiques: Opérations par heure (barres), répartition par type (camembert)
- Badges de statut: Couleurs contextuelles pour résultats
- Interface filtrable avec recherche par CNI/agent
Configuration système organisée en onglets:
- Profil: Informations utilisateur (nom, rôle, station, dernière connexion)
- Sécurité: Changement mot de passe, durée session, verrouillage automatique
- Matériel: Test/calibration caméra et imprimante avec états en temps réel
- Notifications: Toggles pour email, push, sons avec switches animés
- Système: Informations techniques (versions, performance, actions système)
- Navigation par onglets avec indicateurs actifs
Formulaire d'enrôlement structuré:
- Informations identité: Prénom, nom, date/lieu naissance, genre (radio buttons)
- Données physiques: Taille, profession, adresse complète
- Contact: Téléphone, email optionnel
- Validation RGPD: Case à cocher obligatoire avec texte explicatif
- Stepper visuel: Indicateur de progression (1/4 étapes)
- Validation Zod: Messages d'erreur en rouge, champs requis marqués
- Design avec inputs glass et boutons primaires
Interface de capture webcam professionnelle:
- Flux vidéo: Affichage caméra avec guide visuel (zone de capture)
- Métriques qualité: Indicateurs visuels pour netteté, éclairage, alignement
- Contrôles: Boutons capture/retake/continuer avec états loading
- Upload Supabase: Envoi automatique vers bucket photos-cni
- Feedback visuel: Animations de capture et progression (50% complété)
- Interface responsive avec overlay de guidage
Simulation biométrique réaliste:
- Scanner visuel: Affichage noir avec iris animé et scan line
- Étapes techniques: 9 étapes d'analyse biométrique détaillées
- Métriques temps réel: Qualité, focus, éclairage, occlusion
- Progression: Barre de progression et messages d'état
- Instructions: Liste détaillée des bonnes pratiques
- Transition fluide: Vers page succès avec stockage des données
Confirmation d'enrôlement complète:
- Numéro CNI généré: Format SN-YYYY-XXXXXX en évidence
- Récapitulatif: Toutes les données saisies organisées
- Badges validation: ✓ Photo capturée, ✓ Iris scanné, ✓ Données validées
- Actions disponibles: Imprimer, voir citoyen, nouvel enrôlement
- Statut visuel: Icône checkmark verte animée
- Design avec gradients de succès et animations d'entrée
Scanner de recherche 1:N professionnel:
- Interface scanner: Même design que l'enrôlement avec iris pulsant
- Instructions détaillées: 4 étapes pour utilisation correcte
- Résultats temps réel: Affichage citoyen trouvé avec confiance (98.5%)
- Informations match: CNI, nom complet, lieu naissance, confiance
- Actions: Bouton "Voir fiche complète" avec redirection automatique
- Session tracking: Compteurs tentatives/réussites/temps moyen
- États système: Status scanner, base de données, citoyens en base
- Vert Sénégal (#005c22): Couleur primaire principale - contraste 7.2:1 sur blanc
- Utilisé pour: boutons primaires, liens actifs, icônes importantes, accents principaux
- Variants: --primary (#005c22), --primary-dark (#004017)
- Jaune Sénégal (#c69e00): Couleur secondaire - contraste 6.8:1 sur blanc
- Utilisé pour: boutons secondaires, accents, indicateurs de statut
- Variants: --secondary (#c69e00), --secondary-dark (#a37c00)
- Rouge Sénégal (#b01e28): Couleur danger - contraste 6.4:1 sur blanc
- Utilisé pour: erreurs, alertes, boutons de suppression
- Variants: --danger (#b01e28), --danger-dark (#8e1a22)
- Neutrals complets: 7 niveaux de gris (--neutral-0 à --neutral-900)
- #ffffff (--neutral-0): Blanc pur pour arrière-plans
- #f8fafc (--neutral-50): Blanc très clair pour fonds subtils
- #f1f5f9 (--neutral-100): Blanc clair pour cartes
- #e2e8f0 (--neutral-200): Gris très clair pour bordures
- #334155 (--neutral-700): Gris foncé pour texte secondaire
- #1e293b (--neutral-800): Gris très foncé pour texte principal
- #0f172a (--neutral-900): Noir presque pour titres
- Glassmorphism:
bg-white/80 backdrop-blur-xl rounded-3xl shadow-xl border border-white/20 - Gradients subtils:
background: linear-gradient(135deg, rgba(255,255,255,0.9) 0%, rgba(255,255,255,0.7) 100%) - Ombres avancées: Multiples couches avec
0 8px 32px rgba(0, 0, 0, 0.1)et insets - Animations hover:
transform: translateY(-4px) scale(1.01)avec transitions fluides
- Primaire: Gradient vert
linear-gradient(135deg, #009B77 0%, #10b981 50%, #059669 100%)- Effets: shimmer animation, scale + translateY hover, box-shadow colorée
- États: focus rings, disabled opacity, loading spinners
- Secondaire: Blanc avec bordure, backdrop-blur, effets similaires
- Ghost: Transparent avec hover states subtils
- Style glass:
bg-white/70 backdrop-blur-sm border border-gray-200/50 rounded-2xl - Focus states: Ring coloré
rgba(0, 155, 119, 0.15), translateY + scale - Validation: Bordures rouges pour erreurs, animations de shake
- Icônes intégrées: Position absolue avec Heroicons
- fadeIn: Opacity 0→1 avec translateY(20px)
- slideUp: TranslateY(30px) → 0 avec opacity
- scaleIn: Scale(0.9) → 1 avec opacity
- bounceIn: Séquence complexe avec rebonds
- Durations: 0.3s à 0.6s avec easing cubic-bezier
- Breakpoints: sm (640px), md (768px), lg (1024px), xl (1280px)
- Grids adaptatives:
grid-cols-1 md:grid-cols-2 lg:grid-cols-3 - Typography responsive:
text-sm sm:text-base lg:text-lg - Spacing adaptatif: Padding/margin responsives
- Navigation mobile: Menu overlay avec animations slide
- Heroicons: Outline + Solid, animations contextuelles, couleurs sémantiques
- Inter font: 300-700 weights, antialiased, smooth scrolling
- Tailles responsives: xs à 9xl avec line-heights optimisés
bg-gradient-primary: Vert sénégalais progressifbg-gradient-senegal: Vert → Jaune nationalbg-gradient-success: Vert émeraudebg-gradient-warning: Jaune dorébg-gradient-error: Rouge profondbg-gradient-subtle: Gris subtil pour fonds
shadow-soft: 0 2px 15px -3px rgba(0,0,0,0.07)shadow-medium: 0 4px 25px -5px rgba(0,0,0,0.1)shadow-large: 0 10px 40px -10px rgba(0,0,0,0.15)shadow-colored: Ombres teintées avec couleur primaire
- Hover: Scale(1.02), translateY(-2px), border-color changes
- Focus: Ring visible, box-shadow colorée, outline none
- Active: Scale(0.98), transition rapide 0.1s
- Disabled: Opacity 0.5, pointer-events none, transforms disabled
- WCAG-AA: Contrastes calculés, focus visible, aria-labels
- Reduced motion: Respect des préférences utilisateur
- High contrast: Support mode contraste élevé
- Print styles: Optimisé pour impression CNI
- Scrollbar custom: Style sombre avec rounded corners
- Mesh background: Pattern radial pour textures subtiles
- Scan line animation: Ligne de scan animée pour interfaces biométriques
- Iris pulse: Animation de pulsation pour éléments iris
- Shimmer effect: Animation de brillance sur boutons
- Loading dots: Indicateurs de chargement animés
L’application est directement connectée à Supabase – aucun backend intermédiaire.
- Authentification : Supabase Auth (
auth.users) - Données : Tables
citoyens,operateurs(avecuser_id → auth.users.id) - Stockage : Bucket public
photos-cnipour les photos - RLS : Activée et respectée (insertion avec
operateur_id = auth.uid()via lienuser_id) - Requêtes : TanStack Query + client Supabase
VITE_SUPABASE_URL=https://ton-projet.supabase.co
VITE_SUPABASE_ANON_KEY=ta-cle-anon-publiqueAvant de commencer, assurez-vous d'avoir installé :
- Node.js (version 18 ou supérieure) - Télécharger
- npm ou yarn ou pnpm
- Un compte Supabase avec un projet configuré
git clone https://github.com/votre-username/eyedentify-frontend.git
cd eyedentify-frontendnpm install
# ou
yarn install
# ou
pnpm installVITE_SUPABASE_URL=https://votre-projet.supabase.co
VITE_SUPABASE_ANON_KEY=votre-cle-anonyme-publique-
Tables requises :
-- Table des opérateurs CREATE TABLE operateurs ( id SERIAL PRIMARY KEY, user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE, nom VARCHAR(255), email VARCHAR(255) UNIQUE, role VARCHAR(100) DEFAULT 'agent', station VARCHAR(255), created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Table des citoyens CREATE TABLE citoyens ( id SERIAL PRIMARY KEY, operateur_id INTEGER REFERENCES operateurs(id), cedeaonumber VARCHAR(20) UNIQUE, prenoms VARCHAR(255), nom VARCHAR(255), date_naissance DATE, lieu_naissance VARCHAR(255), sexe CHAR(1), taille_cm INTEGER, profession VARCHAR(255), adresse TEXT, telephone VARCHAR(20), email VARCHAR(255), photo_url TEXT, date_delivrance DATE, date_expiration DATE, autorite VARCHAR(255), enrolled_at TIMESTAMP WITH TIME ZONE, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Table d'audit CREATE TABLE audit_log ( id SERIAL PRIMARY KEY, operateur_id INTEGER REFERENCES operateurs(id), type VARCHAR(50), citizen_cni VARCHAR(20), result VARCHAR(50), details JSONB, duration INTEGER, date TIMESTAMP WITH TIME ZONE DEFAULT NOW() );
-
Bucket de stockage : Créer un bucket public nommé
photos-cni -
Politiques RLS (Row Level Security) :
-- Pour la table operateurs ALTER TABLE operateurs ENABLE ROW LEVEL SECURITY; CREATE POLICY "Users can view own operator record" ON operateurs FOR SELECT USING (auth.uid() = user_id); -- Pour la table citoyens ALTER TABLE citoyens ENABLE ROW LEVEL SECURITY; CREATE POLICY "Operators can view all citizens" ON citoyens FOR SELECT USING (true); CREATE POLICY "Operators can insert citizens" ON citoyens FOR INSERT WITH CHECK (true);
npm run dev
# ou
yarn dev
# ou
pnpm devL'application sera accessible sur http://localhost:5173
npm run build
# ou
yarn build
# ou
pnpm buildLes fichiers de production seront générés dans le dossier dist/.
npm run preview
# ou
yarn preview
# ou
pnpm previewnpm run test
# ou
yarn test
# ou
pnpm testnpm run storybook
# ou
yarn storybook
# ou
pnpm storybookStorybook sera accessible sur http://localhost:6006
-
Créer un repository sur GitHub
-
Ajouter le remote :
git remote add origin https://github.com/votre-username/eyedentify-frontend.git
-
Premier push :
git add . git commit -m "Initial commit: EyeDentify Frontend" git branch -M main git push -u origin main
.env avec vos vraies clés Supabase !
Ajoutez ces variables dans les Settings > Secrets and variables > Actions de votre repo GitHub :
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY
Vous pouvez ajouter un workflow GitHub Actions pour le déploiement automatique :
# .github/workflows/deploy.yml
name: Deploy to Production
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '18'
- run: npm ci
- run: npm run build
- run: echo "Build completed successfully"- Accédez à l'application :
http://localhost:5173 - Utilisez les identifiants de démonstration :
- Email :
demo@eyedentify.sn - Mot de passe :
eyedentify2025
- Email :
- Tableau de bord : Vue d'ensemble des statistiques
- Enrôler un citoyen : Assistant 4 étapes pour créer un nouveau profil
- Identifier un citoyen : Recherche biométrique par iris
- Gérer les citoyens : Liste complète avec recherche et filtres
- Historique : Journal des opérations avec statistiques
Pour maintenir un historique propre, utilisez ces conventions :
feat: ajout nouvelle fonctionnalité
fix: correction de bug
docs: mise à jour documentation
style: modifications de style
refactor: refactorisation du code
test: ajout/modification de tests
chore: tâches de maintenance- Fork le projet
- Créer une branche :
git checkout -b feature/nouvelle-fonctionnalite - Commiter vos changements :
git commit -m 'feat: description' - Push vers la branche :
git push origin feature/nouvelle-fonctionnalite - Créer une Pull Request
Pour toute question ou problème :
- Ouvrez une issue sur GitHub
- Consultez la documentation dans ce README
- Vérifiez les logs de console pour les erreurs
Fonctionnalités complètes et opérationnelles :
- ✅ Authentification Supabase avec email/mot de passe
- ✅ Enrôlement complet (4 étapes) avec sauvegarde en base
- ✅ Analyse biométrique iris (18 étapes professionnelles)
- ✅ Gestion complète des citoyens (liste + détails)
- ✅ Tableau de bord avec statistiques temps réel
- ✅ Recherche et filtrage avancés
- ✅ Interface responsive (mobile/tablette/PC)
- ✅ Architecture flexible pour tout schéma Supabase
- ✅ Simulation biométrique réaliste et crédible
Architecture technique :
- Frontend: React 18 + TypeScript + Vite
- Styling: Tailwind CSS avec design système
- État: Zustand avec persistance
- Base de données: Supabase (schéma flexible)
- Authentification: Supabase Auth
- Biométrie: Simulation professionnelle 18 étapes
- Responsive: Design adaptatif complet
Sécurité et conformité :
- Authentification sécurisée
- Gestion des sessions persistante
- Validation des données (Zod)
- Interface française professionnelle
- Couleurs nationales sénégalaises
- Respect RGPD et protection données
L'application est prête pour le déploiement sur :
- Vercel (recommandé pour React)
- Netlify
- GitHub Pages
- Railway ou Render
VITE_SUPABASE_URLVITE_SUPABASE_ANON_KEY
- 🔍 Scan iris réel : Intégration SDK biométrique professionnel
- 🗺️ Géolocalisation avancée : Cartes interactives détaillées
- 📄 Génération PDF CNI : Documents officiels téléchargeables
- 📊 Analytics temps réel : Tableaux de bord avancés
- 🔐 Authentification multi-facteurs
- 📱 PWA offline : Mode hors-ligne complet
- 🔗 API REST : Intégrations tierces
- 🤖 IA/ML : Amélioration de la reconnaissance
- ⚡ Performance : Code splitting, lazy loading
- 🧪 Tests : Couverture complète (unités, intégration, E2E)
- ♿ Accessibilité : Conformité WCAG 2.1 AA complète
- 🌐 i18n : Support multi-langues
- 📊 Monitoring : Logs et métriques production
Les contributions sont les bienvenues ! Voir la section Installation & Configuration pour commencer.
- Respecter les conventions de commit
- Tests requis pour les nouvelles fonctionnalités
- Documentation à jour
- Code review obligatoire
Ce projet est sous licence MIT - voir le fichier LICENSE pour plus de détails.
Construit avec ❤️ pour la modernisation de l'état civil sénégalais 🇸🇳
Projet académique/démonstration - Non destiné à un usage en production sans validation sécurité