Frontend : connexion (mot de passe + lien magique) et onglets par rôle
Authentification alignée sur le back-end (Étapes 7/8) : - src/api : schema auth (AccountRead, TokenResponse…), session.ts (jeton Bearer partagé + callback 401), méthodes auth du client HTTP (POST .../auth/login, .../auth/magic-link, .../auth/verify, GET /auth/me) et du mock (comptes coordination + référents + bénévoles, tokens magiques, sessions). - src/auth : AuthProvider/useAuth (jeton en localStorage, réhydratation via /auth/me, déconnexion sur 401), RequireAuth (garde + contrôle de rôle), HomeRedirect, table ROUTE_ROLES. - Pages : /connexion (lien magique, avec lien de démo affiché en mode mock), /connexion/coordination (email + mot de passe). - Router : toutes les routes métier passées derrière <RequireAuth> ; redirection vers l'accueil du rôle. - AppShell : onglets filtrés par rôle (01/02/03/06 coordination, 04 bénévole, 05 référent), email + rôle + bouton Déconnexion. - Mobile bénévole : cible le bénévole du compte connecté ; dégradation propre quand l'API refuse le détail des créneaux à un bénévole. - Mobile référent : cible le poste dont le compte est référent. - i18n : clés auth / rôles. - Vérifs : build tsc + vite, eslint (0 problème), npm run smoke (flux login / lien magique + rendu des 6 écrans par rôle et des pages publiques). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AwswqSChc3Rwtu61pRXiY2
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
464635656a
commit
6e16db4b7e
@@ -18,6 +18,34 @@
|
||||
"volunteer.duplicate_email": "Un bénévole avec cet email existe déjà",
|
||||
"shift.ends_not_after_starts": "La fin doit être après le début",
|
||||
"shift.position_wrong_edition": "Le poste n'appartient pas à cette édition",
|
||||
"auth.invalid_credentials": "Email ou mot de passe incorrect",
|
||||
"auth.invalid_token": "Ce lien de connexion est invalide ou expiré",
|
||||
|
||||
"role.coordinator": "Coordination",
|
||||
"role.lead": "Référent",
|
||||
"role.volunteer": "Bénévole",
|
||||
|
||||
"auth.logout": "Déconnexion",
|
||||
"auth.email": "Email",
|
||||
"auth.password": "Mot de passe",
|
||||
"auth.signIn": "Se connecter",
|
||||
"auth.signingIn": "Connexion…",
|
||||
"auth.admin.title": "Espace coordination",
|
||||
"auth.demoCredentials": "Démo : {email} · mot de passe « {password} »",
|
||||
"auth.notAdmin": "Bénévole ou référent ?",
|
||||
"auth.magicLinkLink": "Recevoir un lien de connexion",
|
||||
"auth.isAdmin": "Vous êtes de la coordination ?",
|
||||
"auth.adminLink": "Connexion par mot de passe",
|
||||
"auth.magic.title": "Connexion bénévole / référent",
|
||||
"auth.magic.lead": "Entrez votre email : vous recevrez un lien de connexion, sans mot de passe.",
|
||||
"auth.magic.send": "Envoyer le lien",
|
||||
"auth.magic.sending": "Envoi…",
|
||||
"auth.magic.sent": "Si un compte correspond à cet email, un lien de connexion vient d'être envoyé.",
|
||||
"auth.magic.devHint": "Démo (email stubé) — cliquez ce lien :",
|
||||
"auth.magic.another": "Utiliser un autre email",
|
||||
"auth.magic.verifyTitle": "Connexion en cours",
|
||||
"auth.magic.verifying": "Vérification du lien…",
|
||||
"auth.magic.retry": "Demander un nouveau lien",
|
||||
|
||||
"header.title": "GESTION DES BÉNÉVOLES",
|
||||
"header.meta": "BÉNÉVOLAT · {count} INSCRITS",
|
||||
@@ -124,6 +152,8 @@
|
||||
"mobileVol.confirm": "JE CONFIRME",
|
||||
"mobileVol.confirmed": "✓ CRÉNEAU CONFIRMÉ",
|
||||
"mobileVol.noSlots": "Aucun créneau pour l'instant. La coordination t'affectera bientôt.",
|
||||
"mobileVol.noAccount": "Ce compte n'est rattaché à aucun bénévole. Contactez la coordination.",
|
||||
"mobileVol.detailsUnavailable": "Le détail des créneaux (poste, horaires) n'est pas encore exposé aux bénévoles par l'API.",
|
||||
"mobileVol.designNote": "Lisibilité plein soleil : fonds opaques, texte noir sur jaune ou blanc, aucun gris clair. Cibles tactiles à 52–62 px de haut. Une seule action par créneau. Les données proviennent des affectations réelles de l'API.",
|
||||
|
||||
"mobileLead.statusTime": "18:07",
|
||||
|
||||
Reference in New Issue
Block a user