call static method
Implementation
static Future<ResponseData<Map<String, dynamic>>> call({
Map<String, dynamic>? responseStatusValue,
required Future<Response> request,
required Map<String, dynamic> Function(Map<String, dynamic>) data,
Function(ResponseData)? error,
}) async {
try {
final result = await request;
AppUtils.log(result.statusCode);
AppUtils.log(result.body);
final responseBody = jsonDecode(result.body) as Map<String, dynamic>;
if (result.statusCode >= 200 && result.statusCode < 300) {
// Checking internal API 'statusCode' if provided
final apiStatusCode = responseBody['statusCode'];
final apiMessage = responseBody['message'] ?? 'Unknown error';
bool isStatusOk = responseStatusValue != null
? responseBody[responseStatusValue['key']] == responseStatusValue['value']
: apiStatusCode == 200 || apiStatusCode == 201;
if (isStatusOk) {
return ResponseData<Map<String, dynamic>>(
data: data(responseBody),
statusCode: result.statusCode,
);
} else {
// even for 200 HTTP, API 'statusCode' failed
return ResponseData<Map<String, dynamic>>(
data: responseBody,
statusCode: result.statusCode,
error: Exception(apiMessage),
);
}
} else {
// HTTP non-2xx status codes
String errorMsg = _statusErrors(result.statusCode);
try {
final errorBody = jsonDecode(result.body) as Map<String, dynamic>;
if (errorBody.containsKey('message')) {
errorMsg = errorBody['message'];
} else if (errorBody.containsKey('message')) {
errorMsg = errorBody['message'];
}
} catch (e) {
// failed to parse error body
}
return ResponseData<Map<String, dynamic>>(
statusCode: result.statusCode,
error: Exception(errorMsg),
message: errorMsg,
);
}
} catch (e) {
return error?.call(
ResponseData<Map<String, dynamic>>(
error: Exception(e.toString()),
message: e.toString(),
),
) ?? ResponseData<Map<String, dynamic>>(
error: Exception(e.toString()),
message: e.toString(),
);
}
}