ApiException.fromDioException constructor

ApiException.fromDioException(
  1. DioException error
)

Create ApiException from DioException

Implementation

factory ApiException.fromDioException(DioException error) {
  String message;
  ApiExceptionType type;
  int? statusCode;
  Map<String, dynamic>? errorData;

  switch (error.type) {
    case DioExceptionType.connectionTimeout:
    case DioExceptionType.sendTimeout:
      message = 'Connection timeout. Please check your internet connection.';
      type = ApiExceptionType.timeout;
      break;

    case DioExceptionType.receiveTimeout:
      message = 'Server took too long to respond. Please try again.';
      type = ApiExceptionType.receiveTimeout;
      break;

    case DioExceptionType.badResponse:
      statusCode = error.response?.statusCode;
      errorData = error.response?.data is Map
          ? Map<String, dynamic>.from(error.response!.data)
          : null;

      switch (statusCode) {
        case 400:
          message = _extractErrorMessage(error.response?.data) ??
              'Bad request. Please check your input.';
          type = ApiExceptionType.badRequest;
          break;
        case 401:
          message = 'Unauthorized. Please login again.';
          type = ApiExceptionType.unauthorized;
          break;
        case 403:
          message = 'Forbidden. You don\'t have permission to access this resource.';
          type = ApiExceptionType.forbidden;
          break;
        case 404:
          message = 'Resource not found.';
          type = ApiExceptionType.notFound;
          break;
        case 500:
        case 502:
        case 503:
          message = 'Server error. Please try again later.';
          type = ApiExceptionType.internalServerError;
          break;
        default:
          message = _extractErrorMessage(error.response?.data) ??
              'Something went wrong. Please try again.';
          type = ApiExceptionType.unknown;
      }
      break;

    case DioExceptionType.cancel:
      message = 'Request was cancelled.';
      type = ApiExceptionType.cancel;
      break;

    case DioExceptionType.connectionError:
      if (error.message?.contains('SocketException') ?? false) {
        message = 'No internet connection. Please check your network.';
        type = ApiExceptionType.noInternet;
      } else if (error.message?.contains('CERTIFICATE') ?? false) {
        message = 'SSL certificate verification failed.';
        type = ApiExceptionType.badCertificate;
      } else {
        message = 'Connection error. Please check your internet connection.';
        type = ApiExceptionType.socketException;
      }
      break;

    case DioExceptionType.badCertificate:
      message = 'SSL certificate is invalid.';
      type = ApiExceptionType.badCertificate;
      break;

    case DioExceptionType.unknown:
    if (error.error.toString().contains('SocketException')) {
        message = 'No internet connection. Please check your network.';
        type = ApiExceptionType.noInternet;
      } else {
        message = error.message ?? 'An unexpected error occurred.';
        type = ApiExceptionType.unknown;
      }
  }

  return ApiException(
    message: message,
    type: type,
    statusCode: statusCode,
    originalError: error,
    stackTrace: error.stackTrace,
    errorData: errorData,
  );
}