ez-firebase-auth
Version:
Easy Firebase Auth for Angular 4.x
1 lines • 87.3 kB
JavaScript
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("@angular/core"),require("angularfire2/auth"),require("@angular/router"),require("rxjs/BehaviorSubject"),require("rxjs/Subject"),require("firebase"),require("lodash"),require("@angular/common"),require("@angular/forms"),require("rxjs/add/operator/take"),require("rxjs/add/operator/takeUntil"),require("validator"),require("rxjs/add/operator/combineLatest"),require("rxjs/add/operator/debounceTime")):"function"==typeof define&&define.amd?define(["exports","@angular/core","angularfire2/auth","@angular/router","rxjs/BehaviorSubject","rxjs/Subject","firebase","lodash","@angular/common","@angular/forms","rxjs/add/operator/take","rxjs/add/operator/takeUntil","validator","rxjs/add/operator/combineLatest","rxjs/add/operator/debounceTime"],n):n(e["ez-firebase-auth"]={},e.ng.core,e.angularfire2.auth,e.ng.router,e.Rx,e.Rx,e.firebase,e._,e.ng.common,e.ng.forms,e.Rx.Observable.prototype,e.Rx.Observable.prototype,e.validator)}(this,function(e,n,t,r,i,a,s,o,d,u,c,l,p){"use strict";var f=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,n){e.__proto__=n}||function(e,n){for(var t in n)n.hasOwnProperty(t)&&(e[t]=n[t])};return function(n,t){function r(){this.constructor=n}e(n,t),n.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}}(),h=function(){return function(e,n,t){this.user=e,this.oldEmail=n,this.newEmail=t}}();h.type="EzfaEmailChangedEvent";var v={};v.popup=1,v.redirect=2,v[v.popup]="popup",v[v.redirect]="redirect";var g=function(){return function(){this.providerIds=[],this.providers=[],this.requireDisplayName=!0,this.requireTos=!0,this.sendEmailVerificationLink=!0,this.oauthMethod=v.redirect}}();g.decorators=[{type:n.Injectable}],g.ctorParameters=function(){return[]};var m=function(){return function(){this.password="Email/Password",this["twitter.com"]="Twitter",this["facebook.com"]="Facebook",this["github.com"]="GitHub",this["google.com"]="Google"}}(),b=function(){return function(e,n,t){void 0===t&&(t=null),this.user=e,this.providerId=n,this.credential=t}}();b.type="EzfaProviderLinkedEvent";var w=function(){return function(e,n){this.user=e,this.providerId=n}}();w.type="EzfaProviderUnlinkedEvent";var y=function(){return function(e,n,t){void 0===t&&(t=null),this.user=e,this.providerId=n,this.credential=t,this.redirectCancelled=!1}}();y.type="EzfaSignedInEvent";var I=function(){return function(){this.redirectCancelled=!1}}();I.type="EzfaSignedOutEvent";var k=function(){function e(n,t,r){this.router=n,this.afAuth=t,this.options=r,this.savedPopupPromise_=null;var s=r.oauthMethod===v.popup?v.popup:v.redirect;this.oauthMethod$=new i.BehaviorSubject(s);var o="yes"!==localStorage.getItem(e.STORAGE_KEY_PERSISTENCE);this.localPersistenceEnabled$=new i.BehaviorSubject(o),this.routeChanges$=new a.Subject,this.signedInEvents$=new a.Subject,this.signedOutEvents$=new a.Subject,this.emailChangedEvents$=new a.Subject,this.providerLinkedEvents$=new a.Subject,this.providerUnlinkedEvents$=new a.Subject}return Object.defineProperty(e.prototype,"auth",{get:function(){return this.afAuth.auth},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"authState",{get:function(){return this.afAuth.authState},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"applicationLabel",{get:function(){return this.options.applicationLabel},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"rootSlug",{get:function(){return this.options.rootSlug},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"providerIds",{get:function(){return o.filter(this.options.providerIds,function(n){return o.includes(e.ENABLED_PROVIDERS,n)})},set:function(e){this.options.providerIds=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"oauthProviderIds",{get:function(){return o.filter(this.providerIds,function(n){return o.includes(e.ENABLED_OAUTH_PROVIDERS,n)})},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"passwordProviderEnabled",{get:function(){return o.includes(this.providerIds,"password")},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"providerLabels",{get:function(){var e=this.options.providerLabels||{},n=new m;return o.assign({},n,e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"requireDisplayName",{get:function(){return!1!==this.options.requireDisplayName},set:function(e){this.options.requireDisplayName=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"requireTos",{get:function(){return!1!==this.options.requireTos},set:function(e){this.options.requireTos=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"sendEmailVerificationLink",{get:function(){return!1!==this.options.sendEmailVerificationLink},set:function(e){this.options.sendEmailVerificationLink=e},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"oauthMethod",{get:function(){return this.oauthMethod$.value},set:function(e){this.oauthMethod$.next(e)},enumerable:!0,configurable:!0}),e.prototype.getProviderById=function(e){var n=this;return new Promise(function(t,r){if(!o.includes(n.providerIds,e))return r({code:"ezfa/provider-not-configured"});var i=o.find(n.options.providers,{providerId:e});if(i)return t(i);switch(e){case"password":return t(new s.auth.EmailAuthProvider);case"twitter.com":return t(new s.auth.TwitterAuthProvider);case"facebook.com":return t(new s.auth.FacebookAuthProvider);case"google.com":return t(new s.auth.GoogleAuthProvider);case"github.com":return t(new s.auth.GithubAuthProvider)}})},e.prototype.routerLink=function(e){var n=["/"+this.rootSlug];return e&&n.push(e),n},e.prototype.navigate=function(e,n){return this.router.navigate(this.routerLink(e),n)},Object.defineProperty(e.prototype,"localPersistenceEnabled",{get:function(){return this.localPersistenceEnabled$.asObservable()},enumerable:!0,configurable:!0}),e.prototype.setPersistenceLocal=function(n){var t=this;return new Promise(function(r){var i=n?s.auth.Auth.Persistence.LOCAL:s.auth.Auth.Persistence.SESSION;t.auth.setPersistence(i).then(function(){n?localStorage.removeItem(e.STORAGE_KEY_PERSISTENCE):localStorage.setItem(e.STORAGE_KEY_PERSISTENCE,"yes"),t.localPersistenceEnabled$.next(n),r()})})},Object.defineProperty(e.prototype,"routeChanges",{get:function(){return this.routeChanges$.asObservable()},enumerable:!0,configurable:!0}),e.prototype.onRouteChange=function(e){this.routeChanges$.next(e)},Object.defineProperty(e.prototype,"signedInEvents",{get:function(){return this.signedInEvents$.asObservable()},enumerable:!0,configurable:!0}),e.prototype.onSignedIn=function(e){this.signedInEvents$.next(e)},Object.defineProperty(e.prototype,"signedOutEvents",{get:function(){return this.signedOutEvents$.asObservable()},enumerable:!0,configurable:!0}),e.prototype.onSignedOut=function(e){this.signedOutEvents$.next(e)},Object.defineProperty(e.prototype,"emailChangedEvents",{get:function(){return this.emailChangedEvents$.asObservable()},enumerable:!0,configurable:!0}),e.prototype.onEmailChanged=function(e){this.emailChangedEvents$.next(e)},Object.defineProperty(e.prototype,"providerLinkedEvents",{get:function(){return this.providerLinkedEvents$.asObservable()},enumerable:!0,configurable:!0}),e.prototype.onProviderLinked=function(e){this.providerLinkedEvents$.next(e)},Object.defineProperty(e.prototype,"providerUnlinkedEvents",{get:function(){return this.providerUnlinkedEvents$.asObservable()},enumerable:!0,configurable:!0}),e.prototype.onProviderUnlinked=function(e){this.providerUnlinkedEvents$.next(e)},Object.defineProperty(e.prototype,"savedPopupPromise",{get:function(){return this.savedPopupPromise_},set:function(e){this.savedPopupPromise_=e},enumerable:!0,configurable:!0}),e}();k.STORAGE_KEY_PERSISTENCE="ezfa-local-persistence-disabled",k.ENABLED_PROVIDERS=["password","twitter.com","facebook.com","google.com","github.com"],k.ENABLED_OAUTH_PROVIDERS=["twitter.com","facebook.com","google.com","github.com"],k.OUT_OF_BAND_MODES={resetPassword:"resetPassword",verifyEmail:"verifyEmail",recoverEmail:"recoverEmail"},k.decorators=[{type:n.Injectable}],k.ctorParameters=function(){return[{type:r.Router},{type:t.AngularFireAuth},{type:g}]};var P=function(){return function(){}}();P.decorators=[{type:n.NgModule,args:[{imports:[d.CommonModule],providers:[k],declarations:[]}]}],P.ctorParameters=function(){return[]};var E=function(){return function(e,n){var t=this;if(e){var r=o.map(e.providerData,"providerId");this.ids=o.filter(r,function(e){return o.includes(n,e)}),this.oauthIds=o.filter(r,function(e){return o.includes(n,e)&&"password"!==e})}else this.ids=[],this.oauthIds=[];this.hasPassword=o.includes(this.ids,"password"),this.canAddPassword=o.includes(n,"password")&&!this.hasPassword,this.canAddOauth=o.filter(n,function(e){return"password"!==e&&!o.includes(t.oauthIds,e)})}}(),z=function(){function e(e){this.service=e,this.ngUnsubscribe=new a.Subject,this.user=null}return e.prototype.ngOnDestroy=function(){this.ngUnsubscribe.next(),this.ngUnsubscribe.complete()},e.prototype.onInitLoadUser=function(){var e=this;return new Promise(function(n){e.service.authState.take(1).subscribe(function(t){e.onAuthChangedUpdate(t),e.service.authState.takeUntil(e.ngUnsubscribe).subscribe(function(n){e.onAuthChangedUpdate(n)}),n()})})},e.prototype.gateToSignedInUser=function(){var e=this;this.service.authState.takeUntil(this.ngUnsubscribe).subscribe(function(n){n||e.service.navigate()})},e.prototype.onAuthChangedUpdate=function(e){this.user=e,this.userProviderData=new E(e,this.service.providerIds)},e.prototype.gateToUserWithNoPassword=function(){var e=this;this.service.authState.takeUntil(this.ngUnsubscribe).subscribe(function(n){if((n?o.find(n.providerData,{providerId:"password"}):null)||!n)return e.service.navigate()})},e.prototype.gateToUserWithPassword=function(){var e=this;this.service.authState.takeUntil(this.ngUnsubscribe).subscribe(function(n){if(!(n?o.find(n.providerData,{providerId:"password"}):null))return e.service.navigate()})},e}(),C=function(e){function n(n,t){var r=e.call(this,t)||this;return r.route=n,r}return f(n,e),n.prototype.ngOnInit=function(){var e=this,n=this.route.snapshot.queryParams.oobCode||null,t=this.route.snapshot.queryParams.mode||null;if(t&&o.has(k.OUT_OF_BAND_MODES,t)&&n)switch(t){case k.OUT_OF_BAND_MODES.recoverEmail:return this.service.navigate("recover-email",{queryParamsHandling:"preserve"});case k.OUT_OF_BAND_MODES.resetPassword:return this.service.navigate("reset-password",{queryParamsHandling:"preserve"});case k.OUT_OF_BAND_MODES.verifyEmail:return this.service.navigate("verify-email",{queryParamsHandling:"preserve"})}else this.service.authState.take(1).subscribe(function(n){return n?e.service.navigate("account"):e.service.navigate("sign-in")})},n}(z);C.decorators=[{type:n.Component,args:[{selector:"ezfa-index-route",template:'\n <p class="text-muted">\n <i class="fa fa-spin fa-fw fa-refresh"></i> Please wait...\n </p>\n ',styles:["\n\n "]}]}],C.ctorParameters=function(){return[{type:r.ActivatedRoute},{type:k}]};var S=function(e){function n(n,t){var r=e.call(this,t)||this;return r.route=n,r.message=null,r}return f(n,e),n.prototype.ngOnInit=function(){var e=this;this.service.onRouteChange("account"),this.initMessage(),this.onInitLoadUser().then(function(){e.gateToSignedInUser()})},n.prototype.initMessage=function(){if(this.route.snapshot.queryParams.message){var e=parseInt(this.route.snapshot.queryParams.message,10);this.message=isNaN(e)?null:e}else this.message=null},n.prototype.addProvider=function(e){var n=this;"password"!==e?(this.service.navigate("link",{queryParams:{providerId:e}}),v.popup===this.service.oauthMethod&&(this.service.savedPopupPromise=this.service.getProviderById(e).then(function(e){return n.user.linkWithPopup(e)}))):this.service.navigate("add-password")},n}(z);S.decorators=[{type:n.Component,args:[{selector:"ezfa-account",template:'\n <div *ngIf="user">\n\n <div *ngIf="user.displayName">\n <h6 class="text-muted mb-1">Name</h6>\n <p>{{user.displayName}}</p>\n </div>\n <h6 class="text-muted mb-1">Email</h6>\n <p>\n {{user.email}}\n <span class="badge badge-success" *ngIf="user.emailVerified">\n <i class="fa fa-fw fa-check" aria-hidden="true"></i>\n Verified\n </span>\n <span *ngIf="!user.emailVerified">\n <a routerLink="../send-email-verification-link">Verify</a>\n </span>\n </p>\n\n <h6 class="text-muted mb-1">Sign In Methods</h6>\n <div class="mb-3" *ngIf="userProviderData">\n <ul class="list-group">\n <li *ngIf="userProviderData.hasPassword" class="list-group-item">\n <div class="d-flex justify-content-between align-items-center">\n <div>\n <span class="text-muted">\n <ezfa-provider-icon providerId="password"></ezfa-provider-icon>\n </span>\n <ezfa-provider-label providerId="password"></ezfa-provider-label>\n <br>\n <small class="text-muted">\n <a routerLink="../change-email">Change Email</a>\n |\n <a routerLink="../change-password">Change Password</a>\n </small>\n\n </div>\n <div>\n <a\n routerLink="../unlink"\n [queryParams]="{providerId: \'password\'}"\n type="button"\n *ngIf="userProviderData.ids.length > 1"\n class="btn btn-sm btn-outline-light"\n [ezfaProviderTitle]="{label: \'Remove\', id: \'password\'}">\n <i class="fa fa-fw fa-times text-danger"></i>\n <span class="sr-only">\n Remove <ezfa-provider-label providerId="password"></ezfa-provider-label>\n </span>\n </a>\n </div>\n </div>\n </li>\n <li *ngFor="let id of userProviderData.oauthIds" class="list-group-item">\n <div class="d-flex justify-content-between align-items-center">\n <div>\n <span class="text-muted">\n <ezfa-provider-icon [providerId]="id"></ezfa-provider-icon>\n </span>\n <ezfa-provider-label [providerId]="id"></ezfa-provider-label>\n </div>\n <div>\n <a\n routerLink="../unlink"\n [queryParams]="{providerId: id}"\n *ngIf="userProviderData.ids.length > 1"\n class="btn btn-sm btn-outline-light"\n [ezfaProviderTitle]="{label: \'Remove\', id: id}">\n <i class="fa fa-fw fa-times text-danger"></i>\n <span class="sr-only">\n Remove <ezfa-provider-label [providerId]="id"></ezfa-provider-label>\n </span>\n </a>\n </div>\n </div>\n </li>\n </ul>\n\n <div *ngIf="userProviderData.canAddPassword || userProviderData.canAddOauth.length > 0" >\n <small class="text-muted">\n Add...\n </small>\n <div class="list-group">\n <a\n *ngIf="userProviderData.canAddPassword"\n routerLink="../add-password"\n class="list-group-item list-group-item-action"\n [ezfaProviderTitle]="{label: \'Add\', id: \'password\'}">\n <ezfa-provider-icon providerId="password"></ezfa-provider-icon>\n Add\n <ezfa-provider-label providerId="password"></ezfa-provider-label>\n </a>\n <button *ngFor="let id of userProviderData.canAddOauth"\n type="button"\n class="list-group-item list-group-item-action"\n (click)="addProvider(id)"\n [ezfaProviderTitle]="{label: \'Add\', id: id}">\n <ezfa-provider-icon [providerId]="id"></ezfa-provider-icon>\n Add\n <ezfa-provider-label [providerId]="id"></ezfa-provider-label>\n </button>\n </div>\n </div>\n </div>\n\n\n <ezfa-persistence-form></ezfa-persistence-form>\n\n\n <p class="text-right mb-0">\n <a routerLink="../sign-out">Sign Out</a>\n </p>\n\n </div>\n ',styles:["\n\n "]}]}],S.ctorParameters=function(){return[{type:r.ActivatedRoute},{type:k}]};var x=function(e){function n(n,t){var r=e.call(this,t)||this;return r.route=n,r.email=null,r}return f(n,e),n.prototype.ngOnInit=function(){var e=this;this.service.onRouteChange("sign-in"),this.email=this.route.snapshot.queryParams.email||"",this.onInitLoadUser().then(function(){e.user&&e.service.navigate()})},n}(z);x.decorators=[{type:n.Component,args:[{selector:"ezfa-sign-in-route",template:'\n <div *ngIf="authService.passwordProviderEnabled">\n <ezfa-email-sign-in-form [email]="email"></ezfa-email-sign-in-form>\n <hr *ngIf="authService.oauthProviderIds.length > 0">\n </div>\n\n <div *ngIf="authService.oauthProviderIds.length > 0">\n <h6 class="text-muted">\n <span *ngIf="!authService.passwordProviderEnabled">Sign in with...</span>\n <span *ngIf="authService.passwordProviderEnabled">Or sign in with...</span>\n </h6>\n <ezfa-oauth-sign-in></ezfa-oauth-sign-in>\n </div>\n <hr>\n <ezfa-persistence-form></ezfa-persistence-form>\n ',styles:["\n\n "]}]}],x.ctorParameters=function(){return[{type:r.ActivatedRoute},{type:k}]};var A={};A.emailSaved=1,A.passwordSaved=2,A.passwordRemoved=3,A.twitterAccountRemoved=4,A.githubAccountRemoved=5,A.googleAccountRemoved=6,A.facebookAccountRemoved=7,A.twitterAccountAdded=8,A.githubAccountAdded=9,A.facebookAccountAdded=10,A.googleAccountAdded=11,A.emailVerified=12,A.passwordReset=13,A.signedIn=14,A.signedOut=15,A[A.emailSaved]="emailSaved",A[A.passwordSaved]="passwordSaved",A[A.passwordRemoved]="passwordRemoved",A[A.twitterAccountRemoved]="twitterAccountRemoved",A[A.githubAccountRemoved]="githubAccountRemoved",A[A.googleAccountRemoved]="googleAccountRemoved",A[A.facebookAccountRemoved]="facebookAccountRemoved",A[A.twitterAccountAdded]="twitterAccountAdded",A[A.githubAccountAdded]="githubAccountAdded",A[A.facebookAccountAdded]="facebookAccountAdded",A[A.googleAccountAdded]="googleAccountAdded",A[A.emailVerified]="emailVerified",A[A.passwordReset]="passwordReset",A[A.signedIn]="signedIn",A[A.signedOut]="signedOut";var O=function(e){function n(n){var t=e.call(this,n)||this;return t.screen="wait",t}return f(n,e),n.prototype.ngOnInit=function(){var e=this;this.service.onRouteChange("sign-out"),this.service.auth.signOut().then(function(){var n=new I;e.screen="success",e.service.onSignedOut(n),n.redirectCancelled||e.service.navigate("sign-in",{queryParams:{message:A.signedOut}})})},n}(z);O.decorators=[{type:n.Component,args:[{selector:"ezfa-sign-out-route",template:'\n <div *ngIf=" \'wait\' === screen " class="alert alert-light" role="alert">\n <i class="fa fa-fw fa-spin fa-refresh" aria-hidden="true"></i>\n Please wait. Signing you out...\n </div>\n <div *ngIf=" \'success\' === screen " class="alert alert-success" role="alert">\n <i class="fa fa-fw fa-check" aria-hidden="true"></i>\n Thanks! You’re signed out!\n </div>\n ',styles:["\n\n "]}]}],O.ctorParameters=function(){return[{type:k}]};var R=function(e){var n=o.trim(e.value);return 0===n.length?null:p.isEmail(n)?null:{email:!0}},U=function(e,n){var t=e.errors;if(t){var r=o.omit(t,n);Object.keys(r).length>0?e.setErrors(r):e.setErrors(null)}},q=function(e){var n={};return n[e.code]=!0,n},L=function(e){function n(n,t){var r=e.call(this,t)||this;return r.fb=n,r.submitting=!1,r.unhandledError=null,r}return f(n,e),n.prototype.ngOnInit=function(){var e=this;this.service.onRouteChange("add-password"),this.id=o.uniqueId("ezfa-add-password-route"),this.fg=this.fb.group({password:["",[u.Validators.required]]}),this.fg.get("password").valueChanges.takeUntil(this.ngUnsubscribe).subscribe(function(){U(e.fg.get("password"),["auth/weak-password"])}),this.onInitLoadUser().then(function(){e.gateToUserWithNoPassword()})},n.prototype.submit=function(){var e=this;this.submitting=!0,this.unhandledError=null;var n=this.fg.value.password;this.addPassword(this.user,n).then(function(n){e.user=n,e.submitting=!1,e.service.navigate("account")})["catch"](function(n){switch(n.code){case"auth/weak-password":e.fg.get("password").setErrors(q(n));break;case"auth/requires-recent-login":e.service.navigate("reauthenticate",{queryParams:{redirect:"add-password"}});break;default:e.unhandledError=n}e.submitting=!1})},n.prototype.addPassword=function(e,n){var t=this;return new Promise(function(r,i){t.service.getProviderById("password").then(function(t){var r=s.auth.EmailAuthProvider.credential(e.email,n);return e.linkWithCredential(r)}).then(r)["catch"](i)})},n}(z);L.decorators=[{type:n.Component,args:[{selector:"ezfa-add-password-route",template:'\n\n <form [formGroup]="fg" (ngSubmit)="submit()">\n <div class="form-group">\n <label [attr.for]="id + \'password\'">\n Choose Password\n </label>\n <ezfa-toggleable-password [control]="passwordInput">\n <input\n #passwordInput\n [attr.id]="id + \'password\'"\n class="form-control"\n [ezfaInvalidInput]="fg.get(\'password\')"\n placeholder="Password"\n type="password"\n [attr.aria-describedby]="id + \'passwordHelp\'"\n formControlName="password">\n </ezfa-toggleable-password>\n <div [ezfaInvalidFeedback]="fg.get(\'password\')" key="required">\n Required.\n </div>\n <div [ezfaInvalidFeedback]="fg.get(\'password\')" key="auth/weak-password">\n That password is too weak.\n </div>\n <small [attr.id]="id + \'passwordHelp\'" class="form-text text-muted">\n Please choose a strong password.\n </small>\n </div> \x3c!-- password form-group --\x3e\n <div class="form-group text-right">\n <button\n type="submit"\n [disabled]="submitting || fg.invalid"\n class="btn"\n [class.btn-outline-dark]="fg.invalid"\n [class.btn-outline-success]="!fg.invalid">\n <i class="fa fa-fw fa-save" aria-hidden="true"></i>\n Add Password\n </button>\n <p *ngIf="submitting">\n <i class="fa fa-fw fa-spin fa-refresh" aria-hidden="true"></i>\n Adding password to account...\n </p>\n <p *ngIf="unhandledError">\n <i class="fa fa-fw fa-warning text-danger" aria-hidden="true"></i>\n Error: {{unhandledError.code}}\n </p>\n </div>\n </form>\n ',styles:["\n\n "]}]}],L.ctorParameters=function(){return[{type:u.FormBuilder},{type:k}]};var T=function(e){function n(n,t){var r=e.call(this,t)||this;return r.route=n,r.providerId=null,r.screen="wait",r.submitting=!1,r.unhandledError=null,r}return f(n,e),n.prototype.ngOnInit=function(){var e=this;this.onInitLoadUser().then(function(){e.gateByUserAndProvider()})},n.prototype.submit=function(){var e=this;this.submitting=!0,this.unhandledError=null,this.user.unlink(this.providerId).then(function(n){var t,r=new w(n,e.providerId);switch(e.providerId){case"password":t=A.passwordRemoved;break;case"twitter.com":t=A.twitterAccountRemoved;break;case"facebook.com":t=A.facebookAccountRemoved;break;case"google.com":t=A.googleAccountRemoved;break;case"github.com":t=A.githubAccountRemoved}e.service.onProviderUnlinked(r),e.service.navigate("account",{queryParams:{message:t}}),e.submitting=!1})["catch"](function(n){e.submitting=!1,e.unhandledError=n})},n.prototype.gateByUserAndProvider=function(){var e=this;this.service.authState.takeUntil(this.ngUnsubscribe).subscribe(function(n){e.providerId=e.route.snapshot.queryParams.providerId||null,e.providerId&&n&&(o.find(n.providerData,{providerId:e.providerId})||null)?e.screen="form":e.service.navigate()})},n}(z);T.decorators=[{type:n.Component,args:[{selector:"ezfa-unlink-route",template:'\n <div *ngIf=" \'wait\' === screen " class="alert alert-info my-3" role="alert">\n <i class="fa fa-fw fa-spin fa-refresh" aria-hidden="true"></i>\n Please wait...\n </div>\n\n <div *ngIf=" \'form\' === screen ">\n <div class="card my-3">\n <div class="card-body">\n <p>\n Are you sure you want to\n <span *ngIf="providerId === \'password\'">remove the password</span>\n <span *ngIf="providerId !== \'password\'">\n unlink\n <ezfa-provider-label [providerId]="providerId"></ezfa-provider-label>\n </span>\n from your account?\n </p>\n\n <div class="form-group text-right">\n <p>\n <a class="btn btn-secondary" routerLink="../account">Cancel</a>\n <button class="btn btn-danger" type="button" (click)="submit()">\n <i class="fa fa-times fa-fw" aria-hidden="true"></i>\n <span *ngIf="providerId !== \'password\'">\n Unlink\n <ezfa-provider-label [providerId]="providerId"></ezfa-provider-label>\n </span>\n <span *ngIf="providerId === \'password\'">\n Remove Password\n </span>\n </button>\n </p>\n <p *ngIf="submitting">\n <i class="fa fa-fw fa-spin fa-refresh" aria-hidden="true"></i>\n Removing <ezfa-provider-label [providerId]="providerId"></ezfa-provider-label>\n sign in method....\n </p>\n <p *ngIf="unhandledError">\n <i class="fa fa-fw fa-warning text-danger" aria-hidden="true"></i>\n Error: {{unhandledError.code}}\n </p>\n </div>\n </div>\n </div>\n </div>\n ',styles:["\n\n "]}]}],T.ctorParameters=function(){return[{type:r.ActivatedRoute},{type:k}]};var F=function(e){function n(n,t){var r=e.call(this,t)||this;return r.route=n,r.error=null,r.success=null,r.wait=!0,r}return f(n,e),n.prototype.ngOnInit=function(){var e=this;this.service.onRouteChange("link"),this.providerId=this.route.snapshot.queryParams.providerId,this.providerId?this.onInitLoadUser().then(function(){return e.onInitHandleSavedPopupPromise()}).then(function(n){return!!n||e.onInitCheckForRedirect()}).then(function(n){n||e.link(),e.gateToSignedInUser()}):this.service.navigate()},n.prototype.link=function(){var e=this;this.error=null,this.success=null,this.wait=!0,this.service.getProviderById(this.providerId).then(function(n){switch(e.service.oauthMethod){case v.popup:return e.user.linkWithPopup(n);default:return e.user.linkWithRedirect(n)}}).then(function(n){n&&e.onSuccess(n)})["catch"](function(n){e.onError(n)})},n.prototype.onInitHandleSavedPopupPromise=function(){var e=this;return new Promise(function(n){var t=e.service.savedPopupPromise;return e.service.savedPopupPromise=null,e.user?t?void t.then(function(t){e.onSuccess(t),n(!0)})["catch"](function(t){e.onError(t),n(!0)}):n(!1):(e.service.navigate(),n(!0))})},n.prototype.onInitCheckForRedirect=function(){var e=this;return new Promise(function(n){if(!e.user)return e.service.navigate(),n(!0);e.service.auth.getRedirectResult().then(function(t){t.user?(e.onSuccess(t),n(!0)):n(!1)})["catch"](function(t){e.onError(t),n(!0)})})},n.prototype.onSuccess=function(e){this.error=null;var n=new b(e.user,e.credential.providerId,e);this.success=n,this.wait=!1;var t={message:null};switch(e.credential.providerId){case"twitter.com":t.message=A.twitterAccountAdded;break;case"facebook.com":t.message=A.facebookAccountAdded;break;case"github.com":t.message=A.githubAccountAdded;break;case"google.com":t.message=A.googleAccountAdded}this.service.onProviderLinked(n),this.service.navigate("account",{queryParams:t})},n.prototype.onError=function(e){this.wait=!1,this.error=e,this.success=null},n}(z);F.decorators=[{type:n.Component,args:[{selector:"ezfa-link-route",template:'\n <p class="text-muted" *ngIf="wait">\n <i class="fa fa-spin fa-fw fa-refresh"></i> Please wait...\n </p>\n\n <div *ngIf="error">\n <div [ngSwitch]="error.code" class="alert alert-danger my-3" role="alert">\n <p>\n <i class="fa fa-fw fa-warning"></i>\n <strong>\n Account Link Error\n </strong>\n </p>\n <div *ngSwitchCase="\'auth/credential-already-in-use\'">\n <p>\n The <ezfa-provider-label [providerId]="error.credential.providerId"></ezfa-provider-label>\n account you tried to add is already associated with a different\n <ezfa-application-label></ezfa-application-label> account ({{error.email}}.)\n </p>\n <p class="mb-0">\n You’re currently signed in as {{user.email}}.\n </p>\n </div>\n <div *ngSwitchCase="\'auth/email-already-in-use\'">\n <p>\n The email for the <ezfa-provider-label [providerId]="error.credential.providerId"></ezfa-provider-label>\n account you tried to add ({{error.email}}) is already in use by a different\n <ezfa-application-label></ezfa-application-label> account.\n </p>\n <p class="mb-0">\n You’re currently signed in as {{user.email}}.\n </p>\n </div>\n <div *ngSwitchCase="\'auth/cancelled-popup-request\'">\n <p class="mb-0">\n You closed the <ezfa-provider-label [providerId]="providerId"></ezfa-provider-label>\n popup window without linking <ezfa-provider-label [providerId]="providerId"></ezfa-provider-label>.\n </p>\n </div>\n <div *ngSwitchCase="\'auth/popup-closed-by-user\'">\n <p class="mb-0">\n You closed the <ezfa-provider-label [providerId]="providerId"></ezfa-provider-label>\n popup window without linking a <ezfa-provider-label [providerId]="providerId"></ezfa-provider-label>\n account.\n </p>\n </div>\n <p *ngSwitchCase="\'auth/popup-blocked\'" class="mb-0">\n the popup was blocked.\n </p>\n <p *ngSwitchDefault class="mb-0">\n Unhandled error: {{error | json}}\n </p>\n\n </div>\n <p class="text-muted">\n Try again...\n <button class="btn btn-primary btn-block my-1" (click)="link()">\n Add\n <ezfa-provider-icon [providerId]="providerId"></ezfa-provider-icon>\n <ezfa-provider-label [providerId]="providerId"></ezfa-provider-label>\n </button>\n <small class="form-text">\n Make sure the <ezfa-provider-label [providerId]="providerId"></ezfa-provider-label>\n account you add is associated with the email address {{user.email}}.\n </small>\n </p>\n <p>\n <a routerLink="../account" class="btn btn-secondary btn-block">\n Back to Account\n </a>\n </p>\n </div>\n\n <div *ngIf="success">\n <div class="alert alert-success my-3" role="alert">\n <ezfa-provider-icon [providerId]="providerId"></ezfa-provider-icon>\n <ezfa-provider-label [providerId]="providerId"></ezfa-provider-label>\n added!\n </div>\n <p>\n <a routerLink="../account" class="btn btn-secondary btn-block">\n Back to Account\n </a>\n </p>\n </div>\n ',styles:["\n\n "]}]}],F.ctorParameters=function(){return[{type:r.ActivatedRoute},{type:k}]};var D=function(e){function n(n,t){var r=e.call(this,t)||this;return r.fb=n,r.user=null,r.hasPasswordProvider=!1,r.success=!1,r.submitting=!1,r.unhandledError=null,r}return f(n,e),n.prototype.ngOnInit=function(){var e=this;this.id=o.uniqueId("ezfa-change-password-route"),this.service.onRouteChange("change-password"),this.fg=this.fb.group({password:["",[u.Validators.required]]});var n=this.fg.get("password");n.valueChanges.takeUntil(this.ngUnsubscribe).subscribe(function(){U(n,["auth/weak-password"])}),this.onInitLoadUser().then(function(){e.gateToUserWithPassword()})},n.prototype.submit=function(){var e=this;if(this.user){this.unhandledError=null,this.submitting=!0;var n=this.fg.get("password"),t=this.user,r=n.value;t.updatePassword(r).then(function(){return t.reload()}).then(function(){e.success=!0,e.submitting=!1,e.service.navigate("account",{queryParams:{message:A.passwordSaved}})})["catch"](function(t){switch(e.submitting=!1,t.code){case"auth/weak-password":n.setErrors(q(t));break;case"auth/requires-recent-login":e.service.navigate("reauthenticate",{queryParams:{redirect:"change-password"}});break;default:e.unhandledError=t}})}},n}(z);D.decorators=[{type:n.Component,args:[{selector:"ezfa-change-password-route",template:'\n <div *ngIf="user">\n <form [formGroup]="fg" (ngSubmit)="submit()" *ngIf="! success">\n <div class="form-group">\n <label [attr.for]="id + \'password\'">\n Choose New Password\n </label>\n <ezfa-toggleable-password [control]="passwordInput">\n <input\n #passwordInput\n [attr.id]="id + \'password\'"\n class="form-control"\n [ezfaInvalidInput]="fg.get(\'password\')"\n placeholder="Password"\n type="password"\n [attr.aria-describedby]="id + \'passwordHelp\'"\n formControlName="password">\n </ezfa-toggleable-password>\n <div [ezfaInvalidFeedback]="fg.get(\'password\')" key="required">\n Required.\n </div>\n <div [ezfaInvalidFeedback]="fg.get(\'password\')" key="auth/weak-password">\n That password is too weak.\n </div>\n <small [attr.id]="id + \'passwordHelp\'" class="form-text text-muted">\n Please choose a strong password.\n </small>\n </div> \x3c!-- password form-group --\x3e\n <div class="form-group text-right">\n <button\n type="submit"\n [disabled]="submitting || fg.invalid"\n class="btn"\n [class.btn-outline-dark]="fg.invalid"\n [class.btn-outline-success]="!fg.invalid">\n <i class="fa fa-fw fa-save" aria-hidden="true"></i>\n Save Password\n </button>\n <p *ngIf="submitting">\n <i class="fa fa-fw fa-spin fa-refresh" aria-hidden="true"></i>\n Saving password...\n </p>\n <p *ngIf="unhandledError">\n <i class="fa fa-fw fa-warning text-danger" aria-hidden="true"></i>\n Error: {{unhandledError.code}}\n </p>\n </div>\n </form>\n <div *ngIf="success">\n <div class="alert alert-success" role="alert">\n Your new password has been saved.\n </div>\n <p>\n <a routerLink="../account" class="btn btn-secondary btn-block">\n Back to Account\n </a>\n </p>\n </div>\n\n </div>\n ',styles:["\n\n "]}]}],D.ctorParameters=function(){return[{type:u.FormBuilder},{type:k}]};var j=function(e){function n(n,t){var r=e.call(this,t)||this;return r.fb=n,r.user=null,r.success=!1,r.submitting=!1,r.unhandledError=null,r}return f(n,e),n.prototype.ngOnInit=function(){var e=this;this.service.onRouteChange("change-email"),this.id=o.uniqueId("ezfa-change-email-route"),this.fg=this.fb.group({email:["",[u.Validators.required,R,this.validateNotSame.bind(this)]]});var n=this.fg.get("email");n.valueChanges.takeUntil(this.ngUnsubscribe).subscribe(function(){U(n,["auth/invalid-email","auth/email-already-in-use"])}),this.onInitLoadUser().then(function(){e.gateToUserWithPassword()})},n.prototype.submit=function(){var e=this;if(this.user){this.unhandledError=null,this.submitting=!0;var n=this.user.email,t=this.fg.get("email"),r=o.trim(t.value),i=this.user;this.user.updateEmail(r).then(function(){if(e.service.sendEmailVerificationLink)return i.sendEmailVerification()}).then(function(){return i.reload()}).then(function(){e.service.onEmailChanged({user:i,oldEmail:n,newEmail:r}),e.success=!0,e.submitting=!1,e.service.navigate("account",{queryParams:{message:A.emailSaved}})})["catch"](function(n){switch(e.submitting=!1,n.code){case"auth/invalid-email":case"auth/email-already-in-use":t.setErrors(q(n));break;case"auth/requires-recent-login":e.service.navigate("reauthenticate",{queryParams:{redirect:"change-email"}});break;default:e.unhandledError=n}})}},n.prototype.validateNotSame=function(e){return this.user&&o.trim(e.value).toLowerCase()===o.trim(this.user.email).toLowerCase()?{same:!0}:null},n}(z);j.decorators=[{type:n.Component,args:[{selector:"ezfa-change-email-route",template:'\n\n <div *ngIf="user">\n <form [formGroup]="fg" (ngSubmit)="submit()" *ngIf="! success">\n <div class="form-group">\n <label [attr.for]="id + \'email\'">\n New Email\n </label>\n <input\n [attr.id]="id + \'email\'"\n class="form-control"\n [ezfaInvalidInput]="fg.get(\'email\')"\n placeholder="New Email"\n type="email"\n [attr.aria-describedby]="id + \'emailHelp\'"\n formControlName="email">\n <div [ezfaInvalidFeedback]="fg.get(\'email\')" key="required">\n Required.\n </div>\n <div [ezfaInvalidFeedback]="fg.get(\'email\')" [key]="[\'auth/invalid-email\', \'email\']">\n Invalid email address.\n </div>\n <div [ezfaInvalidFeedback]="fg.get(\'email\')" key="auth/email-already-in-use">\n That email is already in use.\n </div>\n <div [ezfaInvalidFeedback]="fg.get(\'email\')" key="same">\n That’s the same as your current email.\n </div>\n\n <small [attr.id]="id + \'emailHelp\'" class="form-text text-muted">\n Your current email is {{user.email}}.\n </small>\n </div> \x3c!-- password form-group --\x3e\n <div class="form-group text-right">\n <button\n type="submit"\n [disabled]="submitting || fg.invalid"\n class="btn"\n [class.btn-outline-dark]="fg.invalid"\n [class.btn-outline-success]="!fg.invalid">\n <i class="fa fa-fw fa-save" aria-hidden="true"></i>\n Change Email\n </button>\n <p *ngIf="submitting">\n <i class="fa fa-fw fa-spin fa-refresh" aria-hidden="true"></i>\n Changing account email...\n </p>\n <p *ngIf="unhandledError">\n <i class="fa fa-fw fa-warning text-danger" aria-hidden="true"></i>\n Error: {{unhandledError.code}}\n </p>\n </div>\n </form>\n\n <div *ngIf="success">\n <div class="alert alert-success" role="alert">\n Your email has been changed to {{user.email}}.\n </div>\n <p>\n <a routerLink="../account" class="btn btn-secondary btn-block">\n Back to Account\n </a>\n </p>\n </div>\n\n </div>\n ',styles:["\n\n "]}]}],j.ctorParameters=function(){return[{type:u.FormBuilder},{type:k}]};var _=function(e){function n(n,t,r){var i=e.call(this,r)||this;return i.route=n,i.fb=t,i.screen="wait",i.id=null,i.user=null,i.submitting=!1,i.error=null,i.oAuthProviderIds=[],i.email=null,i}return f(n,e),n.prototype.ngOnInit=function(){var e=this;this.id=o.uniqueId("ezfa-reset-password-route"),this.service.onRouteChange("reset-password"),this.fg=this.fb.group({password:["",[u.Validators.required]]});var n=this.fg.get("password");n.valueChanges.takeUntil(this.ngUnsubscribe).subscribe(function(){U(n,["auth/weak-password"])}),this.onInitLoadUser().then(function(){e.checkCode()})},n.prototype.submit=function(){var e=this;this.error=null,this.submitting=!0;var n=this.fg.get("password"),t=n.value;this.service.auth.confirmPasswordReset(this.oobCode,t).then(function(){return e.service.auth.signInWithEmailAndPassword(e.email,t)}).then(function(n){e.user=n,e.submitting=!1,e.screen="success",e.service.navigate("account",{queryParams:{message:A.passwordReset}})})["catch"](function(t){switch(e.submitting=!1,t.code){case"auth/weak-password":n.setErrors(q(t)),e.screen="form";break;default:e.error=t,e.screen="error"}})},n.prototype.checkCode=function(){var e=this;return new Promise(function(n){if(e.oobCode=e.route.snapshot.queryParams.oobCode||null,e.route.snapshot.queryParams.mode!==k.OUT_OF_BAND_MODES.resetPassword||!e.oobCode)return e.service.navigate(),n(!1);e.service.auth.verifyPasswordResetCode(e.oobCode).then(function(t){e.email=t,e.screen="form",n(!0)})["catch"](function(t){e.error=t,e.screen="error",n(!0)})})},n}(z);_.decorators=[{type:n.Component,args:[{selector:"ezfa-reset-password-route",template:'\n <div [ngSwitch]="screen">\n <div *ngSwitchCase="\'wait\'">\n <p class="text-muted">\n <i class="fa fa-spin fa-fw fa-refresh"></i>\n Checking password reset link. Please wait...\n </p>\n </div>\n <div *ngSwitchCase="\'success\'">\n <p class="text-muted">\n <i class="fa fa-fw fa-check text-success" aria-hidden="true"></i>\n Welcome, {{user.displayName}}. Your password has been saved and you’re signed in.\n </p>\n <p class="text-right">\n <a routerLink="../account">Account</a>\n </p>\n </div>\n <div *ngSwitchCase="\'error\'">\n <p class="text-muted" [ngSwitch]="linkError.code">\n <i class="fa fa-fw fa-warning text-danger"></i>\n <strong>Error</strong><br>\n <span *ngSwitchCase="\'auth/expired-action-code\'">\n The reset password link has expired.\n Please <a routerLink="../send-reset-password-link">click here</a>\n to get a new link.\n </span>\n <span *ngSwitchCase="\'auth/invalid-action-code\'">\n The reset password link is invalid.\n This can happen if it has already been used.\n Please <a routerLink="../send-reset-password-link">click here</a>\n to get a new link.\n </span>\n <span *ngSwitchCase="\'auth/user-not-found\'">\n The account associated with that reset password link\n has been deleted.\n </span>\n <span *ngSwitchCase="\'auth/user-disabled\'">\n The account associated with that reset password link\n has been disabled.\n </span>\n </p>\n </div>\n <div *ngSwitchCase="\'form\'">\n <form [formGroup]="fg" (ngSubmit)="submit()">\n <div class="form-group">\n <label [attr.for]="id + \'password\'">\n Choose New Password\n </label>\n <ezfa-toggleable-password [control]="passwordInput">\n <input\n #passwordInput\n [attr.id]="id + \'password\'"\n class="form-control"\n [ezfaInvalidInput]="fg.get(\'password\')"\n placeholder="Password"\n type="password"\n [attr.aria-describedby]="id + \'passwordHelp\'"\n formControlName="password">\n </ezfa-toggleable-password>\n <div [ezfaInvalidFeedback]="fg.get(\'password\')" key="required">\n Required.\n </div>\n <div [ezfaInvalidFeedback]="fg.get(\'password\')" key="auth/weak-password">\n That password is too weak.\n </div>\n <small [attr.id]="id + \'passwordHelp\'" class="form-text text-muted">\n You’re choosing a new password for {{email}}.\n </small>\n </div> \x3c!-- password form-group --\x3e\n <div class="form-group text-right">\n <button\n type="submit"\n [disabled]="submitting || fg.invalid"\n class="btn"\n [class.btn-outline-dark]="fg.invalid"\n [class.btn-outline-success]="!fg.invalid">\n <i class="fa fa-fw fa-save" aria-hidden="true"></i>\n Save Password\n </button>\n <p *ngIf="submitting">\n <i class="fa fa-fw fa-spin fa-refresh" aria-hidden="true"></i>\n Saving password...\n </p>\n <p *ngIf="unhandledError">\n <i class="fa fa-fw fa-warning text-danger" aria-hidden="true"></i>\n Error: {{unhandledError.code}}\n </p>\n </div>\n </form>\n </div>\n </div>\n ',styles:["\n\n "]}]}],_.ctorParameters=function(){return[{type:r.ActivatedRoute},{type:u.FormBuilder},{type:k}]};var N=function(e){function n(n,t){var r=e.call(this,t)||this;return r.route=n,r.screen="wait",r.email=null,r.error=null,r.user=null,r}return f(n,e),n.prototype.ngOnInit=function(){var e=this;this.service.onRouteChange("verify-email"),this.onInitLoadUser().then(function(){e.checkCode()})},n.prototype.checkCode=function(){var e=this;return new Promise(function(n){if(e.oobCode=e.route.snapshot.queryParams.oobCode||null,e.route.snapshot.queryParams.mode!==k.OUT_OF_BAND_MODES.verifyEmail||!e.oobCode)return e.service.navigate(),n(!1);e.service.auth.checkActionCode(e.oobCode).then(function(n){return e.email=n.data.email,e.service.auth.applyActionCode(e.oobCode)}).then(function(){e.screen="success",e.service.navigate(null,{queryParams:{email:e.email,message:A.emailVerified}}),n(!0)})["catch"](function(t){e.error=t,e.screen="error",n(!0)})})},n}(z);N.decorators=[{type:n.Component,args:[{selector:"ezfa-verify-email-route",template:'\n <div [ngSwitch]="screen">\n <div *ngSwitchCase="\'wait\'">\n <div class="alert alert-light" role="alert">\n <i class="fa fa-fw fa-refresh fa-spin" aria-hidden="true"></i>\n Verifying email<span *ngIf="email"> {{email}}</span>.\n Please wait...\n </div>\n </div>\n <div *ngSwitchCase="\'success\'">\n <div class="alert alert-success" role="alert">\n <i class="fa fa-fw fa-check" aria-hidden="true"></i>\n {{email}} verified.\n </div>\n <p class="text-right">\n <a *ngIf="user" routerLink="../account">Account</a>\n <a *ngIf="!user" routerLink="../sign-in" [queryParams]="{email: email}">Sign In</a>\n </p>\n </div>\n <div *ngSwitchCase="\'error\'">\n <div class="alert alert-danger" role="alert">\n <p>\n <i class="fa fa-fw fa-warning" aria-hidden="true"></i>\n <strong>Error</strong>\n </p>\n <p class="mb-0" [ngSwitch]="error.code">\n <span *ngSwitchCase="\'auth/expired-action-code\'">\n The email verification link you used has expired.\n <a routerLink="../send-email-verification-link" class="alert-link">Click here</a>\n to get a new link.\n </span>\n <span *ngSwitchCase="\'auth/invalid-action-code\'">\n The email verification link you used is invalid.\n This is probably because it has already been used once.\n <a routerLink="../send-email-verification-link" class="alert-link">Click here</a>\n to get a new link.\n </span>\n <span *ngSwitchCase="\'auth/user-disabled\'">\n The account associated with that email verification link has been disabled.\n </span>\n <span *ngSwitchCase="\'auth/user-not-found\'">\n The account associated with that email verification link has been deleted.\n </span>\n <span *ngSwitchDefault>\n An unexpected error occurred. Code: {{error.code}}\n </span>\n </p>\n\n </div>\n <p class="text-right">\n <a *ngIf="user" routerLink="../account">Account</a>\n <a *ngIf="!user" routerLink="../sign-in">Sign In</a>\n </p>\n </div>\n\n </div>\n ',styles:["\n\n "]}]}],N.ctorParameters=function(){return[{type:r.ActivatedRoute},{type:k}]};var V=function(e){function n(n,t){var r=e.call(this,t)||this;return r.route=n,r.screen="wait",r.error=null,r.user=null,r.submitting=!1,r.actionCodeInfo=null,r}return f(n,e),n.prototype.ngOnInit=function(){var e=this;this.service.onRouteChange("recover-email"),this.onInitLoadUser().then(function(){e.checkCode()})},n.prototype.submit=function(){var e=this;this.submitting=!0,this.service.auth.applyActionCode(this.oobCode).then(function(){e.screen="success",e.submitting=!1})["catch"](function(n){e.error=n,e.screen="error"})},n.prototype.checkCode=function(){var e=this;return new Promise(function(n){if(e.oobCode=e.route.snapshot.queryParams.oobCode||null,e.route.snapshot.queryParams.mode!==k.OUT_OF_BAND_MODES.recoverEmail||!e.oobCode)return e.service.navigate(),n(!1);e.service.auth.checkActionCode(e.oobCode).then(function(t){e.actionCodeInfo=t,e.screen="form",n(!0)})["catch"](function(t){e.error=t,e.screen="error",n(!0)})})},n}(z);V.decorators=[{type:n.Component,args:[{selector:"ezfa-recover-email-route",template:'\n <div [ngSwitch]="screen">\n <div *ngSwitchCase="\'wait\'">\n <div class="alert alert-light" role="alert">\n <i class="fa fa-fw fa-refresh fa-spin" aria-hidden="true"></i>\n Recovering email.\n Please wait...\n </div>\n </div>\n <div *ngSwitchCase="\'form\'">\n <div class="form-group"