onError method

  1. @override
void onError(
  1. DioException err,
  2. ErrorInterceptorHandler handler
)

Called when an exception was occurred during the request.

Implementation

@override
void onError(DioException err, ErrorInterceptorHandler handler) async {
  if (_isTokenExpired(err)) {
    final refresh = await TokenManager.refresh;
    if (refresh != null) {
      try {
        final dio = Dio();
        final response = await dio.post(
          // ApiConfig.refreshTokenEndpoint,
          ApiConfig.baseUrl,
          data: {"refresh_token": refresh},
        );

        final newToken = response.data["access_token"];
        final newRefresh = response.data["refresh_token"];

        await TokenManager.saveTokens(
          access: newToken,
          refresh: newRefresh,
        );

        // Retry original request
        final newReq = err.requestOptions
            .copyWith(headers: {"Authorization": "Bearer $newToken"});

        final retryResponse = await dio.fetch(newReq);
        return handler.resolve(retryResponse);
      } catch (e) {
        await TokenManager.clear();
      }
    }
  }

  super.onError(err, handler);
}