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, HttpParams } from '@angular/common/http'; import { Router } from '@angular/router'; import { NgSelectModule } from '@ng-select/ng-select'; import { SetupUser } from '../../models/user'; @Component({ selector: 'app-reset-password', imports: [TranslateModule, PasswordHideShowComponent, CommonModule, ReactiveFormsModule, NgSelectModule], templateUrl: './reset-password.component.html', styleUrl: './reset-password.component.scss' }) export class ResetPasswordComponent implements OnInit{ resetPasswordForm!: FormGroup passwordType1: string = 'password'; passwordType2: string = 'password'; isLoading: boolean = false; allUsersDropdown: SetupUser[] = []; selectedUserId: string | null = null; isSubmitting: boolean = false; @ViewChild('psh1') passwordHideShow1?: PasswordHideShowComponent; @ViewChild('psh2') passwordHideShow2?: PasswordHideShowComponent; constructor( private fb: FormBuilder, private httpService: HttpURIService, private storageService: StorageService, private i18nService: I18NService, private router: Router ){} ngOnInit(): void { this.initializeForm(); this.loadUsersForDropdown(); } initializeForm(): void { this.resetPasswordForm = this.fb.group({ userId: ['', Validators.required], // Changed to empty string and required 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 }); // Update confirm password validation when new password changes 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) { this.resetPasswordForm.markAllAsTouched(); return; } this.isSubmitting = true; const selectedId = this.resetPasswordForm.get('userId')?.value; console.log("userid.....", selectedId); const payload = { userId: selectedId, newPassword: this.resetPasswordForm.get('newPassword')?.value, porOrgaCode: this.storageService.getItem('POR_ORGACODE') }; this.httpService.requestPOST(URIKey.RESET_PASSWORD_URI, payload).subscribe({ next: (response) => { if (!(response instanceof HttpErrorResponse)) { this.i18nService.success(SuccessMessages.RESET_PASSWORD_SUCCESS, []); this.resetForm(); // Reset form after successful submission // Optional: Navigate to dashboard or stay on page setTimeout(() => { this.router.navigate(['/dashboard']); }, 1500); } this.isSubmitting = false; }, error: (error) => { console.error('Error resetting password:', error); this.isSubmitting = false; } }); } // Method to properly reset the form resetForm(): void { // Reset the form values this.resetPasswordForm.reset(); // Reset password visibility this.passwordType1 = 'password'; this.passwordType2 = 'password'; // Reset password hide/show components if available if (this.passwordHideShow1) { this.passwordHideShow1.showPassword = false; } if (this.passwordHideShow2) { this.passwordHideShow2.showPassword = false; } // Mark all controls as untouched and pristine Object.keys(this.resetPasswordForm.controls).forEach(key => { const control = this.resetPasswordForm.get(key); control?.markAsUntouched(); control?.markAsPristine(); }); // Reset ng-select by clearing the value setTimeout(() => { this.resetPasswordForm.patchValue({ userId: '', newPassword: '', confirmPassword: '' }); }, 0); } loadUsersForDropdown(): void { this.isLoading = true; let params = new HttpParams() .set('page', '0') .set('size', '1000'); this.httpService.requestGET(URIKey.GET_ALL_USER_URI, params).subscribe({ next: (response) => { this.allUsersDropdown = response || []; this.isLoading = false; }, error: (err) => { console.error('Error fetching users:', err); this.allUsersDropdown = []; this.isLoading = false; } }); } }