parseAPIResponseV2<T, D> function

Future<({D? error, T? success})> parseAPIResponseV2<T, D>({
  1. required Future<Response> call,
  2. List<String>? successStatusCodes,
  3. required T fromJsonSuccess(
    1. Map
    ),
  4. required D fromJsonFailure(
    1. Map
    ),
  5. dynamic onSuccess(
    1. T
    )?,
  6. dynamic onFailure(
    1. D
    )?,
})

Default successStatusCodes value is '200'.

Implementation

Future<({T? success, D? error})> parseAPIResponseV2<T, D>({
  required final Future<Response> call,
  List<String>? successStatusCodes,
  required final T Function(Map<dynamic, dynamic>) fromJsonSuccess,
  required final D Function(Map<dynamic, dynamic>) fromJsonFailure,
  final Function(T)? onSuccess,
  final Function(D)? onFailure,
}) async {
  final res = await call;

  final statusCode = res.response?.statusCode.toString();

  if (res.status == ResponseStatus.connectionError ||
      res.status == ResponseStatus.timeout ||
      res.status == ResponseStatus.unknownException) {
    final resFailure = fromJsonFailure({
      'code': statusCode,
      'message': res.status == ResponseStatus.connectionError
          ? connectionErrorMessage ?? 'No Internet Connection!'
          : res.status == ResponseStatus.timeout
              ? 'Connection timeout!'
              : 'Unknown Exception!',
    });

    onFailure?.call(resFailure);

    return (success: null, error: resFailure);
  }

  try {
    final map = jsonDecode(res.response!.body);

    successStatusCodes ??= ['200'];

    if (successStatusCodes.contains(statusCode)) {
      final resSuccess = fromJsonSuccess(map);

      onSuccess?.call(resSuccess);

      return (success: resSuccess, error: null);
    } else {
      final resFailure = fromJsonFailure(map);

      onFailure?.call(resFailure);

      return (success: null, error: resFailure);
    }
  } catch (error) {
    final errorMsg = error.toString();

    printDebugLogFail(
      tag: 'parseAPIResponseV2',
      message: errorMsg,
    );

    final resFailure = fromJsonFailure({
      'code': statusCode,
      'message': errorMsg,
    });

    onFailure?.call(resFailure);

    return (success: null, error: resFailure);
  }
}