Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | 1x 18x 18x 18x 18x 18x 18x 18x 18x 18x 18x 2x 2x 1x 1x | /* eslint-disable import-x/max-dependencies -- 11 dependencies */
import { AsyncPipe } from '@angular/common';
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
import type { Signal } from '@angular/core';
import { FormGroup, ReactiveFormsModule } from '@angular/forms';
import type { FormControl, ValidationErrors } from '@angular/forms';
import { Router, RouterLink } from '@angular/router';
import type { Observable } from 'rxjs';
import { SpinnerComponent } from '~/app/shared/spinner/spinner.component';
import { getState } from '../actions/get-state';
import { AuthErrorMessagesComponent } from '../auth-error-messages/auth-error-messages.component';
import { createPasswordControl, PASSWORDS } from '../identity-forms';
import { confirmMatch, confirmMatchFormErrors } from '../validators/confirm-match';
import { ResetPasswordService } from './reset-password.service';
import type { ResetPasswordResults } from './reset-password.service';
/** Collect and confirm a new password for user's account. */
type ResetPasswordFormGroup = FormGroup<{
password1: FormControl<string | null>;
password2: FormControl<string | null>;
}>;
/**
* Collects and confirm new password to recover user's account with Firebase Authentication.
*/
@Component({
selector: 'app-reset-password',
imports: [
AsyncPipe,
AuthErrorMessagesComponent,
ReactiveFormsModule,
RouterLink,
SpinnerComponent,
],
templateUrl: './reset-password.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ResetPasswordComponent {
/** Form level aria-invalid. */
public readonly $formPasswordsInvalid: Signal<boolean>;
/** Errors specific to first password field. */
public readonly $password1CntrlErrors: Signal<ValidationErrors | undefined>;
/** Aria-invalid attribute for first password field. */
public readonly $password1CntrlInvalid: Signal<boolean>;
/** Errors specific to second password field. */
public readonly $password2CntrlErrors: Signal<ValidationErrors | undefined>;
/** Aria-invalid attribute for second password field */
public readonly $password2CntrlInvalid: Signal<boolean>;
/** Used in error message for password maximum length. */
public readonly maxPasswordLength: number = PASSWORDS.maxLength;
/** Used in error message for password minimum length. */
public readonly minPasswordLength: number = PASSWORDS.minLength;
public readonly password1Cntrl: FormControl<string | null>;
public readonly password2Cntrl: FormControl<string | null>;
public readonly resetPasswordForm: ResetPasswordFormGroup;
/** Verification of password reset oobCode. */
public readonly vm$: Observable<ResetPasswordResults>;
private readonly _router: Router;
private readonly _service: ResetPasswordService;
/**
* Gets the current navigation statically to obtain the oobCode from Firebase needed to reset the
* User's password.
*/
constructor() {
this._router = inject(Router);
this._service = inject(ResetPasswordService);
({
$errors: this.$password1CntrlErrors,
$invalid: this.$password1CntrlInvalid,
control: this.password1Cntrl,
} = createPasswordControl(true));
({
$errors: this.$password2CntrlErrors,
$invalid: this.$password2CntrlInvalid,
control: this.password2Cntrl,
} = createPasswordControl());
this.resetPasswordForm = new FormGroup(
{
password1: this.password1Cntrl,
password2: this.password2Cntrl,
},
confirmMatch('password1', 'password2'),
);
this.$formPasswordsInvalid = confirmMatchFormErrors(this.resetPasswordForm, this.password1Cntrl, this.password2Cntrl);
const { oobCode } = getState(this._router.getCurrentNavigation());
this.vm$ = this._service.resetPassword$(oobCode);
}
/**
* Replace the user's password with the new password from the form.
*/
public onSubmit(): void {
const { password1 } = this.resetPasswordForm.value;
if (this.resetPasswordForm.invalid || !password1) {
throw new Error('Invalid form submitted');
}
this._service.replacePassword(password1);
}
}
|