import 'package:dio/dio.dart'; import 'api_exception.dart'; import 'api_interceptor.dart'; import '../storage/token_storage.dart'; class ApiClient { final Dio _dio; final TokenStorage _tokenStorage; final Future Function(String)? _refreshToken; ApiClient({ required String baseUrl, required TokenStorage tokenStorage, Dio? dio, Future Function(String)? refreshToken, }) : _tokenStorage = tokenStorage, _refreshToken = refreshToken, _dio = dio ?? Dio(BaseOptions(baseUrl: baseUrl)) { _dio.interceptors.add( ApiInterceptor( tokenStorage: _tokenStorage, dio: _dio, onTokenRefresh: _handleTokenRefresh, ), ); } Dio get dio => _dio; Future _handleTokenRefresh() async { final refreshToken = await _tokenStorage.getRefreshToken(); if (refreshToken == null || _refreshToken == null) return false; try { final success = await _refreshToken!(refreshToken); return success; } catch (_) { return false; } } Future> get(String path, {Options? options}) async { try { return await _dio.get(path, options: options); } on DioException catch (e) { throw ApiException.fromDioError(e); } } Future> post( String path, { dynamic data, Options? options, }) async { try { return await _dio.post(path, data: data, options: options); } on DioException catch (e) { throw ApiException.fromDioError(e); } } }