import { ChangeDetectionStrategy, Component, inject, input, signal } from '@angular/core' import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms' import { Title } from '@angular/platform-browser' import { RouterLink } from '@angular/router' import { ApiError, toApiError } from '../../core/api.service' import { AuthStore } from '../../core/auth.store' import { authErrorMessage } from '../../shared/form-errors' import { FormField } from '../../shared/form-field' /** * Login. `?redirect=` (validato in core/redirect.ts) indica dove tornare: una pagina dell'area riservata * o del sito pubblico (es. `/checkout`). `?scaduta=1` = sessione persa durante l'uso; * `?account=disattivato` = account appena disattivato dall'utente. */ @Component({ selector: 'app-login', imports: [ReactiveFormsModule, RouterLink, FormField], changeDetection: ChangeDetectionStrategy.OnPush, template: `

Accedi

@if (account() === 'disattivato') {

Il tuo account è stato disattivato e la richiesta di cancellazione è stata inviata. Grazie per averci scelto.

} @if (scaduta()) {

La sessione è scaduta: accedi di nuovo per continuare.

} @if (error(); as message) { }

Password dimenticata?

Non hai un account? Registrati

`, styles: ` .single { grid-template-columns: 1fr; } .forgot { margin: var(--space-2) 0 var(--space-5); text-align: right; } .switch { margin: var(--space-5) 0 0; text-align: center; } `, }) export default class Login { private readonly auth = inject(AuthStore) readonly redirect = input() readonly scaduta = input() /** `disattivato` dopo la richiesta di cancellazione dell'account. */ readonly account = input() protected readonly form = new FormGroup({ email: new FormControl('', { nonNullable: true, validators: [Validators.required, Validators.email] }), password: new FormControl('', { nonNullable: true, validators: [Validators.required] }), }) protected readonly submitted = signal(false) protected readonly busy = signal(false) protected readonly error = signal(null) constructor() { inject(Title).setTitle('Accedi | Area riservata ITI TECHNOLOGY') } protected async submit(): Promise { this.submitted.set(true) this.error.set(null) if (this.form.invalid || this.busy()) return this.busy.set(true) try { const { email, password } = this.form.getRawValue() await this.auth.login(email.trim(), password) await this.auth.navigateAfterLogin(this.redirect() ?? null) } catch (err) { const error = err instanceof ApiError ? err : toApiError(err) this.error.set(error.code === 'INVALID_CREDENTIALS' ? 'Email o password non corretti.' : authErrorMessage(error)) this.form.controls.password.reset() } finally { this.busy.set(false) } } }