add results for screen

This commit is contained in:
2026-09-10 14:21:45 +07:00
parent 399278d88c
commit 992d6fcfc1
50 changed files with 135 additions and 64 deletions
+1
View File
@@ -640,6 +640,7 @@ useSimplePolling(() => {
<n-button size="small" @click="setScreenMode('SCREEN_MODE_INTRO_DONE')">Успехов</n-button>
<n-button size="small" @click="setScreenMode('SCREEN_MODE_CONCLUSION')">Закрывашка</n-button>
<n-button size="small" @click="setScreenMode('SCREEN_MODE_CONCLUSION_DONE')">Спасибо за игру!</n-button>
<n-button v-if="game.status === 'finish'" size="small" @click="setScreenMode('SCREEN_MODE_RESULTS')">Результаты</n-button>
</n-space>
<n-space class="screen-mode-controls">
<n-button size="small" @click="sendScreenCommand('SCREEN_COMMAND_PLAY')">Запуск</n-button>
+23 -1
View File
@@ -4,7 +4,7 @@ import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'
import { useRoute } from 'vue-router'
import { getAuthClient } from '@/api/auth_client'
import type { Game, ScreenState } from '@/api/generated/crabs/evening_detective_server'
import type { Game, ScreenState, TeamResult } from '@/api/generated/crabs/evening_detective_server'
import HeaderMenu from '@/components/HeaderMenu.vue'
import { applicationFileURL } from '@/utils/application'
import { formatGameDateTime } from '@/utils/datetime'
@@ -17,6 +17,7 @@ const route = useRoute()
const screenId = ref('')
const accessToken = ref('')
const state = ref<ScreenState>()
const resultTeams = ref<TeamResult[]>([])
const games = ref<Game[]>([])
const selectedGameId = ref<number | null>(null)
const prepared = ref(false)
@@ -86,11 +87,18 @@ async function loadState() {
const res = await client.GetScreenState({ screenId: screenId.value, accessToken: accessToken.value })
if (res.error) throw new Error(res.error)
state.value = res.state
if (state.value?.mode === 'SCREEN_MODE_RESULTS') await loadResults()
} catch (err) {
message.error(err instanceof Error ? err.message : 'Не удалось получить состояние экрана')
}
}
async function loadResults() {
if (!screenId.value || !accessToken.value) return
const res = await client.GetScreenResults({ screenId: screenId.value, accessToken: accessToken.value })
if (res.error == '') resultTeams.value = res.teams || []
}
async function loadGames() {
try {
const res = await client.GetGames({})
@@ -257,6 +265,20 @@ onUnmounted(() => {
<div v-else-if="screenMode === 'SCREEN_MODE_CONCLUSION'" class="screen-message">Видео закрывашки не задано</div>
<div v-else-if="screenMode === 'SCREEN_MODE_INTRO_DONE'" class="screen-message">Успехов</div>
<div v-else-if="screenMode === 'SCREEN_MODE_CONCLUSION_DONE'" class="screen-message">Спасибо за игру!</div>
<div v-else-if="screenMode === 'SCREEN_MODE_RESULTS'" class="results-screen">
<h1>Результаты</h1>
<table>
<thead><tr><th>Место</th><th>Команда</th><th>Баллы</th><th>Ходы</th></tr></thead>
<tbody>
<tr v-for="result in resultTeams" :key="result.team?.id">
<td>{{ result.place }}</td>
<td>{{ result.team?.name }}</td>
<td>{{ result.totalScore }}</td>
<td>{{ result.actionsCount }}</td>
</tr>
</tbody>
</table>
</div>
<div v-else class="screen-cover">
<img v-if="state.coverImage" :src="state.coverImage" class="cover-image" alt="Обложка дела" />
<p class="cover-label">{{ state.gameName || `Игра №${state.gameId}` }}</p>