tgd-frontend/src/app/components/game-queue/game-queue.component.ts
2024-10-29 22:39:42 +04:00

107 lines
3 KiB
TypeScript

import { Component, Input, OnInit } from '@angular/core';
import { EventGameQueue, QueueTypes } from "../../../types/server-event";
import { Participant } from "../../../types/participant";
import { ApiService } from "../../services/api.service";
import { Subject } from "rxjs";
import { takeUntil } from "rxjs/operators";
import { Question } from "../../../types/question";
import { getAudioPath } from "../../helper/tts.helper";
import { PrizeDto } from "../../../types/prize.dto";
@Component({
selector: 'app-game-queue',
templateUrl: './game-queue.component.html',
styleUrls: ['./game-queue.component.scss']
})
export class GameQueueComponent implements OnInit {
@Input() action: EventGameQueue;
readonly gameQueueTypes = QueueTypes
participant: Participant;
destroyed$ = new Subject<void>();
penalty = '';
countdown: number;
showCountdown: boolean;
question: Question = new Question();
showQuestion = false;
showPrize = false;
prize: PrizeDto;
countdownCompleted$: Subject<void> = new Subject<void>();
prizeAudioSrc: string;
screpaText: string;
constructor(private apiService: ApiService) { }
ngOnInit(): void {
this.apiService.getParticipant(this.action.target).pipe(
takeUntil(this.destroyed$)
).subscribe(e => {
this.participant = e;
});
if(this.action.type === this.gameQueueTypes.penalty) {
this.getPenalty();
}
if(this.action.type === this.gameQueueTypes.additionalQuestion) {
this.getAdditionalQuestion()
}
if(this.action.type === this.gameQueueTypes.playExtraCard) {
this.playExtraCards();
}
if(this.action.type === this.gameQueueTypes.giveOutAPrize) {
this.countdown = 10;
this.showCountdown = true;
this.countdownCompleted$.pipe(takeUntil(this.destroyed$)).subscribe(() => {
this.getPrize();
});
}
if(this.action.type == this.gameQueueTypes.screpa) {
this.screpaText = this.action.text ?? '';
}
console.log(this.action);
}
getPenalty() {
this.apiService.getPenalty().pipe(
takeUntil(this.destroyed$),
).subscribe((penalty) => {
this.penalty = penalty.text;
this.countdown = 10;
this.showCountdown = true;
});
}
playExtraCards() {
this.apiService.playExtraCards()
.pipe(
takeUntil(this.destroyed$),
).subscribe(() => {
console.log(`triggered`);
})
}
countdownCompleted() {
this.showCountdown = false;
this.countdownCompleted$.next();
}
private getAdditionalQuestion() {
this.apiService.getAdditionalQuestion(this.action.target).subscribe(e => {
this.question = e;
this.showQuestion = true;
})
}
getAudio(penalty: string, voice = 1) {
return getAudioPath(penalty, voice);
}
private getPrize() {
this.apiService.getPrize().pipe(takeUntil(this.destroyed$)).subscribe((r) => {
this.prize = r;
this.showPrize = true;
this.prizeAudioSrc = getAudioPath(`Поздравляю, ${this.participant.name} получает ${this.prize.name}`);
});
}
}