feat(etas): mémoriser la direction sélectionnée du drawer d’horaires (par arrêt + ligne) #5

Closed
opened 2026-06-23 19:35:11 +02:00 by CyrilLeblanc · 0 comments
Owner

Contexte

Dans la bottom-sheet des horaires, chaque ligne d'un arrêt est un carrousel horizontal (HorizontalPager dans ui/components/LineRow.kt) : on swipe entre les directions de la ligne. Exemple : à l'arrêt Victor Hugo, ligne C11, une page pour la direction « Lumbin », une page pour l'autre direction.

Aujourd'hui le pagerState repart toujours à la page 0 à chaque ouverture/relance. Conséquence : sur un trajet quotidien, il faut re-swiper sur la bonne direction à chaque fois.

Comportement attendu

  • Mémoriser la dernière direction consultée pour un couple (arrêt, ligne), et la ré-afficher automatiquement à la prochaine ouverture — y compris après un redémarrage de l'app.
  • Clé : (stopId/clusterId, lineId) → direction préférée.
  • Persistant sur disque (DataStore / SharedPreferences), pas seulement en mémoire.
  • Mis à jour à chaque swipe.

Stratégie de rappel retenue : dernière direction vue — une seule valeur par (arrêt, ligne), écrasée à chaque swipe.

⚠️ Limite acceptée : sur une ligne utilisée dans les deux sens (aller/retour quotidien), la valeur flip d'un jour à l'autre → il restera un swipe aux alternances. Couvre néanmoins la majorité des cas (lignes à un seul sens, ou usage répété du même sens).

Pistes d'implémentation

  • LineRow.kt : rememberPagerState(pageCount = { groups.size }) démarre à 0 → lui passer la page mémorisée comme initialPage, et persister pagerState.currentPage (via snapshotFlow { currentPage } ou LaunchedEffect) dans le store.
  • Stocker la destination (et non l'index) comme valeur — robuste au réordonnancement des pages d'une version à l'autre. Au rendu, résoudre l'index de la page dont la destination correspond.
  • I/O non bloquante (coroutine) ; repli sur la page 0 si la valeur est absente ou ne correspond plus à aucune direction.

Critères d'acceptation

  • Ouvrir un arrêt, swiper une ligne sur une direction, fermer puis rouvrir la bottom-sheet → la même direction réapparaît.
  • Tuer et relancer l'app → la direction est conservée.
  • Indépendance entre deux arrêts d'une même ligne, et entre deux lignes d'un même arrêt.
  • Si la direction mémorisée n'existe plus (ligne modifiée) → repli sûr sur la page 0, pas de crash.
## Contexte Dans la bottom-sheet des horaires, chaque ligne d'un arrêt est un carrousel horizontal (`HorizontalPager` dans `ui/components/LineRow.kt`) : on swipe entre les **directions** de la ligne. Exemple : à l'arrêt **Victor Hugo, ligne C11**, une page pour la direction « Lumbin », une page pour l'autre direction. Aujourd'hui le `pagerState` repart toujours à la **page 0** à chaque ouverture/relance. Conséquence : sur un trajet quotidien, il faut re-swiper sur la bonne direction à chaque fois. ## Comportement attendu - Mémoriser la **dernière direction consultée** pour un couple **(arrêt, ligne)**, et la ré-afficher automatiquement à la prochaine ouverture — y compris après un redémarrage de l'app. - Clé : `(stopId/clusterId, lineId)` → direction préférée. - Persistant sur disque (DataStore / SharedPreferences), pas seulement en mémoire. - Mis à jour à chaque swipe. **Stratégie de rappel retenue** : *dernière direction vue* — une seule valeur par (arrêt, ligne), écrasée à chaque swipe. ⚠️ Limite acceptée : sur une ligne utilisée dans les deux sens (aller/retour quotidien), la valeur flip d'un jour à l'autre → il restera un swipe aux alternances. Couvre néanmoins la majorité des cas (lignes à un seul sens, ou usage répété du même sens). ## Pistes d'implémentation - `LineRow.kt` : `rememberPagerState(pageCount = { groups.size })` démarre à 0 → lui passer la page mémorisée comme `initialPage`, et persister `pagerState.currentPage` (via `snapshotFlow { currentPage }` ou `LaunchedEffect`) dans le store. - Stocker la **destination** (et non l'index) comme valeur — robuste au réordonnancement des pages d'une version à l'autre. Au rendu, résoudre l'index de la page dont la `destination` correspond. - I/O non bloquante (coroutine) ; repli sur la page 0 si la valeur est absente ou ne correspond plus à aucune direction. ## Critères d'acceptation - [ ] Ouvrir un arrêt, swiper une ligne sur une direction, fermer puis rouvrir la bottom-sheet → la même direction réapparaît. - [ ] Tuer et relancer l'app → la direction est conservée. - [ ] Indépendance entre deux arrêts d'une même ligne, et entre deux lignes d'un même arrêt. - [ ] Si la direction mémorisée n'existe plus (ligne modifiée) → repli sûr sur la page 0, pas de crash.
Sign in to join this conversation.
No milestone
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
CyrilLeblanc/gresit#5
No description provided.