refreshToken method

Future<SessionData> refreshToken()

Refresh authentication token

Implementation

Future<SessionData> refreshToken() async {
  final refreshToken = await _getRefreshToken();
  if (refreshToken == null) {
    throw AuthException.required();
  }

  try {
    final response = await _apiClient.post<Map<String, dynamic>>(
      '/api/v1/auth/refresh',
      data: {
        'refreshToken': refreshToken,
      },
    );

    final refreshResponse = LoginOTPResponse.fromJson(response);

    if (refreshResponse.success && refreshResponse.data != null) {
      // Update stored tokens
      await _storeTokens(
        accessToken: refreshResponse.data!.session.accessToken,
        refreshToken: refreshResponse.data!.refreshToken,
        expiresAt: refreshResponse.data!.session.expiresAt,
      );

      // Update API client authorization header
      _apiClient.setAuthToken(refreshResponse.data!.session.accessToken);

      return refreshResponse.data!.session;
    } else {
      throw AuthException.refreshFailed();
    }
  } catch (e) {
    if (e is ApiException && e.statusCode == 401) {
      // Refresh token is invalid, user needs to login again
      await logout();
      throw AuthException.refreshFailed();
    }
    rethrow;
  }
}