e20b1905cb
- Move FormzInput validators to core/form_inputs/form_inputs.dart - Fix login_screen.dart syntax error (missing 'class' keyword) - Remove unused _isLoading field - Fix unnecessary const keywords - Update login_cubit and register_cubit imports - Remove duplicate FormzInput definitions from register_cubit - Add Toast and Banner UI feedback system - Remove legacy login/register screens (login_code, login_email, login_password, register_step2) - Remove unused warning_banner widget - Update tests for new error messages and DI setup
67 lines
1.6 KiB
Dart
67 lines
1.6 KiB
Dart
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 ApiInterceptor _interceptor;
|
|
|
|
factory ApiClient({
|
|
required String baseUrl,
|
|
required TokenStorage tokenStorage,
|
|
Dio? dio,
|
|
}) {
|
|
final effectiveDio = dio ?? Dio(BaseOptions(baseUrl: baseUrl));
|
|
final interceptor = ApiInterceptor(
|
|
tokenStorage: tokenStorage,
|
|
dio: effectiveDio,
|
|
);
|
|
effectiveDio.interceptors.add(interceptor);
|
|
return ApiClient._(
|
|
dio: effectiveDio,
|
|
tokenStorage: tokenStorage,
|
|
interceptor: interceptor,
|
|
);
|
|
}
|
|
|
|
ApiClient._({
|
|
required Dio dio,
|
|
required TokenStorage tokenStorage,
|
|
required ApiInterceptor interceptor,
|
|
}) : _dio = dio,
|
|
_tokenStorage = tokenStorage,
|
|
_interceptor = interceptor;
|
|
|
|
Dio get dio => _dio;
|
|
|
|
void setRefreshCallback(Future<bool> Function(String) refresh) {
|
|
_interceptor.onTokenRefresh = () async {
|
|
final token = await _tokenStorage.getRefreshToken();
|
|
if (token == null) return false;
|
|
return refresh(token);
|
|
};
|
|
}
|
|
|
|
Future<Response<T>> get<T>(String path, {Options? options}) async {
|
|
try {
|
|
return await _dio.get<T>(path, options: options);
|
|
} on DioException catch (e) {
|
|
throw ApiException.fromDioError(e);
|
|
}
|
|
}
|
|
|
|
Future<Response<T>> post<T>(
|
|
String path, {
|
|
dynamic data,
|
|
Options? options,
|
|
}) async {
|
|
try {
|
|
return await _dio.post<T>(path, data: data, options: options);
|
|
} on DioException catch (e) {
|
|
throw ApiException.fromDioError(e);
|
|
}
|
|
}
|
|
}
|