call static method

Future<ResponseData<Map<String, dynamic>>> call({
  1. Map<String, dynamic>? responseStatusValue,
  2. required Future<Response> request,
  3. required Map<String, dynamic> data(
    1. Map<String, dynamic>
    ),
  4. dynamic error(
    1. ResponseData
    )?,
})

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(),
    );

  }
}