networkRequest<T> method

Future<T?> networkRequest<T>(
  1. Future<T> request(
    1. CancelToken cancelToken
    ), {
  2. required dynamic onSuccess(
    1. T response
    ),
  3. bool showLoadingBar = true,
  4. bool showProgress = false,
  5. FutureOr<void> handleError(
    1. dynamic
    )?,
  6. FutureOr<void> handleErrorCode(
    1. dynamic
    )?,
  7. dynamic errorAction()?,
  8. CancelToken? cancelToken,
  9. dynamic handleErrorMessage(
    1. T response
    )?,
})

Implementation

Future<T?> networkRequest<T>(
  Future<T> Function(CancelToken cancelToken) request, {
  required Function(T response) onSuccess,
  bool showLoadingBar = true,
  bool showProgress = false,
  FutureOr<void> Function(dynamic)? handleError,
  FutureOr<void> Function(dynamic)? handleErrorCode,
  Function()? errorAction,
  CancelToken? cancelToken,
  Function(T response)? handleErrorMessage,
}) async {
  // Create a cancel token if not provided
  final token = cancelToken ?? createCancelToken();

  if (showLoadingBar) {
    loadingController.add(LoadingNonRenderState());
  }

  try {
    // Call request with the cancel token
    final response = await request(token);

    // Remove token from list if request completed successfully
    _cancelTokens.remove(token);

    if (showLoadingBar) {
      loadingController.add(EndLoadingNonRenderState());
    }
    // FBLogger.log("Response success: $response");
    if (!isClosed) {
      if (response is BaseModel) {
        if (response.isSuccess) {
          onSuccess(response);
          return response;
        } else {
          if (handleErrorMessage != null) {
            handleErrorMessage.call(response);
          } else {
            errorController.add(ErrorState(response.message!));
            errorAction?.call();
          }
          return null; // Return null when request fails
        }
      } else {
        onSuccess(response);
        return response;
      }
    }

    // Return response even if bloc is closed (for callers who need the value)
    return response;
  } catch (error) {
    // Remove token from list when request completes (success or error)
    _cancelTokens.remove(token);

    if (showLoadingBar) {
      loadingController.add(EndLoadingNonRenderState());
    }

    // Don't process errors if request was cancelled
    if (error is DioException && error.type == DioExceptionType.cancel) {
      // FBLogger.log("Request was cancelled");
      // Return null for cancelled requests
      return null;
    }

    // FBLogger.log("Error occurred: $error");
    // Log non-fatal errors to Crashlytics for debugging
    // await FBLogger.recordError(
    //   error,
    //   stackTrace,
    //   reason: 'Network request error',
    //   fatal: false,
    // );

    if (handleError != null) {
      await handleError(error);
      errorAction?.call();
      return null; // Return null when error is handled
    } else {
      await handleResponse(
        error,
        (CancelToken ct) => request(ct),
        showLoadingBar: showLoadingBar,
        showProgress: showProgress,
        onSuccess: onSuccess,
        handleErrorCode: handleErrorCode,
      );
      if (errorAction != null) {
        errorAction();
      }
      return null; // Return null after error handling
    }
  }
}