[#2] Refonte useReports : hooks par domaine + periode en query string #70

Closed
opened 2026-04-13 14:59:28 +00:00 by maximus · 0 comments
Owner

Objectif

Splitter le hook monolithique useReports en hooks par domaine et déplacer la période vers la query string pour qu'elle soit bookmarkable et partagée entre les sous-routes. Les 4 rapports existants continuent de fonctionner pendant la transition grâce à un fallback legacy.

Spec : spec-refonte-rapports.md
Dépend de #69

Contexte

useReports aujourd'hui porte tout l'état des rapports (tab, period, monthlyTrends, categorySpending, categoryOverTime, budget*, etc.) dans un seul reducer. Avec les 4 sous-routes séparées, chaque page monte son propre hook — un god-object qui refetche tout et porte des champs hors-section devient incohérent. Cf. findings architecture du review.

Tâches

Nouveau hook partagé : useReportsPeriod

  • Créer src/hooks/useReportsPeriod.ts
  • Lit/écrit la période via useSearchParams de react-router : ?from=YYYY-MM-DD&to=YYYY-MM-DD&period=custom|monthly|yearly|ytd|all
  • Par défaut (aucun paramètre) : année civile en cours (du 1er janvier au 31 décembre de l'année courante)
  • API : { from, to, period, setPeriod, setCustomDates }

Hooks par domaine (stubs avec fetch basique)

  • Créer src/hooks/useHighlights.tsuseReducer + fetch via reportService.getHighlights (stub vide pour l'instant, sera rempli en #71)
  • Créer src/hooks/useTrends.ts — stub
  • Créer src/hooks/useCompare.ts — stub
  • Créer src/hooks/useCategoryZoom.ts — stub
  • Chacun consomme useReportsPeriod pour obtenir la période courante

Transition legacy

  • Conserver temporairement src/hooks/useReports.ts avec ses champs existants (monthlyTrends, categorySpending, categoryOverTime, budgetVsActual) mais le recâbler sur useReportsPeriod au lieu de l'état local interne
  • Ajouter un commentaire // @deprecated — sera supprimé en Issue #76 une fois tous les rapports migrés
  • Adapter src/pages/ReportsPage.tsx (version temporaire avec tabs) pour consommer useReportsPeriod + les champs legacy de useReports
  • ViewModeToggle : s'assurer que la prop storageKey permet la persistance par section (reports-viewmode-highlights, -trends, -compare, -category)

Vérifications

  • npm run build vert
  • cargo check vert
  • Les 4 rapports legacy tournent toujours sur /reports sans régression
  • L'URL reflète la période courante et est bookmarkable (copier-coller d'une URL avec ?from=...&to=... restaure l'état)

Critères d'acceptation

  • Chaque nouveau hook est autonome et consomme useReportsPeriod
  • La période est bookmarkable via l'URL
  • Aucun des 4 rapports legacy n'est cassé
  • Un comment @deprecated marque l'ancien useReports
## Objectif Splitter le hook monolithique `useReports` en **hooks par domaine** et déplacer la période vers la **query string** pour qu'elle soit bookmarkable et partagée entre les sous-routes. Les 4 rapports existants continuent de fonctionner pendant la transition grâce à un fallback legacy. Spec : `spec-refonte-rapports.md` Dépend de #69 ## Contexte `useReports` aujourd'hui porte tout l'état des rapports (`tab`, `period`, `monthlyTrends`, `categorySpending`, `categoryOverTime`, `budget*`, etc.) dans un seul reducer. Avec les 4 sous-routes séparées, chaque page monte son propre hook — un god-object qui refetche tout et porte des champs hors-section devient incohérent. Cf. findings architecture du review. ## Tâches ### Nouveau hook partagé : `useReportsPeriod` - [ ] Créer `src/hooks/useReportsPeriod.ts` - [ ] Lit/écrit la période via `useSearchParams` de react-router : `?from=YYYY-MM-DD&to=YYYY-MM-DD&period=custom|monthly|yearly|ytd|all` - [ ] Par défaut (aucun paramètre) : année civile en cours (du 1er janvier au 31 décembre de l'année courante) - [ ] API : `{ from, to, period, setPeriod, setCustomDates }` ### Hooks par domaine (stubs avec fetch basique) - [ ] Créer `src/hooks/useHighlights.ts` — `useReducer` + fetch via `reportService.getHighlights` (stub vide pour l'instant, sera rempli en #71) - [ ] Créer `src/hooks/useTrends.ts` — stub - [ ] Créer `src/hooks/useCompare.ts` — stub - [ ] Créer `src/hooks/useCategoryZoom.ts` — stub - [ ] Chacun consomme `useReportsPeriod` pour obtenir la période courante ### Transition legacy - [ ] Conserver temporairement `src/hooks/useReports.ts` avec ses champs existants (`monthlyTrends`, `categorySpending`, `categoryOverTime`, `budgetVsActual`) mais le recâbler sur `useReportsPeriod` au lieu de l'état local interne - [ ] Ajouter un commentaire `// @deprecated — sera supprimé en Issue #76 une fois tous les rapports migrés` - [ ] Adapter `src/pages/ReportsPage.tsx` (version temporaire avec tabs) pour consommer `useReportsPeriod` + les champs legacy de `useReports` - [ ] `ViewModeToggle` : s'assurer que la prop `storageKey` permet la persistance par section (`reports-viewmode-highlights`, `-trends`, `-compare`, `-category`) ### Vérifications - [ ] `npm run build` vert - [ ] `cargo check` vert - [ ] Les 4 rapports legacy tournent toujours sur `/reports` sans régression - [ ] L'URL reflète la période courante et est bookmarkable (copier-coller d'une URL avec `?from=...&to=...` restaure l'état) ## Critères d'acceptation - Chaque nouveau hook est autonome et consomme `useReportsPeriod` - La période est bookmarkable via l'URL - Aucun des 4 rapports legacy n'est cassé - Un comment `@deprecated` marque l'ancien `useReports`
maximus added this to the spec-refonte-rapports milestone 2026-04-13 14:59:28 +00:00
maximus added the
status:ready
type:refactor
source:human
labels 2026-04-13 14:59:28 +00:00
maximus added
status:review
and removed
status:ready
labels 2026-04-14 18:38:14 +00:00
maximus added
status:approved
and removed
status:review
labels 2026-04-14 18:38:19 +00:00
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: maximus/Simpl-Resultat#70
No description provided.