validateEmailLink method
Implementation
@override
Future<Either<AuthServiceEmailLinkFailure, Unit>> validateEmailLink(String link,
{String? email}) async {
String? storedEmail;
var uriLink = Uri.parse(link);
if (uriLink.host != 'localhost' && (!_fbAuth.isSignInWithEmailLink(link))) {
logd('isSignInWithEmailLink failed');
return left(AuthServiceEmailLinkFailure.invalidLink);
} else {
// The email is embedded in the link URL by the server (sendLoginEmail.ts)
// and validated by Firebase against the oobCode — client-side email
// validation is unnecessary.
storedEmail = email;
if (storedEmail == null) {
return left(AuthServiceEmailLinkFailure.noEmailRemembered);
}
logd('storedEmail: $storedEmail');
logd('link: $link');
try {
// Do the signin
var signInResult = await _fbAuth.signInWithEmailLink(
email: storedEmail,
emailLink: link,
);
assert(signInResult.user != null);
currentFbUserCredentials = signInResult;
return right(unit);
} on fb_auth.FirebaseAuthException catch (e) {
loge(e);
switch (e.code) {
case 'invalid-action-code':
return left(AuthServiceEmailLinkFailure.invalidCode);
case 'invalid-email':
return left(AuthServiceEmailLinkFailure.invalidEmail);
case 'expired-action-code':
return left(AuthServiceEmailLinkFailure.expiredCode);
case 'user-disabled':
return left(AuthServiceEmailLinkFailure.userDisabled);
default:
return left(AuthServiceEmailLinkFailure.unexpected);
}
} catch (e) {
loge(e);
return left(AuthServiceEmailLinkFailure.unexpected);
}
}
}