import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, inject, OnDestroy, OnInit } from '@angular/core'; import { FormControl, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; import { ToastrService } from 'ngx-toastr'; import { map, Observable, of, shareReplay, take } from 'rxjs'; import { User } from 'src/app/_models/user'; import { AccountService } from 'src/app/_services/account.service'; import {takeUntilDestroyed} from "@angular/core/rxjs-interop"; import { NgbCollapse } from '@ng-bootstrap/ng-bootstrap'; import { NgIf, NgFor, AsyncPipe } from '@angular/common'; import {translate, TranslocoDirective} from "@ngneat/transloco"; @Component({ selector: 'app-change-password', templateUrl: './change-password.component.html', styleUrls: ['./change-password.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgIf, NgbCollapse, NgFor, ReactiveFormsModule, AsyncPipe, TranslocoDirective] }) export class ChangePasswordComponent implements OnInit, OnDestroy { passwordChangeForm: FormGroup = new FormGroup({}); user: User | undefined = undefined; hasChangePasswordAbility: Observable = of(false); observableHandles: Array = []; passwordsMatch = false; resetPasswordErrors: string[] = []; isViewMode: boolean = true; private readonly destroyRef = inject(DestroyRef); public get password() { return this.passwordChangeForm.get('password'); } public get confirmPassword() { return this.passwordChangeForm.get('confirmPassword'); } constructor(private accountService: AccountService, private toastr: ToastrService, private readonly cdRef: ChangeDetectorRef) { } ngOnInit(): void { this.accountService.currentUser$.pipe(takeUntilDestroyed(this.destroyRef), shareReplay(), take(1)).subscribe(user => { this.user = user; this.cdRef.markForCheck(); }); this.hasChangePasswordAbility = this.accountService.currentUser$.pipe(takeUntilDestroyed(this.destroyRef), shareReplay(), map(user => { return user !== undefined && (this.accountService.hasAdminRole(user) || this.accountService.hasChangePasswordRole(user)); })); this.cdRef.markForCheck(); this.passwordChangeForm.addControl('password', new FormControl('', [Validators.required])); this.passwordChangeForm.addControl('confirmPassword', new FormControl('', [Validators.required])); this.passwordChangeForm.addControl('oldPassword', new FormControl('', [Validators.required])); this.observableHandles.push(this.passwordChangeForm.valueChanges.subscribe(() => { const values = this.passwordChangeForm.value; this.passwordsMatch = values.password === values.confirmPassword; this.cdRef.markForCheck(); })); } ngOnDestroy() { this.observableHandles.forEach(o => o.unsubscribe()); } resetPasswordForm() { this.passwordChangeForm.get('password')?.setValue(''); this.passwordChangeForm.get('confirmPassword')?.setValue(''); this.passwordChangeForm.get('oldPassword')?.setValue(''); this.resetPasswordErrors = []; this.cdRef.markForCheck(); } savePasswordForm() { if (this.user === undefined) { return; } const model = this.passwordChangeForm.value; this.resetPasswordErrors = []; this.observableHandles.push(this.accountService.resetPassword(this.user?.username, model.confirmPassword, model.oldPassword).subscribe(() => { this.toastr.success(translate('toasts.password-updated')); this.resetPasswordForm(); this.isViewMode = true; }, err => { this.resetPasswordErrors = err; })); } toggleViewMode() { this.isViewMode = !this.isViewMode; this.resetPasswordForm(); } }