import 'package:dio/dio.dart'; import '../../data/repositories/auth_repository.dart'; class AuthInterceptor extends Interceptor { final AuthRepository _authRepository; final Dio _dio; AuthInterceptor(this._authRepository, this._dio); @override Future onRequest( RequestOptions options, RequestInterceptorHandler handler, ) async { // Skip auth header for login and refresh endpoints if (options.path.contains('/login') || options.path.contains('/auth/refresh')) { return handler.next(options); } // Get token and add to request final token = await _authRepository.getAccessToken(); if (token != null) { options.headers['Authorization'] = 'Bearer $token'; } return handler.next(options); } @override Future onError( DioException err, ErrorInterceptorHandler handler, ) async { // Handle 401 errors by refreshing token and retrying if (err.response?.statusCode == 401) { // On 401, try to get a new token final token = await _authRepository.getAccessToken(); if (token != null) { // If we have a new token, retry the request final opts = err.requestOptions; opts.headers['Authorization'] = 'Bearer $token'; try { final response = await _dio.fetch(opts); return handler.resolve(response); } on DioException catch (e) { return handler.next(e); } } } return handler.next(err); } }