Routing (TanStack Router)
Les routes sont des fichiers dans src/routes/, régénérés par
npm run generate-routes après chaque ajout/suppression.
Structure actuelle
Section intitulée « Structure actuelle »| Fichier | Route | Rôle |
|---|---|---|
src/routes/__root.tsx |
— | Coquille HTML, locale, erreur/404 par défaut, devtools en dev |
src/routes/login.tsx |
/login |
Publique ; redirige vers / si déjà connecté |
src/routes/mot-de-passe-oublie.tsx |
/mot-de-passe-oublie |
Publique ; demande d’email de réinitialisation |
src/routes/reinitialiser-mot-de-passe.tsx |
/reinitialiser-mot-de-passe |
Publique ; pose le nouveau mot de passe (?token=) |
src/routes/_authenticated.tsx |
layout /_authenticated |
Protégé ; monte AuthProvider + AppShell — back-office et portail résident (residence/portail/*) |
src/routes/_authenticated/index.tsx |
/ |
Accueil protégé |
src/routes/_espace-client.tsx |
layout /espace-client |
Protégé ; monte ClientShell (sidebar lg+, navbar + tab bar mobile) |
Guards (beforeLoad)
Section intitulée « Guards (beforeLoad) »requireAuth(session) // → redirect('/login') si non connectérequirePermissions(session, 'FINANCES.VOIR', ...) // → redirect('/') si refusébeforeLoad: ({ context }) => { requireAuth(context.auth)}Le contexte route expose { queryClient, auth } (voir router.tsx). Les
guards lancent redirect({ href: ... }) — chemin string volontairement non
typé pour ne pas dépendre de l’arbre de routes. AuthProvider est monté dans
le layout protégé uniquement : la page de login, publique, accède à la session
via useRouteContext({ from: '/login' }).
- Les guards s’appliquent dans
beforeLoad(exécuté avant le rendu, côté client et SSR). En SSR, un utilisateur non authentifié est redirigé — c’est le comportement attendu pour une app JWT client-side. - Les charges de données par route (
loader) sont réservées aux cas où le composant a besoin des données avant le premier rendu. Pour le reste : TanStack Query (Gestion d’état). routeTree.gen.tsest généré, jamais édité.
À ne pas faire
Section intitulée « À ne pas faire »- ❌ Écrire la logique métier dans une route (aller dans
features/). - ❌ Attacher des permissions au rendu seulement : le guard frontend est une UX, la sécurité reste au backend (Autorisation).
- ❌ Naviguer avec
window.location(casserait le SPA) — utiliseruseRouter()ou<Link>.
