import 'package:dio/dio.dart'; import '../constants/api_constants.dart'; import 'api_interceptor.dart'; /// Dio HTTP client configuration class DioClient { late final Dio _dio; String? _authToken; DioClient() { _dio = Dio( BaseOptions( baseUrl: ApiConstants.fullBaseUrl, connectTimeout: Duration(milliseconds: ApiConstants.connectTimeout), receiveTimeout: Duration(milliseconds: ApiConstants.receiveTimeout), sendTimeout: Duration(milliseconds: ApiConstants.sendTimeout), headers: { ApiConstants.contentType: ApiConstants.applicationJson, ApiConstants.accept: ApiConstants.applicationJson, }, ), ); _dio.interceptors.add(ApiInterceptor()); // Add auth interceptor to inject token _dio.interceptors.add( InterceptorsWrapper( onRequest: (options, handler) { if (_authToken != null) { options.headers[ApiConstants.authorization] = 'Bearer $_authToken'; } return handler.next(options); }, ), ); } Dio get dio => _dio; /// Set authentication token for all future requests void setAuthToken(String token) { _authToken = token; } /// Clear authentication token void clearAuthToken() { _authToken = null; } /// Check if auth token is set bool get hasAuthToken => _authToken != null; /// GET request Future get( String path, { Map? queryParameters, Options? options, }) async { return await _dio.get( path, queryParameters: queryParameters, options: options, ); } /// POST request Future post( String path, { dynamic data, Map? queryParameters, Options? options, }) async { return await _dio.post( path, data: data, queryParameters: queryParameters, options: options, ); } /// PUT request Future put( String path, { dynamic data, Map? queryParameters, Options? options, }) async { return await _dio.put( path, data: data, queryParameters: queryParameters, options: options, ); } /// DELETE request Future delete( String path, { dynamic data, Map? queryParameters, Options? options, }) async { return await _dio.delete( path, data: data, queryParameters: queryParameters, options: options, ); } }