import {Component} from '@angular/core'; import {MatDialogActions, MatDialogContent, MatDialogRef, MatDialogTitle} from '@angular/material/dialog'; import {FormBuilder, FormGroup, ReactiveFormsModule, Validators} from '@angular/forms'; import {MatButtonModule} from '@angular/material/button'; import {MatInputModule} from '@angular/material/input'; import {MatFormFieldModule} from '@angular/material/form-field'; import {NgIf} from '@angular/common'; import {LoginService} from '../../api'; import {MatSnackBar} from '@angular/material/snack-bar'; import {CookieService} from 'ngx-cookie-service'; @Component({ selector: 'app-login', standalone: true, imports: [ ReactiveFormsModule, MatButtonModule, MatInputModule, MatFormFieldModule, MatDialogTitle, MatDialogContent, MatDialogActions, NgIf ], templateUrl: './login.component.html', styleUrl: './login.component.scss' }) export class LoginDialogComponent { public loginForm: FormGroup; constructor( public dialogRef: MatDialogRef, private fb: FormBuilder, private loginService: LoginService, private snackBar: MatSnackBar, private cookieService: CookieService ) { this.loginForm = this.fb.group({ code: ['', [ Validators.required, Validators.minLength(8), Validators.maxLength(8), Validators.pattern('^[ABCDEFGHJKLMNPQRSTUVWXYZ23456789]+$') ]] }); } onCancel(): void { this.dialogRef.close(); } onSubmit(): void { if (!this.loginForm.valid) { this.snackBar.open('Invalid code', '', {duration: 2000}); return; } this.snackBar.open('Logging in...', '', {duration: 2000}); this.loginService.login(this.loginForm.value.code).subscribe({ next: (jwt) => { this.saveJwt(jwt as JsonWebKey); this.dialogRef.close(jwt); }, error: () => { this.loginForm.get('code')?.setErrors({ invalid: true }); } }); } private saveJwt(jwt: JsonWebKey) { this.cookieService.set('jwt', jwt.toString(), { path: '/', secure: true, sameSite: 'Strict' }); } public formHasError() { return this.loginForm.get('code')?.hasError('required'); } }