signInWithPassword method

Future<BloomSupabaseUser> signInWithPassword({
  1. required String email,
  2. required String password,
})

Sign in with email and password via Supabase Auth API.

Implementation

Future<BloomSupabaseUser> signInWithPassword({
  required String email,
  required String password,
}) async {
  try {
    if (supabaseClient != null) {
      final res = await supabaseClient!.auth.signInWithPassword(
        email: email,
        password: password,
      );
      final session = res.session;
      final user = BloomSupabaseUser(
        id: res.user?.id ?? '',
        email: res.user?.email ?? email,
        accessToken: session?.accessToken,
        refreshToken: session?.refreshToken,
        userMetadata: res.user?.userMetadata ?? const {},
      );
      if (session != null) {
        await setSession(user: user, token: session.accessToken);
      }
      return user;
    }

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

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

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