validateEmailLink method

  1. @override
Future<Either<AuthServiceEmailLinkFailure, Unit>> validateEmailLink(
  1. String link, {
  2. String? email,
})
override

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);
    }
  }
}