fix: Fehlerbehandlung beim Laden und Meldungen überarbeiten
Reklamationen der Fahrer: Meldungen verdeckten Buttons, und nach dem Abschluss stand „Lieferung nicht in der Tour gefunden" ohne Ausweg da. Meldungen: - Erfolgs-SnackBars entfernt, bei Erfolg bleibt der Spinner - einheitliche, schwebende Meldungen statt Stau über den Buttons - Server-Rohtexte durch verständliche Texte ersetzt (api_failure_text) Laden: - fehlt eine geöffnete Lieferung, wird die Tour einmal neu geholt; die Meldung kommt nur nach erfolgreichem Abruf ohne die Lieferung - Endlos-Spinner auf Lieferdetail, Filial-Abholung und Beladen ersetzt durch Kopfzeile, Fehlergrund und „Erneut versuchen" - Tour wird nach einem Tageswechsel nachgeladen, offene Seiten bleiben dabei unberührt - Abschluss und Zuweisung überschreiben kein zwischenzeitliches Neuladen, alte Antworten drehen einen Abschluss nicht mehr zurück - leere Server-Antworten gelten als Fehler statt als „keine Daten" Anmeldung: - Token-Erneuerung wartet höchstens 12 s, der native Aufruf läuft weiter - App-Start ohne Netz zeigt einen Hinweis mit „Erneut versuchen" - Fehlerseite der Fahrzeugauswahl bietet „Abmelden" Außerdem Podfile.lock an die Plugins angeglichen. Tests für die neuen Fehlerpfade ergänzt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@ -2,6 +2,7 @@ import 'package:dio/dio.dart';
|
||||
import 'package:holzleitner_api/holzleitner_api.dart' as api;
|
||||
|
||||
import 'package:hl_lieferservice/data/mapper/car_mapper.dart';
|
||||
import 'package:hl_lieferservice/data/network/api_failure_text.dart';
|
||||
import 'package:hl_lieferservice/domain/entity/car.dart';
|
||||
import 'package:hl_lieferservice/domain/repository/cars_repository.dart';
|
||||
|
||||
@ -25,7 +26,12 @@ class CarsRepositoryImpl implements CarsRepository {
|
||||
includeInactive: includeInactive,
|
||||
);
|
||||
final cars = response.data?.cars;
|
||||
if (cars == null) return const [];
|
||||
// Eine leere Antwort ist ein Fehler, nicht „keine Fahrzeuge".
|
||||
if (cars == null) {
|
||||
throw const CarsRepositoryException(
|
||||
'Fahrzeuge konnten nicht geladen werden. Bitte erneut versuchen',
|
||||
);
|
||||
}
|
||||
return cars.toDomainList();
|
||||
} on DioException catch (e) {
|
||||
throw CarsRepositoryException(_describe(e, 'Laden der Fahrzeuge'), e);
|
||||
@ -83,14 +89,13 @@ class CarsRepositoryImpl implements CarsRepository {
|
||||
|
||||
/// Übersetzt eine DioException in eine kompakte, UI-taugliche
|
||||
/// Begründung. Mehr Detail landet im Log, nicht in der Snackbar.
|
||||
String _describe(DioException e, String operation) {
|
||||
final status = e.response?.statusCode;
|
||||
final body = e.response?.data;
|
||||
if (status == 400 && body is Map && body['message'] != null) {
|
||||
return '$operation fehlgeschlagen: ${body['message']}';
|
||||
}
|
||||
if (status == 401) return 'Sitzung abgelaufen';
|
||||
if (status == 404) return 'Fahrzeug nicht gefunden';
|
||||
return '$operation fehlgeschlagen (HTTP ${status ?? 'unbekannt'})';
|
||||
}
|
||||
String _describe(DioException e, String operation) => describeApiFailure(
|
||||
e,
|
||||
operation: operation,
|
||||
byStatus: const {404: 'Fahrzeug nicht gefunden'},
|
||||
byServerText: const {
|
||||
'existiert bereits': 'Dieses Kennzeichen ist bereits vergeben',
|
||||
'plate darf nicht leer': 'Bitte ein Kennzeichen eingeben',
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user