Aller au contenu

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.

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)
core/auth/guards.ts
requireAuth(session) // → redirect('/login') si non connecté
requirePermissions(session, 'FINANCES.VOIR', ...) // → redirect('/') si refusé
routes/_authenticated.tsx
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' }).

  1. 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.
  2. 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).
  3. routeTree.gen.ts est généré, jamais édité.
  • ❌ É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) — utiliser useRouter() ou <Link>.