diff --git a/packages/firebase_ui_auth/lib/src/mfa.dart b/packages/firebase_ui_auth/lib/src/mfa.dart index 42c327a2..8542ce0d 100644 --- a/packages/firebase_ui_auth/lib/src/mfa.dart +++ b/packages/firebase_ui_auth/lib/src/mfa.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'package:firebase_auth/firebase_auth.dart' as fba; +import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_ui_auth/firebase_ui_auth.dart'; import 'package:firebase_ui_auth/src/widgets/internal/universal_page_route.dart'; import 'package:flutter/scheduler.dart'; @@ -17,32 +18,36 @@ typedef SMSCodeInputScreenBuilder = Widget Function( AuthAction action, ); -Future startMFAVerification({ +Future startMFAVerification({ required BuildContext context, required fba.MultiFactorResolver resolver, fba.FirebaseAuth? auth, SMSCodeInputScreenBuilder? smsCodeInputScreenBuilder, + void Function(FirebaseException e)? onError, }) async { if (resolver.hints.first is fba.PhoneMultiFactorInfo) { return startPhoneMFAVerification( context: context, resolver: resolver, auth: auth, + onError: onError, ); } else { throw Exception('Unsupported MFA type'); } } -Future startPhoneMFAVerification({ +Future startPhoneMFAVerification({ required BuildContext context, required fba.MultiFactorResolver resolver, fba.FirebaseAuth? auth, SMSCodeInputScreenBuilder? smsCodeInputScreenBuilder, + void Function(FirebaseException e)? onError, }) async { final session = resolver.session; final hint = resolver.hints.first; - final completer = Completer(); + var completer = Completer(); + final navigator = Navigator.of(context); final provider = PhoneAuthProvider(); @@ -56,10 +61,25 @@ Future startPhoneMFAVerification({ provider.authListener = flow; + completer.future.catchError((e) { + onError?.call(e as FirebaseException); + flow.onError(e); + return null; + }); + final flowKey = Object(); final actions = [ AuthStateChangeAction((context, inner) { + if (completer.isCompleted) { + completer = Completer(); + completer.future.catchError((e) { + onError?.call(e as FirebaseException); + flow.onError(e); + return null; + }); + } + final cred = inner.credential as fba.PhoneAuthCredential; final assertion = fba.PhoneMultiFactorGenerator.getAssertion(cred); try {