Skip to content

Instantly share code, notes, and snippets.

@mondoktamas
Created March 9, 2022 08:30
Show Gist options
  • Save mondoktamas/01ccf4563a30df4e979debaadab6a6ad to your computer and use it in GitHub Desktop.
Save mondoktamas/01ccf4563a30df4e979debaadab6a6ad to your computer and use it in GitHub Desktop.
import 'package:dio/dio.dart';
import 'package:skogluft/application/data/datasource/auth_local_data_store.dart';
import 'package:skogluft/application/data/datasource/auth_service.dart';
import 'package:skogluft/application/di/injection.dart';
class TokenInterceptor extends InterceptorsWrapper {
TokenInterceptor({
final InterceptorSuccessCallback? onResponse,
}) : super(
onRequest: (requestOptions, handler) async {
final authStore = getIt<AuthLocalDataStore>();
final token = await authStore.getAccessToken();
if (token != null) {
requestOptions.headers['Authorization'] = 'Bearer $token';
}
handler.next(requestOptions);
},
onResponse: onResponse,
onError: (error, handler) async {
if (error.response != null && error.response?.statusCode == 401) {
final _dio = getIt<Dio>();
_dio.interceptors.requestLock.lock();
_dio.interceptors.responseLock.lock();
final requestOptions = error.requestOptions;
final authStore = getIt<AuthLocalDataStore>();
final refreshToken = await authStore.getRefreshToken();
final authModel = await AuthService(Dio()).refreshToken('Bearer $refreshToken');
await authStore.storeAccessToken(authModel.authenticationResult.accessToken);
_dio.interceptors.requestLock.unlock();
_dio.interceptors.responseLock.unlock();
final response = await _dio.fetch(requestOptions);
handler.resolve(response);
} else {
handler.next(error);
}
},
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment