Skip to content

Commit 790e450

Browse files
authored
fix(ui): Web recaptcha hover removed after use. (#8812)
Fixes #4377 After showing a recaptcha in web for SMS login, the recaptcha icon overlay persists on the app until it is reloaded, often blocking an app's buttons and other interactive widgets. This adds removal of the web UI element in the clear method, and ensures that clear is called on any RecaptchaVerifier() objects created by flutterfire.
1 parent 159def6 commit 790e450

File tree

3 files changed

+20
-10
lines changed

3 files changed

+20
-10
lines changed

packages/firebase_auth/firebase_auth/lib/src/firebase_auth.dart

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -604,12 +604,16 @@ class FirebaseAuth extends FirebasePluginPlatform {
604604
RecaptchaVerifier? verifier,
605605
]) async {
606606
assert(phoneNumber.isNotEmpty);
607-
607+
// If we add a recaptcha to the page by creating a new instance, we must
608+
// also clear that instance before proceeding.
609+
bool mustClear = verifier == null;
608610
verifier ??= RecaptchaVerifier();
609-
return ConfirmationResult._(
610-
this,
611-
await _delegate.signInWithPhoneNumber(phoneNumber, verifier.delegate),
612-
);
611+
final result =
612+
await _delegate.signInWithPhoneNumber(phoneNumber, verifier.delegate);
613+
if (mustClear) {
614+
verifier.clear();
615+
}
616+
return ConfirmationResult._(this, result);
613617
}
614618

615619
/// Authenticates a Firebase client using a popup-based OAuth authentication

packages/firebase_auth/firebase_auth/lib/src/user.dart

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,11 +259,16 @@ class User {
259259
RecaptchaVerifier? verifier,
260260
]) async {
261261
assert(phoneNumber.isNotEmpty);
262+
// If we add a recaptcha to the page by creating a new instance, we must
263+
// also clear that instance before proceeding.
264+
bool mustClear = verifier == null;
262265
verifier ??= RecaptchaVerifier();
263-
return ConfirmationResult._(
264-
_auth,
265-
await _delegate.linkWithPhoneNumber(phoneNumber, verifier.delegate),
266-
);
266+
final result =
267+
await _delegate.linkWithPhoneNumber(phoneNumber, verifier.delegate);
268+
if (mustClear) {
269+
verifier.clear();
270+
}
271+
return ConfirmationResult._(_auth, result);
267272
}
268273

269274
/// Re-authenticates a user using a fresh credential.

packages/firebase_auth/firebase_auth_web/lib/src/firebase_auth_web_recaptcha_verifier_factory.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ class RecaptchaVerifierFactoryWeb extends RecaptchaVerifierFactoryPlatform {
117117

118118
@override
119119
void clear() {
120-
return _delegate.clear();
120+
_delegate.clear();
121+
window.document.getElementById(_kInvisibleElementId)?.remove();
121122
}
122123

123124
@override

0 commit comments

Comments
 (0)