diff --git a/README.md b/README.md index bb2f2a8..3bff53d 100644 --- a/README.md +++ b/README.md @@ -258,17 +258,54 @@ Une fois connecté, l'utilisateur atterrit sur `src/layouts/AppLayout.tsx` — s `` pour la route active — montée une seule fois comme route parente de tout l'espace authentifié (`App.tsx`), pas dupliquée par page. `src/pages/HomePage.tsx` (routée sur `/`) affiche le planning de la semaine du foyer (`GET /planning/current`, -voir plus haut) avec ses états chargement/erreur/vide/rempli ; `Recettes`, `Liste de -courses` et `Foyer & profil` n'ont pas encore de backend dédié et rendent pour -l'instant le même composant `ComingSoonPage`. Détail complet (pourquoi une seule -route parente, pourquoi un composant stub partagé) : +voir plus haut) avec ses états chargement/erreur/vide/rempli ; `Recettes` et `Liste de +courses` n'ont pas encore de backend dédié et rendent pour l'instant le même +composant `ComingSoonPage` — `Foyer & profil` (`src/pages/HouseholdPage.tsx`), lui, +est une vraie page (voir section suivante). Détail complet (pourquoi une seule route +parente, pourquoi un composant stub partagé) : [specs/frontend-architecture.md](specs/frontend-architecture.md#applayout--sidebar-commune-à-lespace-connecté). +## Parcours profil — foyer, régime, allergènes (apps/web) + +- `src/features/profile/` — `HouseNameField`, `DietSelect`, `AllergySelect` : champs + contrôlés et "dumb" (reçoivent leurs données en props, ne fetchent rien + eux-mêmes), partagés par les deux surfaces ci-dessous. `AllergySelect` utilise une + grille de cases à cocher dans un `
`/`` plutôt qu'un + `` — bien plus repérable/tapable, notamment sur + mobile (voir la note Capacitor plus haut). + +### Deux bugs de state trouvés en testant dans le navigateur + +1. **Course entre `navigate()` et `RedirectIfAuthenticated`** — voir la note sur + `RedirectIfAuthenticated` plus haut. `SignupPage` doit maintenant rediriger vers + `/onboarding/foyer`, pas `/`, ce qui a rendu visible une course de state + auparavant invisible. +2. **`user.dietId` périmé sur `/foyer`** — `HouseholdPage` initialisait le régime + affiché depuis `useAuth().user.dietId`, un instantané d'`AuthContext` jamais + rafraîchi après une modification faite directement via `apiClient` (qui ne + touche pas le contexte). Une navigation SPA aller-retour sans rechargement + complet ré-affichait donc l'ancienne valeur après une sauvegarde. Fix : + `HouseholdPage` fetch son propre profil frais (`apiClient.me()`) au montage + plutôt que de dépendre du contexte, et `AuthContext.refreshUser()` (nouvelle + méthode, re-fetch `GET /auth/me`) est appelée après une sauvegarde réussie du + régime — pour que le reste de l'app (pas seulement cette page) reste cohérent. --- @@ -146,7 +208,9 @@ JSON, jamais codé en dur dans un composant. namespace : `errors.*` (voir [error-handling.md](./error-handling.md)), `auth.login.*` / `auth.signup.*`, `layout.*` (nav de la sidebar, salutation, déconnexion — `AppLayout`), `home.*` (planning), `recipes.*` / `shoppingList.*` - / `household.*` (copie des pages stub, voir `ComingSoonPage` plus haut). + (copie des pages stub, voir `ComingSoonPage` plus haut), `onboarding.*` (wizard + d'inscription) et `household.*` (titre + `form.*`, champs partagés par le wizard + et `/foyer`). - Dans un composant : `const { t } = useTranslation(); t("auth.login.title")`. - Ajouter une langue : créer `locales//translation.json` avec les mêmes clés, ajouter `resources.` dans `i18n/i18n.ts` — aucun composant à toucher.