ApiClient constructor

ApiClient(
  1. String initialBaseUrl
)

Implementation

ApiClient(String initialBaseUrl) {
  _baseUrl = initialBaseUrl; // Set initial base URL
  _dio = Dio(BaseOptions(
    baseUrl: _baseUrl,
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
    },
    connectTimeout: const Duration(seconds: 45),
    receiveTimeout: const Duration(seconds: 45),
  ));

  // Use platform-specific HttpClientAdapter
  // _dio.httpClientAdapter = getHttpClientAdapter();

  _dio.interceptors.add(InterceptorsWrapper(
    onRequest: (options, handler) {
      final token = storageUtils.getToken();
      if (token != null) {
        options.headers['Authorization'] = token;
      }

      if (kDebugMode) {
        logger.i('Request: ${options.method} ${options.uri}');
        if (options.headers.isNotEmpty) {
          logger.d('Headers: ${jsonEncode(options.headers)}');
        }
        if (options.queryParameters.isNotEmpty) {
          logger.d('Query Parameters: ${options.queryParameters}');
        }
        if (options.data != null) {
          logger.d('Request Body: ${options.data}');
        }
      }
      return handler.next(options); //continue
    },
    onResponse: (response, handler) {
      if (kDebugMode) {
        logger.w('Response: ${jsonEncode(response.data)}');
      }
      return handler.next(response); // continue
    },
    onError: (DioException error, handler) {
      final apiName = error.requestOptions.uri.toString(); // Extract API name

      if (error.response != null) {
        final statusCode = error.response?.statusCode;
        final errorData = error.response?.data;

        logger.e('\x1B[31m[ERROR] API: $apiName - ${jsonEncode(error.response?.data)}\x1B[0m');

        // Handle different status codes
        switch (statusCode) {
          case 401: // Unauthorized
            _handleInvalidToken(errorData['message'].toString());
            break;

          case 403: // Forbidden
            _handleInvalidToken(errorData['message'].toString());
            break;

          case 440: // Login Timeout (non-standard)
            _handleSessionExpired();
            break;

          // case 404: // Showing Error
          //    AppUtils.showSnackBar(errorData['message'].toString());
          //   break;

          case 500: // Internal Server Error
            AppUtils.showSnackBar(errorData['message'].toString());
            break;

          default:
            print('\x1B[31mUnhandled status code: $statusCode\x1B[0m');
            break;
        }
      }

      // Handle network-related errors
      if (error.type == DioExceptionType.connectionError) {
        logger.e('\x1B[31m[ERROR] Network error: Please check your internet connection.\x1B[0m');
      } else if (error.type == DioExceptionType.connectionTimeout) {
        logger.e('\x1B[31m[ERROR] API: $apiName - Connection Timeout\x1B[0m');
      }

      return handler.next(error); // Continue
    },
  ));
}