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:
@@ -87,6 +87,22 @@ export const bingoCardSchema = z.object({
|
|||||||
|
|
||||||
export type BingoCard = z.infer<typeof bingoCardSchema>
|
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 ────────────────────────────────────────────────────────
|
// ─── Scoring ────────────────────────────────────────────────────────
|
||||||
|
|
||||||
export const leaderboardEntrySchema = z.object({
|
export const leaderboardEntrySchema = z.object({
|
||||||
@@ -95,6 +111,7 @@ export const leaderboardEntrySchema = z.object({
|
|||||||
juryPoints: z.number(),
|
juryPoints: z.number(),
|
||||||
bingoPoints: z.number(),
|
bingoPoints: z.number(),
|
||||||
predictionPoints: z.number(),
|
predictionPoints: z.number(),
|
||||||
|
quizPoints: z.number(),
|
||||||
totalPoints: z.number(),
|
totalPoints: z.number(),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -117,6 +134,9 @@ export const gameStateSchema = z.object({
|
|||||||
playerId: z.string(),
|
playerId: z.string(),
|
||||||
displayName: z.string(),
|
displayName: z.string(),
|
||||||
})),
|
})),
|
||||||
|
// Quiz
|
||||||
|
currentQuizQuestion: quizQuestionSchema.nullable(),
|
||||||
|
myQuizBuzzStatus: z.enum(["can_buzz", "already_buzzed", "excluded", "waiting"]).nullable(),
|
||||||
actualResults: actualResultsSchema.nullable(),
|
actualResults: actualResultsSchema.nullable(),
|
||||||
// Leaderboard
|
// Leaderboard
|
||||||
leaderboard: z.array(leaderboardEntrySchema),
|
leaderboard: z.array(leaderboardEntrySchema),
|
||||||
|
|||||||
@@ -62,6 +62,23 @@ export const submitActualResultsMessage = z.object({
|
|||||||
last: z.string(),
|
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", [
|
export const clientMessage = z.discriminatedUnion("type", [
|
||||||
joinRoomMessage,
|
joinRoomMessage,
|
||||||
reconnectMessage,
|
reconnectMessage,
|
||||||
@@ -74,6 +91,10 @@ export const clientMessage = z.discriminatedUnion("type", [
|
|||||||
submitJuryVoteMessage,
|
submitJuryVoteMessage,
|
||||||
tapBingoSquareMessage,
|
tapBingoSquareMessage,
|
||||||
submitActualResultsMessage,
|
submitActualResultsMessage,
|
||||||
|
startQuizQuestionMessage,
|
||||||
|
buzzMessage,
|
||||||
|
judgeQuizAnswerMessage,
|
||||||
|
skipQuizQuestionMessage,
|
||||||
])
|
])
|
||||||
|
|
||||||
export type ClientMessage = z.infer<typeof clientMessage>
|
export type ClientMessage = z.infer<typeof clientMessage>
|
||||||
|
|||||||
Reference in New Issue
Block a user