Files

34 lines
1.6 KiB
Markdown

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