signInByBiometric method

  1. @override
Future<AuthResponse<T>> signInByBiometric({
  1. BiometricConfig? config,
  2. Object? args,
  3. String? id,
  4. bool notifiable = true,
})
override

Implementation

@override
Future<AuthResponse<T>> signInByBiometric({
  BiometricConfig? config,
  Object? args,
  String? id,
  bool notifiable = true,
}) async {
  emit(
    const AuthResponse.loading(
      AuthProviders.biometric,
      AuthType.biometric,
    ),
    args: args,
    id: id,
    notifiable: notifiable,
  );

  try {
    final user = await _auth;
    if (user == null || !user.isBiometric) {
      return emit(
        AuthResponse.unauthorized(
          msg: msg.signInWithBiometric.failure ?? errorText,
          provider: AuthProviders.biometric,
          type: AuthType.biometric,
        ),
        args: args,
        id: id,
        notifiable: notifiable,
      );
    }

    final response = await authHandler.signInWithBiometric(config: config);
    if (!response.isSuccessful) {
      return emit(
        AuthResponse.failure(
          response.exception,
          provider: AuthProviders.biometric,
          type: AuthType.biometric,
        ),
        args: args,
        id: id,
        notifiable: notifiable,
      );
    }

    final token = user.accessToken;
    final provider = AuthProviders.from(user.provider);
    var current = Response<UserCredential>();
    if ((user.email ?? user.username ?? "").isNotEmpty &&
        (user.password ?? '').isNotEmpty) {
      if (provider.isEmail) {
        current = await authHandler.signInWithEmailNPassword(
          email: user.email ?? "",
          password: user.password ?? "",
        );
      } else if (provider.isUsername) {
        current = await authHandler.signInWithUsernameNPassword(
          username: user.username ?? "",
          password: user.password ?? "",
        );
      }
    } else if ((token ?? user.idToken ?? "").isNotEmpty) {
      if (provider.isApple) {
        current = await authHandler.signInWithCredential(
          credential: OAuthProvider("apple.com").credential(
            idToken: user.idToken,
            accessToken: token,
          ),
        );
      } else if (provider.isFacebook) {
        current = await authHandler.signInWithCredential(
          credential: FacebookAuthProvider.credential(token ?? ""),
        );
      } else if (provider.isGoogle) {
        current = await authHandler.signInWithCredential(
          credential: GoogleAuthProvider.credential(
            idToken: user.idToken,
            accessToken: token,
          ),
        );
      }
    }
    if (!current.isSuccessful) {
      return emit(
        AuthResponse.failure(
          current.exception,
          provider: AuthProviders.biometric,
          type: AuthType.biometric,
        ),
        args: args,
        id: id,
        notifiable: notifiable,
      );
    }

    final value = await _update(id: user.id, updates: {
      AuthKeys.i.loggedIn: true,
      AuthKeys.i.loggedInTime: Entity.generateTimeMills,
    });

    return emit(
      AuthResponse.authenticated(
        value,
        msg: msg.signInWithBiometric.done,
        provider: AuthProviders.biometric,
        type: AuthType.biometric,
      ),
      args: args,
      id: id,
      notifiable: notifiable,
    );
  } catch (error) {
    return emit(
      AuthResponse.failure(
        msg.signInWithBiometric.failure ?? error,
        provider: AuthProviders.biometric,
        type: AuthType.biometric,
      ),
      args: args,
      id: id,
      notifiable: notifiable,
    );
  }
}