import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core'; import { form, FormField, required, submit } from '@angular/forms/signals'; import { RouterLink } from '@angular/router'; import { injectMutation } from '@tanstack/angular-query-experimental'; import { injectAuthService } from '@/core/services/auth.service'; import { injectUIService } from '@/core/services/ui.service'; import { PrivacyComponent } from '@/features/privacy/privacy.component'; import { CheckboxComponent } from '@/shared/forms/checkbox/checkbox.component'; import { signalFormErrors } from '@/shared/forms/form-validations'; import { InputComponent } from '@/shared/forms/input/input.component'; import { AuthLayoutComponent } from '@/shared/layout/auth-layout/auth-layout.component'; import { ButtonDirective } from '@/shared/ui/button.directive'; import { ModalComponent } from '@/shared/ui/modal/modal.component'; @Component({ selector: 'app-signup', templateUrl: './signup.component.html', styleUrls: ['./signup.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ RouterLink, FormField, InputComponent, CheckboxComponent, AuthLayoutComponent, ModalComponent, PrivacyComponent, ButtonDirective, ], }) export default class SignupComponent { private authSrv = injectAuthService(); private uiServ = injectUIService(); openPrivacy = signal(false); signupModel = signal({ fullname: '', employee_id: '', acceptTerms: false, }); signupForm = form(this.signupModel, (path) => { required(path.fullname, { message: signalFormErrors.required }); required(path.employee_id, { message: signalFormErrors.required }); required(path.acceptTerms, { message: signalFormErrors.acceptTerms }); }); signup = injectMutation(() => ({ mutationFn: (_: void) => this.authSrv.signup(this.signupModel()), onError: (error) => this.uiServ.showErrorAlert(error.message), })); onSubmit(event: Event) { event.preventDefault(); submit(this.signupForm, { action: async () => this.signup.mutate(), }); } openPrivacyModal(e: MouseEvent) { e.preventDefault(); e.stopPropagation(); this.openPrivacy.set(true); } }