parseAPIResponse<T> function
This method will parse modelWithFromJson
or ErrorCodeAndMessage from response
.
response
is the API's returned data.
modelWithFromJson
is the class what you want back if the response
is success.
ErrorCodeAndMessage will be returned if the response
is fail.
Note: class modelWithFromJson
must have 'fromJson' method.
Implementation
Future<dynamic> parseAPIResponse<T>({
required Future<Response> response,
required T Function(Map<dynamic, dynamic>) fromJson,
required String defaultErrorMessage,
bool? checkDefaultStatusCode,
bool? returnTrueForSuccess,
Function(T)? onSuccess,
Function(ErrorCodeAndMessage)? onFailure,
}) async {
final res = await response;
final statusCode = res.response?.statusCode.toString();
if (res.status == ResponseStatus.unknownException ||
res.status == ResponseStatus.connectionError ||
res.status == ResponseStatus.timeout) {
final error = ErrorCodeAndMessage(
code: statusCode,
message: res.status == ResponseStatus.connectionError
? connectionErrorMessage ?? 'No Internet Connection!'
: res.status == ResponseStatus.timeout
? 'Connection timeout!'
: 'Unknown Exception!',
);
onFailure?.call(error);
return error;
}
try {
final map = jsonDecode(res.response!.body);
final code =
checkDefaultStatusCode == true ? statusCode : map['code']?.toString();
if (code == '200') {
if (returnTrueForSuccess == true) {
return true;
}
final successResponse = fromJson(map);
if (onSuccess != null) {
onSuccess(successResponse);
}
return successResponse;
} else {
final errorResponse = ErrorCodeAndMessage.fromJson(
map,
code: statusCode,
);
if (onFailure != null) {
onFailure(errorResponse);
}
return errorResponse;
}
} catch (error) {
printDebugLogFail(
tag: 'parseAPIResponse',
message: error.toString(),
);
final errorResponse = ErrorCodeAndMessage(
code: statusCode,
message: '$defaultErrorMessage\n$error',
);
if (onFailure != null) {
onFailure(errorResponse);
}
return errorResponse;
}
}