import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnDestroy, OnInit, Output, signal, } from '@angular/core'; import { CommonModule } from '@angular/common'; import { animate, style, transition, trigger } from '@angular/animations'; import { interval, Subscription, takeWhile } from 'rxjs'; @Component({ selector: 'app-debt-dialog', standalone: true, imports: [CommonModule], template: ` `, changeDetection: ChangeDetectionStrategy.OnPush, animations: [ trigger('fadeInOut', [ transition(':enter', [ style({ opacity: 0 }), animate('150ms ease-out', style({ opacity: 1 })), ]), transition(':leave', [animate('150ms ease-in', style({ opacity: 0 }))]), ]), trigger('cardAnimation', [ transition(':enter', [ style({ opacity: 0, transform: 'scale(0.95)' }), animate('200ms ease-out', style({ opacity: 1, transform: 'scale(1)' })), ]), ]), trigger('countdown', [ transition('* => *', [ style({ transform: 'scale(1.2)' }), animate('100ms ease-out', style({ transform: 'scale(1)' })), ]), ]), ], }) export class DebtDialogComponent implements OnInit, OnDestroy { @Input() amount = 0; @Input() set show(value: boolean) { this.visible = value; if (value) { this.startTimer(); } } @Output() dialogClosed = new EventEmitter(); visible = false; timeLeft = signal(30); private timerSubscription: Subscription | undefined; private warningSound = new Audio('assets/sounds/warning.mp3'); ngOnInit() { if (this.visible) { this.startTimer(); } } ngOnDestroy() { this.stopTimer(); } private startTimer() { this.timeLeft.set(30); this.timerSubscription = interval(1000) .pipe(takeWhile(() => this.timeLeft() > 0)) .subscribe(() => { this.timeLeft.update((value) => value - 1); if (this.timeLeft() <= 5) { this.warningSound.play(); } if (this.timeLeft() === 0) { setTimeout(() => this.closeDialog(), 5000); } }); } private stopTimer() { if (this.timerSubscription) { this.timerSubscription.unsubscribe(); } } closeDialog(): void { this.stopTimer(); this.visible = false; this.dialogClosed.emit(); } }