# 2.3 — UI lecteur + contrôleur Riverpod ## Objectif Offrir un lecteur utilisable par l'enfant : gros boutons lecture/pause, précédent/suivant, barre de progression, titre de l'histoire en cours. ## Périmètre & hors-périmètre - Inclus : contrôleur Riverpod (`AsyncNotifier`/`Notifier`) consommant les use cases, widget lecteur. - Exclus : la liste des histoires (jalon 4) ; ici on teste avec une file en dur. ## Dépendances 2.1, 2.2. ## Conception - **Presentation** (`features/playback/presentation/`) : - `PlaybackController` (Riverpod `Notifier`) : expose `PlaybackState`, méthodes `play/pause/next/previous/seek` déléguant aux use cases ; s'abonne à `WatchPlaybackStateUseCase`. - `PlayerView` (widget) : grand bouton central play/pause (icône claire), boutons précédent/suivant, `Slider` de progression, titre + vignette. - Composants tactiles larges, lisibles le soir (thème de 0.3). - Pas de logique métier dans le widget : tout passe par le contrôleur → use cases. ## Plan TDD 1. **Red** : `playback_controller_test.dart` — avec use cases mockés, `play()` appelle `TogglePlayPauseUseCase` ; l'état du contrôleur reflète les `PlaybackState` émis. 2. **Green** : implémenter le contrôleur. 3. **Red** : `player_view_test.dart` (widget) — tap sur le bouton play déclenche `controller.play` (provider overridé par un mock) ; l'icône bascule play/pause selon l'état ; le titre s'affiche. 4. **Green** : implémenter le widget. 5. **Refactor**. ## Definition of Done - Tests contrôleur + widget verts. - Démo manuelle : avec une file en dur, lecture/pause/suivant/seek fonctionnent et l'UI suit. - `tool/check.sh` passe ; étape 2.3 cochée dans `ROADMAP.md`. ## Risques / notes - Soigner l'accessibilité tactile (taille des cibles) dès maintenant : c'est l'écran que l'enfant manipule.