File size: 1,556 Bytes
b24b684 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | import 'package:dio/dio.dart';
/// Normalised API error with a user-friendly [message].
class ApiException implements Exception {
final String message;
final int? statusCode;
ApiException(this.message, {this.statusCode});
factory ApiException.fromDio(DioException e) {
if (e.type == DioExceptionType.connectionTimeout ||
e.type == DioExceptionType.receiveTimeout ||
e.type == DioExceptionType.sendTimeout) {
return ApiException('Connection timed out. Please try again.');
}
if (e.type == DioExceptionType.connectionError) {
return ApiException(
'Could not reach the server. Check your internet connection.',
);
}
final status = e.response?.statusCode;
final data = e.response?.data;
String message = 'Something went wrong. Please try again.';
if (data is Map && data['detail'] != null) {
final detail = data['detail'];
if (detail is String) {
message = detail;
} else if (detail is List && detail.isNotEmpty) {
// FastAPI validation error shape
final first = detail.first;
if (first is Map && first['msg'] != null) {
message = first['msg'].toString();
}
}
} else if (status == 401) {
message = 'Session expired. Please log in again.';
} else if (status == 403) {
message = 'You do not have permission to do that.';
}
return ApiException(message, statusCode: status);
}
@override
String toString() => message;
}
|