58 lines
1.8 KiB
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;
|
|
}
|
|
} |