refreshSession method
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;
}
}