# 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).