fix(phasen): Tageswechsel laedt Phasen-Stand der neuen Tour (Reset), alter Tag bleibt

Beim Datumswechsel im Kopf-Kalender blieben Beladen/Ausliefern des alten
Tags 'erledigt': PhaseBloc._load brach bei bereits geladenem Auto ab und
Home stiess den Load nur einmal pro Auto an - der In-Memory-Stand wurde
beim Tour-/Token-Wechsel nie invalidiert. Die Persistenz ist bereits pro
Tour-Token (syncedAt) getrennt, nur das Nachladen fehlte.

- PhaseBloc: Guard tokenbewusst (_loadedTokenByCar); anderer Token laedt den
  persistierten Stand der neuen Tour nach (neuer Tag -> Eintrittsphase,
  Rueckkehr -> alter Stand wiederhergestellt)
- Home._ensurePhaseLoaded: Guard auf carId|tourToken statt nur carId
- Token-Ableitung zentral als TourState.phaseToken (tour_state.dart), genutzt
  von tourTokenResolver (app.dart) UND Home - eine Quelle statt Duplikat

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dennis Nemec
2026-09-09 01:14:56 +02:00
parent c5219343a0
commit 7c6f99dda1
4 changed files with 56 additions and 16 deletions

View File

@ -93,3 +93,22 @@ const Object _sentinel = Object();
class TourEmpty extends TourState {
const TourEmpty();
}
/// Token, der die aktuell geladene **Tour-Version** identifiziert (aus
/// `Tour.syncedAt`). Der `PhaseBloc` bindet die persistierten Phasen-Häkchen
/// daran: ein Tageswechsel im Kopf-Kalender oder ein neuer Sync ergibt einen
/// neuen Token und damit einen eigenen, getrennten Phasen-Stand. `null` =
/// keine Tour geladen (z. B. `TourEmpty`).
///
/// **Einzige Quelle** für diese Ableitung — wird vom `tourTokenResolver` in
/// `app.dart` UND von `Home._ensurePhaseLoaded` genutzt, damit beide Seiten
/// garantiert denselben Token sehen und ein Tour-Wechsel zuverlässig als
/// solcher erkannt wird.
extension TourStatePhaseToken on TourState {
String? get phaseToken {
final s = this;
return s is TourLoaded
? s.details.tour.syncedAt.millisecondsSinceEpoch.toString()
: null;
}
}