loadResponse<T> method

Future<GeneralResponse<T>> loadResponse<T>(
  1. Future<T> executor()
)

Load response from API call and wrap it in GeneralResponse

Implementation

Future<GeneralResponse<T>> loadResponse<T>(
    Future<T> Function() executor) async {
  GeneralResponse<T> resp;

  try {
    resp = GeneralResponse(data: await executor(), statusCode: 200);
    // API Response: Success
  } on DioException catch (e) {
    // API Error logging
    // Error: ${e.message}
    // Type: ${e.type}
    // Response: ${e.response}

    // Handle network/timeout errors
    if ((e.message ?? '').contains('SocketException') ||
        e.type == DioExceptionType.receiveTimeout ||
        e.type == DioExceptionType.connectionTimeout) {
      resp = GeneralResponse<T>(
        statusCode: -1,
        dioException: e,
        apiError: null,
        data: null,
      );
    } else {
      // Parse API error from response
      ApiError? apiError;
      if (e.response != null &&
          e.response?.data != null &&
          e.response?.data is Map<String, dynamic>) {
        apiError = ApiError.fromJson(e.response!.data);
      }
      resp = GeneralResponse(
        statusCode: e.response?.statusCode ?? 400,
        dioException: e,
        apiError: apiError,
        data: null,
      );
    }
  }

  return resp;
}