import { Component, ViewChild, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators, AbstractControl, ValidationErrors, ReactiveFormsModule } from '@angular/forms'; import { TranslateModule } from '@ngx-translate/core'; import { CommonModule } from '@angular/common'; import { PasswordHideShowComponent } from '../../shared/components/password-hide-show/password-hide-show.component'; import { URIKey } from '../../utils/uri-enums'; import { HttpURIService } from '../../app.http.uri.service'; import { StorageService } from '../../shared/services/storage.service'; import { I18NService } from '../../services/i18n.service'; import { ErrorMessages, SuccessMessages } from '../../utils/enums'; import { HttpErrorResponse } from '@angular/common/http'; import { Router } from '@angular/router'; @Component({ selector: 'app-reset-password', imports: [TranslateModule, PasswordHideShowComponent, CommonModule, ReactiveFormsModule], templateUrl: './reset-password.component.html', styleUrl: './reset-password.component.scss' }) export class ResetPasswordComponent implements OnInit{ resetPasswordForm!: FormGroup passwordType1: string = 'password'; passwordType2: string = 'password'; @ViewChild('psh1') passwordHideShow1?: PasswordHideShowComponent; @ViewChild('psh2') passwordHideShow2?: PasswordHideShowComponent; constructor(private fb: FormBuilder, private httpURIService: HttpURIService, private storageService: StorageService, private i18nService: I18NService, private router: Router){} ngOnInit(): void { const userIdValue = this.storageService.getItem('USER_ID') this.resetPasswordForm = this.fb.group({ userId: [{value: userIdValue || '', disabled: true}], newPassword: ['', [ Validators.required, Validators.minLength(8), Validators.maxLength(20), Validators.pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]+$/) ] ], confirmPassword: ['', [ Validators.required, Validators.minLength(8), Validators.maxLength(20), Validators.pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]+$/) ] ] }, { validators: this.passwordMatchValidator } ); this.resetPasswordForm.get('newPassword')?.valueChanges.subscribe(()=>{ this.resetPasswordForm.get('confirmPassword')?.updateValueAndValidity(); }); } togglePasswordType1() { this.passwordType1 = this.passwordHideShow1?.showPassword ? 'password' : 'text'; } togglePasswordType2() { this.passwordType2 = this.passwordHideShow2?.showPassword ? 'password' : 'text'; } passwordMatchValidator(group: AbstractControl): ValidationErrors | null { const newPassword = group.get('newPassword'); const confirmPassword = group.get('confirmPassword'); if (!newPassword || !confirmPassword) return null; if (confirmPassword.errors && !confirmPassword.errors['passwordMismatch']) { return null; } if (newPassword.value !== confirmPassword.value) { confirmPassword.setErrors({ passwordMismatch: true }); return { passwordMismatch: true }; } else { confirmPassword.setErrors(null); return null; } } onSubmit() { if (this.resetPasswordForm.invalid) return; const payload = { userId: this.resetPasswordForm.get('userId')?.value, newPassword: this.resetPasswordForm.get('newPassword')?.value, porOrgaCode: this.storageService.getItem('POR_ORGACODE') }; this.httpURIService.requestPOST(URIKey.RESET_PASSWORD_URI, payload) .subscribe({ next: (response) => { if (!(response instanceof HttpErrorResponse)) { this.i18nService.success(SuccessMessages.RESET_PASSWORD_SUCCESS, []); this.router.navigate(['/dashboard']); } } }); } }