This commit is contained in:
2026-10-23 03:02:55 +07:00
parent e2f8a3302e
commit 1ce8efeef5
21 changed files with 561 additions and 46 deletions
+28 -3
View File
@@ -1,3 +1,5 @@
import { timerLabels, validQR } from '../src/utils/presentation.js'
import type { TimerType } from '../src/types/screen.js'
import { ResponseFieldError } from './request-error.js'
import type { ScreenMode, ScreenPlan } from '../src/types/screen.js'
import { integer, object, text } from './remote-state.js'
@@ -12,6 +14,8 @@ const modes = [
'RESULTS',
'TIMER',
'TEXT',
'QR',
'TEAMS',
]
export function parsePlan(value: unknown): ScreenPlan {
@@ -29,13 +33,13 @@ export function parsePlan(value: unknown): ScreenPlan {
? modes.indexOf(step.mode.slice(12))
: step.mode,
1,
8,
10,
`${field}.mode`,
)
} catch {
throw new ResponseFieldError(
`${field}.mode`,
'режим экрана 1–8 или enum ScreenMode',
'режим экрана 1–10 или enum ScreenMode',
step.mode,
'Некорректный режим экрана',
)
@@ -45,6 +49,9 @@ export function parsePlan(value: unknown): ScreenPlan {
content = mode === 3 ? 'Успехов' : 'Спасибо за игру!'
mode = 8
}
const timerType = parseTimerType(step.timerType)
const qrUrl = text(step.qrUrl ?? '', `${field}.qrUrl`)
if (mode === 9 && !validQR(qrUrl, content)) throw new Error('Укажите ссылку HTTP/HTTPS до 2048 байт и текст до 10000 байт')
const label = text(step.timerLabel ?? '', `${field}.timerLabel`).trim()
const seconds = integer(
step.timerDurationSeconds ?? 0,
@@ -69,8 +76,10 @@ export function parsePlan(value: unknown): ScreenPlan {
return {
mode: mode as ScreenMode,
text: content,
timerLabel: mode === 7 ? label || 'Перерыв' : label,
timerLabel: mode === 7 ? label || timerLabels[timerType] : label,
timerDurationSeconds: seconds,
...(qrUrl ? { qrUrl } : {}),
...(timerType ? { timerType } : {}),
}
})
return {
@@ -83,3 +92,19 @@ export function parsePlan(value: unknown): ScreenPlan {
),
}
}
export function parseTimerType(value: unknown): TimerType {
const names = [
'SCREEN_TIMER_TYPE_BREAK',
'SCREEN_TIMER_TYPE_BEFORE_GAME',
'SCREEN_TIMER_TYPE_UNTIL_END',
]
return integer(
typeof value === 'string' && value.startsWith('SCREEN_TIMER_TYPE_')
? names.indexOf(value)
: (value ?? 0),
0,
2,
'timerType',
) as TimerType
}