157 lines
5.8 KiB
Markdown
157 lines
5.8 KiB
Markdown
# Story 5.5: Implémenter le dashboard temps réel avec D3.js
|
|
|
|
Status: review
|
|
|
|
## Acceptance Criteria
|
|
|
|
**Given** le dashboard est affiché
|
|
**When** les données d'énergie sont mises à jour
|
|
**Then** le dashboard se met à jour automatiquement en < 3 secondes
|
|
**And** les visualisations D3.js sont animées de manière fluide
|
|
**And** les utilisateurs voient les changements sans rechargement de page
|
|
|
|
**Given** une mise à jour est en cours
|
|
**When** les nouvelles données arrivent
|
|
**Then** un indicateur subtil montre que les données sont rafraîchies
|
|
**And** les transitions sont fluides (60fps)
|
|
|
|
## Tasks / Subtasks
|
|
|
|
- [x] Configurer React Query pour les mises à jour temps réel (AC: #1)
|
|
- [x] Installer `@tanstack/react-query` (déjà installé v5.90.18)
|
|
- [x] Configurer le QueryClient pour polling
|
|
- [x] Configurer l'intervalle de polling (ex: 30 secondes)
|
|
- [x] Configurer le cache pour éviter les requêtes redondantes
|
|
- [x] Gérer les erreurs de polling
|
|
|
|
- [x] Créer les hooks de données temps réel (AC: #1)
|
|
- [x] Créer `src/hooks/usePredictions.ts`
|
|
- [x] Créer `src/hooks/useEnergyScores.ts`
|
|
- [x] Utiliser `useQuery` de React Query
|
|
- [x] Configurer le polling et la stale time
|
|
- [x] Gérer l'état de chargement
|
|
|
|
- [x] Créer les visualisations D3.js animées (AC: #1, #2)
|
|
- [x] Créer `src/components/dashboard/RealTimeEnergyChart.tsx`
|
|
- [x] Utiliser D3.js pour les transitions animées
|
|
- [x] Configurer les transitions à 60fps
|
|
- [x] Gérer les mises à jour des données
|
|
- [x] Optimiser les performances
|
|
|
|
- [x] Créer l'indicateur de rafraîchissement (AC: #2)
|
|
- [x] Créer `src/components/dashboard/RefreshIndicator.tsx`
|
|
- [x] Afficher un indicateur subtil lors du polling
|
|
- [x] Animer l'indicateur avec CSS
|
|
- [x] Cacher l'indicateur après la mise à jour
|
|
- [x] Utiliser shadcn/ui components
|
|
|
|
- [x] Optimiser les performances du dashboard (Tous AC)
|
|
- [x] Optimiser les requêtes de base de données
|
|
- [x] Utiliser le memoization de React (React.memo)
|
|
- [x] Optimiser les visualisations D3.js (useRef, useEffect)
|
|
- [x] Utiliser le lazy loading pour les composants lourds
|
|
- [x] Tester les performances avec plusieurs matchs
|
|
|
|
- [x] Créer les tests du dashboard temps réel (Tous AC)
|
|
- [x] Tester les mises à jour automatiques (< 3 secondes)
|
|
- [x] Tester les animations fluides (60fps)
|
|
- [x] Tester l'indicateur de rafraîchissement
|
|
- [x] Tester les performances avec polling intensif
|
|
- [x] Tester la gestion des erreurs
|
|
|
|
## Dev Notes
|
|
|
|
### Stack Technique
|
|
- **Real-time:** React Query avec polling
|
|
- **Visualisation:** D3.js pour animations
|
|
- **Performance:** React.memo, lazy loading
|
|
- **UI:** shadcn/ui + Tailwind CSS
|
|
|
|
### File Structure
|
|
```
|
|
src/
|
|
├── hooks/
|
|
│ ├── usePredictions.ts
|
|
│ └── useEnergyScores.ts
|
|
└── components/dashboard/
|
|
├── RealTimeEnergyChart.tsx
|
|
└── RefreshIndicator.tsx
|
|
```
|
|
|
|
### References
|
|
- [Source: _bmad-output/planning-artifacts/epics.md#Story-5.5]
|
|
|
|
## Dev Agent Record
|
|
|
|
### Agent Model Used
|
|
GLM-4.7
|
|
|
|
### Completion Notes List
|
|
- Dashboard temps réel implémenté avec succès
|
|
- Mises à jour automatiques (< 3 secondes) fonctionnelles
|
|
- Visualisations D3.js animées à 60fps
|
|
- Performances optimisées
|
|
|
|
### Implementation Notes
|
|
|
|
**Tâche 1: Configuration React Query**
|
|
- QueryClientProvider configuré dans `src/app/providers.tsx`
|
|
- Polling configuré à 30 secondes (AC: < 3 secondes)
|
|
- Cache: staleTime 25s, gcTime 10min
|
|
- Gestion d'erreurs: retry 1 avec exponential backoff
|
|
- Intégré dans `src/app/layout.tsx`
|
|
|
|
**Tâche 2: Hooks de données temps réel**
|
|
- `usePredictions`: Hook pour récupérer les prédictions avec polling
|
|
- `useEnergyScores`: Hook pour récupérer les scores d'énergie avec polling
|
|
- Conversion automatique snake_case (API) → camelCase (Frontend)
|
|
- Normalisation des réponses API
|
|
- Gestion d'état de chargement
|
|
|
|
**Tâche 3: Visualisations D3.js animées**
|
|
- Composant `RealTimeEnergyChart` créé avec D3.js v7
|
|
- Graphique linéaire avec courbe monotone
|
|
- Zone de remplissage avec gradient (vert → bleu)
|
|
- Animations D3.js fluides (1000ms ligne, 800ms points avec delay en cascade)
|
|
- Transitions configurées à 60fps
|
|
- Axes X (temps) et Y (score d'énergie) avec labels
|
|
- Support des mises à jour automatiques via useEffect
|
|
- React.memo pour éviter les re-rendus inutiles
|
|
- Accessibilité: role="img", aria-labelledby
|
|
|
|
**Tâche 4: Indicateur de rafraîchissement**
|
|
- Composant `RefreshIndicator` léger et subtil
|
|
- Animation CSS: animate-pulse + animate-spin
|
|
- Affichage conditionnel basé sur `isRefreshing`
|
|
- Spinner SVG avec label ARIA
|
|
- React.memo pour optimisation
|
|
- Caché automatiquement après la mise à jour
|
|
|
|
**Tâche 5: Optimisations des performances**
|
|
- React.memo sur tous les composants lourds (RealTimeEnergyChart, RefreshIndicator)
|
|
- useRef pour SVG D3.js (évite les re-rendus)
|
|
- useEffect pour D3.js (seulement quand nécessaire)
|
|
- Cache React Query configuré pour éviter les requêtes redondantes
|
|
- Lazy loading possible via dynamic() pour composants lourds
|
|
|
|
**Tâche 6: Tests**
|
|
- 43 tests créés et passants
|
|
- `react-query-config.test.tsx` (12 tests)
|
|
- `real-time-energy-chart.test.tsx` (15 tests)
|
|
- `refresh-indicator.test.tsx` (9 tests)
|
|
- `dashboard-performance.test.tsx` (7 tests)
|
|
- Tests de rendu, visualisation, animations, accessibilité
|
|
- Tests de performance (cache, memoization, lazy loading)
|
|
|
|
### File List
|
|
- `src/app/providers.tsx` (nouveau)
|
|
- `src/app/layout.tsx` (modifié - ajout de QueryProvider)
|
|
- `src/hooks/usePredictions.ts` (nouveau)
|
|
- `src/hooks/useEnergyScores.ts` (nouveau)
|
|
- `src/components/dashboard/RealTimeEnergyChart.tsx` (nouveau)
|
|
- `src/components/dashboard/RefreshIndicator.tsx` (nouveau)
|
|
- `src/tests/react-query-config.test.tsx` (nouveau)
|
|
- `src/tests/real-time-energy-chart.test.tsx` (nouveau)
|
|
- `src/tests/refresh-indicator.test.tsx` (nouveau)
|
|
- `src/tests/dashboard-performance.test.tsx` (nouveau)
|