Files
seiche/web

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