add quiz schemas to shared types: QuizQuestion, GameState fields, WS messages

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 06:48:21 +01:00
parent 8caf9ab2f3
commit 4ada13ca9f
2 changed files with 41 additions and 0 deletions

View File

@@ -87,6 +87,22 @@ export const bingoCardSchema = z.object({
export type BingoCard = z.infer<typeof bingoCardSchema>
// ─── Quiz ────────────────────────────────────────────────────────
export const quizQuestionSchema = z.object({
index: z.number(),
total: z.number(),
difficulty: z.enum(["easy", "medium", "hard"]),
text: z.string(),
answer: z.string(),
status: z.enum(["buzzing", "judging", "resolved"]),
buzzerPlayerId: z.string().nullable(),
buzzerName: z.string().nullable(),
wasCorrect: z.boolean().nullable(),
})
export type QuizQuestion = z.infer<typeof quizQuestionSchema>
// ─── Scoring ────────────────────────────────────────────────────────
export const leaderboardEntrySchema = z.object({
@@ -95,6 +111,7 @@ export const leaderboardEntrySchema = z.object({
juryPoints: z.number(),
bingoPoints: z.number(),
predictionPoints: z.number(),
quizPoints: z.number(),
totalPoints: z.number(),
})
@@ -117,6 +134,9 @@ export const gameStateSchema = z.object({
playerId: z.string(),
displayName: z.string(),
})),
// Quiz
currentQuizQuestion: quizQuestionSchema.nullable(),
myQuizBuzzStatus: z.enum(["can_buzz", "already_buzzed", "excluded", "waiting"]).nullable(),
actualResults: actualResultsSchema.nullable(),
// Leaderboard
leaderboard: z.array(leaderboardEntrySchema),

View File

@@ -62,6 +62,23 @@ export const submitActualResultsMessage = z.object({
last: z.string(),
})
export const startQuizQuestionMessage = z.object({
type: z.literal("start_quiz_question"),
})
export const buzzMessage = z.object({
type: z.literal("buzz"),
})
export const judgeQuizAnswerMessage = z.object({
type: z.literal("judge_quiz_answer"),
correct: z.boolean(),
})
export const skipQuizQuestionMessage = z.object({
type: z.literal("skip_quiz_question"),
})
export const clientMessage = z.discriminatedUnion("type", [
joinRoomMessage,
reconnectMessage,
@@ -74,6 +91,10 @@ export const clientMessage = z.discriminatedUnion("type", [
submitJuryVoteMessage,
tapBingoSquareMessage,
submitActualResultsMessage,
startQuizQuestionMessage,
buzzMessage,
judgeQuizAnswerMessage,
skipQuizQuestionMessage,
])
export type ClientMessage = z.infer<typeof clientMessage>