import 'package:dio/dio.dart'; abstract class Failure { final String errMessage; Failure(this.errMessage); } class ServerFailure extends Failure { ServerFailure(super.errMessage); @override String toString() { return errMessage; } factory ServerFailure.fromDioError(DioException dioError) { switch (dioError.type) { case DioExceptionType.connectionTimeout: return ServerFailure('Connection timeout with the Server.'); case DioExceptionType.sendTimeout: return ServerFailure('Send timeout with the Server.'); case DioExceptionType.receiveTimeout: return ServerFailure('Receive timeout with the Server.'); case DioExceptionType.badCertificate: return ServerFailure('Bad certificate!'); case DioExceptionType.badResponse: { // var document = parser.parse(dioError.response!.data.toString()); // var message = document.body!.text; return ServerFailure.fromResponse(dioError.response!.statusCode, dioError.response?.data['message'] ?? 'Error'); } case DioExceptionType.cancel: return ServerFailure('The request to ApiServer was canceled'); case DioExceptionType.connectionError: return ServerFailure('No Internet Connection'); case DioExceptionType.unknown: return ServerFailure('Unexpected Error, Please try again!'); default: return ServerFailure('Unexpected Error, Please try again!'); } } factory ServerFailure.fromResponse(int? statusCode, dynamic responseMessage) { switch (statusCode) { case 401: case 403: return ServerFailure(responseMessage); case 400: final errors = []; if (responseMessage is List) { for (final error in responseMessage) { errors.add(error); } } else { return ServerFailure(responseMessage); } return ServerFailure(errors.join('\n')); case 404: return ServerFailure(''); case 500: return ServerFailure(responseMessage); default: return ServerFailure('Opps there was an Error, Please try again!'); } } }