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 (err.response?.statusCode == 401 && tokenRefreshCallback != null) {
    final refreshToken = await tokenManager.refreshToken;

    if (refreshToken != null) {
      try {
        final refreshResult = await tokenRefreshCallback!(refreshToken);

        await refreshResult.fold(
          (error) async {
            await tokenManager.clearTokens();
            onTokenExpired?.call();
            handler.next(err);
          },
          (newTokenPair) async {
            await tokenManager.setTokenPair(newTokenPair);

            final retryOptions = err.requestOptions;
            retryOptions.headers['Authorization'] =
                'Bearer ${newTokenPair.accessToken}';

            try {
              final retryResponse = await Dio().fetch(retryOptions);
              handler.resolve(retryResponse);
            } catch (retryError) {
              handler.next(err);
            }
          },
        );
      } catch (refreshError) {
        await tokenManager.clearTokens();
        onTokenExpired?.call();
        handler.next(err);
      }
    } else {
      await tokenManager.clearTokens();
      onTokenExpired?.call();
      handler.next(err);
    }
  } else {
    handler.next(err);
  }
}