ApiClient constructor
ApiClient(
- 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
},
));
}