refreshToken method

  1. @override
Future<String?> refreshToken(
  1. Dio dio,
  2. TokenManager tokenManager
)
override

Refreshes the token using the provided Dio instance and TokenManager.

Attempts to refresh the token up to retries times. If successful, saves the new access and refresh tokens using the TokenManager and returns the new access token. Throws a TokenRefreshException if an error occurs during the refresh process.

Implementation

@override
Future<String?> refreshToken(Dio dio, TokenManager tokenManager) async {
  final refreshToken = await tokenManager.getRefreshToken();
  if (refreshToken == null) {
    throw TokenRefreshException(TokenErrorMessages.refreshTokenIsNull);
  }

  for (int attempt = 0; attempt < retries; attempt++) {
    try {
      final response = await refreshHandler(dio, refreshToken);

      if (successCodes.contains(response.statusCode)) {
        final accessToken = accessTokenExtractor(response);
        final newRefreshToken = refreshTokenExtractor(response);
        if (accessToken != null) {
          await tokenManager.saveAccessToken(accessToken);
          if (newRefreshToken != null) {
            await tokenManager.saveRefreshToken(newRefreshToken);
          }
          return accessToken;
        } else {
          throw TokenRefreshException(
              TokenErrorMessages.failedToExtractAccessToken);
        }
      } else {
        throw TokenRefreshException(
            TokenErrorMessages.failedToRefreshAccessToken);
      }
    } catch (e) {
      if (attempt == retries - 1) {
        rethrow;
      }
    }
  }
  return null;
}