refreshSession method

Future<BloomSupabaseUser?> refreshSession()

Refresh the active Supabase session using the stored refresh token.

Implementation

Future<BloomSupabaseUser?> refreshSession() async {
  final current = currentUser.value;
  if (current?.refreshToken == null) {
    logger.debug('BloomSupabaseAuth: No refresh token available.');
    return null;
  }

  try {
    if (supabaseClient != null) {
      final res = await supabaseClient!.auth.refreshSession();
      final session = res.session;
      if (session != null) {
        final user = BloomSupabaseUser(
          id: session.user.id,
          email: session.user.email ?? current!.email,
          accessToken: session.accessToken,
          refreshToken: session.refreshToken,
          userMetadata: session.user.userMetadata ?? current!.userMetadata,
        );
        await setSession(user: user, token: session.accessToken);
        return user;
      }
    }

    final data = await _http.post<Map<String, dynamic>>(
      '/token?grant_type=refresh_token',
      body: {'refresh_token': current!.refreshToken},
    );

    final token = data['access_token']?.toString();
    if (token == null || token.isEmpty) {
      logger.error('BloomSupabaseAuth: Refresh response did not return an access token.');
      return null;
    }

    final userMap = data['user'] as Map<String, dynamic>? ?? {};
    final user = BloomSupabaseUser(
      id: userMap['id']?.toString() ?? current.id,
      email: userMap['email']?.toString() ?? current.email,
      accessToken: token,
      refreshToken: data['refresh_token']?.toString() ?? current.refreshToken,
      userMetadata: userMap['user_metadata'] is Map
          ? Map<String, dynamic>.from(userMap['user_metadata'] as Map)
          : current.userMetadata,
    );

    await setSession(user: user, token: token);
    return user;
  } catch (e) {
    logger.error('BloomSupabaseAuth: refreshSession error: $e');
    return null;
  }
}