runPasskeyLogin function

void runPasskeyLogin(
  1. Store store, {
  2. required String email,
  3. bool permanent = true,
  4. void onFinished()?,
  5. void onFailure(
    1. String message
    )?,
})

Runs the passkey LOGIN ceremony (email-first): auth/options → native authenticator → auth/verify. A successful verify decodes the same User+token as a password sign-in, so the normal post-sign-in routing follows.

Implementation

void runPasskeyLogin(
  Store<dynamic> store, {
  required String email,
  bool permanent = true,
  void Function()? onFinished,
  void Function(String message)? onFailure,
}) {
  store.dispatch(PostPasskeyAuthOptions(
    email,
    onSuccess: (resp) async {
      try {
        final parsed = _publicKeyOptions(resp.body);
        final res = await _authenticator.authenticate(
          AuthenticateRequestType.fromJson(
            parsed['publicKey'] as Map<String, dynamic>,
            mediation: MediationType.Optional,
          ),
        );
        store.dispatch(PostPasskeyAuthVerify(
          parsed['flowId'] as String,
          res.toJson(),
          permanent: permanent,
          onSuccess: (_) => onFinished?.call(),
          onError: (e) {
            onFinished?.call();
            onFailure?.call(e.description ?? 'Passkey sign-in failed.');
          },
        ));
      } catch (e) {
        onFinished?.call();
        onFailure?.call(passkeyErrorMessage(e));
      }
    },
    onError: (e) {
      onFinished?.call();
      onFailure?.call(e.description ?? 'Passkey sign-in failed.');
    },
  ));
}