Files
mobile/lib/core/api/api_response.dart

58 lines
1.8 KiB
Dart

import 'package:dio/dio.dart';
/// Helpers pour parser les réponses JSON de l'API Laverie (`success` + `data`).
abstract final class ApiResponse { static Map<String, dynamic> payload(dynamic data) {
if (data is Map<String, dynamic>) {
if (data['data'] is Map<String, dynamic>) {
return data['data'] as Map<String, dynamic>;
}
return data;
}
throw StateError('Réponse API inattendue');
}
static List<dynamic> list(dynamic data, String key) {
final value = payload(data)[key];
if (value is List<dynamic>) {
return value;
}
return [];
}
static Map<String, dynamic> object(dynamic data, String key) {
final value = payload(data)[key];
if (value is Map<String, dynamic>) {
return value;
}
throw StateError('Champ API "$key" introuvable ou invalide');
}
static String errorMessage(DioException error, {String fallback = 'Erreur réseau'}) {
final response = error.response;
if (response?.data is Map<String, dynamic>) {
final data = response!.data as Map<String, dynamic>;
final message = data['message'];
if (message is String && message.isNotEmpty) {
return _sanitize(message);
}
}
return switch (error.type) {
DioExceptionType.connectionTimeout ||
DioExceptionType.sendTimeout ||
DioExceptionType.receiveTimeout =>
'Délai d\'attente dépassé',
DioExceptionType.connectionError =>
'Connexion impossible',
_ => fallback,
};
}
/// Masque les détails SQL techniques pour l'utilisateur.
static String _sanitize(String message) {
if (message.contains('SQLSTATE') || message.contains('SQL:') || message.contains('must be of type')) {
return 'Erreur serveur — réessayez dans un instant';
}
return message;
}
}