From af6eb62a8e771f5888edaca9520388749f8b707c Mon Sep 17 00:00:00 2001 From: Fedorov Vladimir Date: Mon, 21 Sep 2026 18:24:38 +0700 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=82=D0=B0=D0=B9=D0=BC=D0=B5=D1=80=D0=BE=D0=BC=20?= =?UTF-8?q?=D0=BE=D1=80=D0=B3=D0=B0=D0=BD=D0=B8=D0=B7=D0=B0=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/GamePage.vue | 70 +++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/src/components/GamePage.vue b/src/components/GamePage.vue index 8dbd20a..bb48986 100644 --- a/src/components/GamePage.vue +++ b/src/components/GamePage.vue @@ -97,11 +97,31 @@ const mapItems = ref([]) const mapSaving = ref(false) const screenVolume = ref(100) const screenPosition = ref(0) +const timerDurationMinutes = ref(10) +const timerLabel = ref('Перерыв') +const timerFormInitialized = ref(false) const currentScreenMode = computed(() => { const modes = screens.value.map((screen) => screen.mode).filter(Boolean) if (!modes.length || modes.some((mode) => mode !== modes[0])) return undefined return modes[0] as ScreenMode }) +const timerScreen = computed(() => screens.value[0]) +const timerStateLabel = computed(() => { + switch (timerScreen.value?.timerState) { + case 'SCREEN_TIMER_STATE_RUNNING': + return 'Идёт' + case 'SCREEN_TIMER_STATE_PAUSED': + return 'Пауза' + case 'SCREEN_TIMER_STATE_FINISHED': + return 'Завершён' + default: + return 'Остановлен' + } +}) +const timerRemainingLabel = computed(() => { + const seconds = Math.max(0, timerScreen.value?.timerRemainingSeconds || 0) + return `${String(Math.floor(seconds / 60)).padStart(2, '0')}:${String(seconds % 60).padStart(2, '0')}` +}) const mapScale = ref(1) const mapOffset = ref({ x: 0, y: 0 }) let dragState: @@ -150,6 +170,11 @@ async function getGameScreens() { return } screens.value = res.screens || [] + if (!timerFormInitialized.value && screens.value[0]) { + timerDurationMinutes.value = Math.max(1, (screens.value[0].timerDurationSeconds || 600) / 60) + timerLabel.value = screens.value[0].timerLabel || 'Перерыв' + timerFormInitialized.value = true + } } getGameScreens() @@ -276,6 +301,25 @@ async function setScreenMode(mode: ScreenMode) { if (res.error != '') message.error(res.error || 'Не удалось изменить режим экранов') } +async function configureScreenTimer() { + const durationMinutes = timerDurationMinutes.value + const label = timerLabel.value.trim() + if (!durationMinutes || durationMinutes <= 0 || !label) { + message.error('Укажите длительность и надпись таймера') + return + } + const res = await client.SetScreenTimer({ + gameId: Number(gameId), + durationSeconds: Math.round(durationMinutes * 60), + label, + }) + if (res.error != '') { + message.error(res.error || 'Не удалось настроить таймер') + return + } + await getGameScreens() +} + async function sendScreenCommand(command: ScreenCommand) { if (command === 'SCREEN_COMMAND_PLAY' || command === 'SCREEN_COMMAND_REPLAY') { if (!window.confirm('Запустить медиа на всех экранах?')) return @@ -815,6 +859,32 @@ useSimplePolling(() => { @click="setScreenMode('SCREEN_MODE_RESULTS')" >Результаты + Таймер + + + + + Настроить таймер + {{ timerStateLabel }} · {{ timerRemainingLabel }} + + + Старт таймера + Пауза таймера + Продолжить таймер + Сбросить таймер Запуск