parseAPIResponse<T> function

Future parseAPIResponse<T>({
  1. required Future<Response> response,
  2. required T fromJson(
    1. Map
    ),
  3. required String defaultErrorMessage,
  4. bool? checkDefaultStatusCode,
  5. bool? returnTrueForSuccess,
  6. dynamic onSuccess(
    1. T
    )?,
  7. dynamic onFailure(
    1. ErrorCodeAndMessage
    )?,
})

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;
  }
}