Die Tagesauswahl liegt lokal pro Fahrer und wurde ungeprüft wiederhergestellt. Durch den alten Session-Fehler hatte 414 auf dem Gerät das Fahrzeug von 423 gespeichert — das erschien weiter, obwohl „Fahrzeug verwalten" (frisch vom Server) leer war. CarSelectBloc lädt beim Wiederherstellen die Fahrzeuge des Accounts vom Server und übernimmt die Auswahl nur, wenn das Fahrzeug dazugehört und aktiv ist; sonst wird sie verworfen und neu abgefragt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
98 lines
3.2 KiB
Dart
98 lines
3.2 KiB
Dart
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:hl_lieferservice/feature/car_selection/repository/car_selection_repository.dart';
|
|
import 'package:hl_lieferservice/feature/cars/model/selection.dart';
|
|
import 'package:hl_lieferservice/domain/repository/cars_repository.dart';
|
|
|
|
import 'events.dart';
|
|
import 'state.dart';
|
|
|
|
class CarSelectBloc extends Bloc<CarSelectEvent, CarSelectState> {
|
|
final CarSelectionRepository repository;
|
|
|
|
/// Fahrzeuge des angemeldeten Accounts vom Server — gegen sie wird eine
|
|
/// gespeicherte Tagesauswahl geprüft.
|
|
final CarsRepository carsRepository;
|
|
|
|
CarSelectBloc({required this.repository, required this.carsRepository})
|
|
: super(CarSelectInitial()) {
|
|
on<CarSelectLoad>(_load);
|
|
on<CarSelectConfirm>(_confirm);
|
|
on<CarSelectChange>(_change);
|
|
on<CarSelectCancel>(_cancel);
|
|
}
|
|
|
|
Future<void> _load(
|
|
CarSelectLoad event,
|
|
Emitter<CarSelectState> emit,
|
|
) async {
|
|
try {
|
|
emit(CarSelectLoading());
|
|
|
|
final CarSelection? stored = await repository.getSelection(event.userId);
|
|
final today = DateTime.now();
|
|
|
|
final bool validForToday =
|
|
stored != null &&
|
|
stored.selectedCarId != null &&
|
|
stored.selectedCarPlate != null &&
|
|
stored.date.year == today.year &&
|
|
stored.date.month == today.month &&
|
|
stored.date.day == today.day;
|
|
|
|
if (validForToday) {
|
|
// Die lokale Auswahl ist nur ein Zeiger. Sie gilt nur, wenn das
|
|
// Fahrzeug laut Server (frisch geladen) zu diesem Account gehört
|
|
// und aktiv ist — sonst z. B. ein Fahrzeug eines anderen Fahrers,
|
|
// das auf diesem Gerät gewählt wurde.
|
|
final ownCars = await carsRepository.listMine();
|
|
final car = ownCars
|
|
.where((c) => c.id == stored.selectedCarId && c.active)
|
|
.firstOrNull;
|
|
if (car != null) {
|
|
emit(CarSelectComplete(selectedCar: car));
|
|
return;
|
|
}
|
|
await repository.clearSelection(event.userId);
|
|
}
|
|
emit(CarSelectRequired());
|
|
} catch (e, st) {
|
|
debugPrint('CarSelectBloc._load failed: $e');
|
|
debugPrint('Stacktrace: $st');
|
|
emit(CarSelectFailed());
|
|
}
|
|
}
|
|
|
|
void _change(CarSelectChange event, Emitter<CarSelectState> emit) {
|
|
final previousCar =
|
|
state is CarSelectComplete ? (state as CarSelectComplete).selectedCar : null;
|
|
emit(CarSelectRequired(previousCar: previousCar));
|
|
}
|
|
|
|
void _cancel(CarSelectCancel event, Emitter<CarSelectState> emit) {
|
|
// Restore without touching SharedPreferences — no tour reload needed.
|
|
emit(CarSelectComplete(selectedCar: event.car));
|
|
}
|
|
|
|
Future<void> _confirm(
|
|
CarSelectConfirm event,
|
|
Emitter<CarSelectState> emit,
|
|
) async {
|
|
try {
|
|
final today = DateTime.now();
|
|
await repository.saveSelection(
|
|
event.userId,
|
|
CarSelection(
|
|
date: today,
|
|
selectedCarId: event.car.id,
|
|
selectedCarPlate: event.car.plate,
|
|
),
|
|
);
|
|
emit(CarSelectComplete(selectedCar: event.car));
|
|
} catch (e, st) {
|
|
debugPrint('CarSelectBloc._confirm failed: $e');
|
|
debugPrint('Stacktrace: $st');
|
|
emit(CarSelectFailed());
|
|
}
|
|
}
|
|
} |