seiche-web
Front Vite 7 + React 19 + TypeScript strict + Tailwind 4 + React Router 7 + TanStack Query 5. Interface en français.
Scripts
| Script | Rôle |
|---|---|
pnpm dev |
Vite sur http://localhost:5173, proxy /api → http://localhost:8787 (le serveur doit tourner) |
pnpm build |
tsc --noEmit + build de production dans dist/ (servi par Fastify en prod) |
pnpm preview |
Prévisualisation du build |
pnpm test |
Vitest + jsdom + Testing Library |
pnpm typecheck |
tsc --noEmit |
Structure
src/
├── main.tsx # QueryClient (staleTime 30 s, pas de retry 4xx)
├── App.tsx # routes : /login public, / sous RequireAuth, catch-all
├── lib/
│ ├── api.ts # client API (fetch, credentials same-origin, ApiError)
│ ├── session.ts # useSession() — cache partagé login → guard → dashboard
│ └── queryClient.ts # QueryClient factorisé (partagé main ↔ tests)
├── components/RequireAuth.tsx # guard : spinner en attente, redirect /login si erreur
└── pages/
├── LoginPage.tsx # formulaire, erreurs mappées (401/429/500)
└── DashboardPage.tsx # user, expiry, logout
Contrat API
Le client (lib/api.ts) est aligné sur server/src/routes/auth.ts : codes invalid_body · invalid_credentials · too_many_attempts (avec retryAfterMs) · not_authenticated. En dev, le proxy Vite rend les appels relatifs (/api/...) isomorphes avec la prod (même origine).