import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; /// Übersetzt eine [DioException] in einen Fehlertext für den Fahrer. /// /// Die `message` des Backends ist für Entwickler gedacht („validation: /// delivery is not active; cannot complete") und erreicht die UI deshalb nie /// direkt: [byServerText] ordnet bekannten Textbausteinen eine verständliche /// Meldung zu, alles andere bekommt einen allgemeinen Text. Das Detail landet /// im Log. String describeApiFailure( DioException e, { required String operation, Map byStatus = const {}, Map byServerText = const {}, }) { final status = e.response?.statusCode; final body = e.response?.data; final serverText = body is Map ? body['message']?.toString() : null; debugPrint('$operation fehlgeschlagen: HTTP $status, ${serverText ?? e.type}'); if (serverText != null) { for (final entry in byServerText.entries) { if (serverText.contains(entry.key)) return entry.value; } } final known = byStatus[status]; if (known != null) return known; if (status == 401) return 'Sitzung abgelaufen'; if (status == null) { return switch (e.type) { DioExceptionType.connectionTimeout || DioExceptionType.sendTimeout || DioExceptionType.receiveTimeout => 'Der Server antwortet nicht. Bitte Verbindung prüfen', _ => 'Server nicht erreichbar. Bitte Verbindung prüfen', }; } return '$operation fehlgeschlagen. Bitte erneut versuchen'; }