up
This commit is contained in:
+28
-3
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user