import { ChangeDetectionStrategy, Component, computed, ElementRef, input, signal, viewChild, } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; import { DatePipe } from '@angular/common'; import { injectMutation } from '@tanstack/angular-query-experimental'; import { startWith, switchMap } from 'rxjs'; import { UnixTimePipe } from '@/core/pipes/unix-time.pipe'; import { injectStaffService } from '@/core/services/staff.service'; import { injectUIService } from '@/core/services/ui.service'; import { injectWebsocketService } from '@/core/services/websocket.service'; import { ButtonDirective } from '@/shared/ui/button.directive'; import { ModalComponent } from '@/shared/ui/modal/modal.component'; import { CodeInputComponent } from '../code-input/code-input.component'; import { injectPrintBadge } from '../print-badge'; import { ScannerComponent } from '../scanner/scanner.component'; import { UserCreateComponent } from '../user-create/user-create.component'; type StaffUser = { fullname?: string; type_id: number; }; type ScannedUser = { first_access: boolean | 0 | 1; last_access_unixtime: number; fullname: string; qrcodedata: string; }; type CreatedUser = { id: number; name?: string | null; lastname1?: string | null; lastname2?: string | null; }; @Component({ selector: 'app-user-scan', templateUrl: './user-scan.component.html', styleUrls: ['./user-scan.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ ScannerComponent, ModalComponent, UnixTimePipe, ButtonDirective, CodeInputComponent, UserCreateComponent, ], providers: [DatePipe], }) export class UserScanComponent { private staffService = injectStaffService(); private uiServ = injectUIService(); private wsService = injectWebsocketService(); pdfIframe = viewChild>('pdfIframe'); user = input.required(); openScanner = signal(false); openCodeInput = signal(false); scannedUser = signal(null); openWelcome = computed(() => !!this.scannedUser()); openSignUp = signal(false); signUpUser = signal(null); openSignUpWelcome = computed(() => !!this.signUpUser()); scanUserQR = injectMutation(() => ({ mutationFn: (code: string) => { this.openScanner.set(false); this.openCodeInput.set(false); return this.staffService.scanUserCode(code); }, onError: (error) => this.uiServ.showErrorAlert(error.message), onSuccess: (user) => this.scannedUser.set(user), })); printBadge = injectPrintBadge(this.pdfIframe); quorum$ = this.wsService.listen('refresh_quorum', ['quorum']).pipe( startWith({ current_quorum: 0 }), switchMap(() => this.staffService.getCurrentQuorum()) ); quorum = toSignal(this.quorum$, { initialValue: 0 }); rescan() { this.scannedUser.set(null); this.openScanner.set(true); } reenter() { this.scannedUser.set(null); this.openCodeInput.set(true); } createdUser(user: CreatedUser) { this.openSignUp.set(false); this.signUpUser.set(user); } resignUp() { this.signUpUser.set(null); this.openSignUp.set(true); } }