|
5 | 5 | import Card from './Card.svelte'; |
6 | 6 | import { decode } from 'html-entities'; |
7 | 7 | import ProgressBar from './ProgressBar.svelte'; |
| 8 | + import Scoreboard from './Scoreboard.svelte'; |
| 9 | + import { getSortedScoreboard, getTotalScore } from '$lib/util.svelte'; |
8 | 10 |
|
9 | | - let answerStats: { answer: string; numPicks: number }[] = $state([]); |
| 11 | + let answerStats: { answer: string; numPicks: number; correctAnswer: boolean }[] = $state([]); |
10 | 12 | let totalAnswers: number = $derived.by(() => { |
11 | 13 | let res = 0; |
12 | 14 | answerStats.forEach((el) => (res += el.numPicks)); |
|
15 | 17 |
|
16 | 18 | $effect(() => { |
17 | 19 | if (gameData.lastAnswerStats) { |
18 | | - let stats: { answer: string; numPicks: number }[] = []; |
| 20 | + let stats: { answer: string; numPicks: number; correctAnswer: boolean }[] = []; |
19 | 21 |
|
20 | 22 | for (const answer of Object.keys(gameData.lastAnswerStats)) { |
21 | | - stats.push({ answer, numPicks: gameData.lastAnswerStats[answer] }); |
| 23 | + stats.push({ |
| 24 | + answer, |
| 25 | + numPicks: gameData.lastAnswerStats[answer], |
| 26 | + correctAnswer: answer === gameData.state.lastCorrectAnswer, |
| 27 | + }); |
22 | 28 | } |
23 | 29 |
|
24 | | - stats = stats.sort((a, b) => b.numPicks - a.numPicks); |
| 30 | + stats = stats.sort((a, b) => { |
| 31 | + if (a.correctAnswer) return -1; |
| 32 | +
|
| 33 | + return b.numPicks - a.numPicks; |
| 34 | + }); |
25 | 35 |
|
26 | 36 | answerStats = stats; |
27 | 37 | } |
28 | 38 | }); |
29 | 39 | </script> |
30 | 40 |
|
31 | | -<h1 class="flex min-h-12 items-center pr-16 text-3xl font-bold text-balance"> |
| 41 | +<h1 class="min-h-12 items-center pr-16 text-3xl font-bold text-balance"> |
| 42 | + <span class="text-xl text-text-muted" |
| 43 | + >Round {gameData.state.currentRound + 1}/{gameData.state.numRounds}: |
| 44 | + </span><br /> |
32 | 45 | {decode(gameData.questionData?.question)} |
33 | 46 | </h1> |
34 | 47 |
|
|
67 | 80 | </div> |
68 | 81 | </Card> |
69 | 82 |
|
70 | | - <Card elevation="medium" class={['flex flex-1 items-center justify-center p-8 md:p-16']}> |
| 83 | + <Card |
| 84 | + elevation="medium" |
| 85 | + class={['flex flex-1 flex-col items-center justify-center gap-4 p-8 md:p-16']}> |
71 | 86 | <div |
72 | 87 | class={[ |
73 | 88 | 'text-6xl font-bold', |
74 | 89 | (gameData.roundResult?.score ?? 0) > 0 ? 'text-surface-success' : 'text-surface-error', |
75 | 90 | ]}> |
76 | 91 | {(gameData.roundResult?.score ?? 0) >= 0 && '+'}{gameData.roundResult?.score ?? 0} |
77 | 92 | </div> |
| 93 | + <div class="text-text-muted"> |
| 94 | + Total: {getTotalScore()} |
| 95 | + </div> |
78 | 96 | </Card> |
79 | 97 | </div> |
80 | 98 |
|
81 | | -<Card elevation="low" class="mb-4"> |
| 99 | +<Card elevation="low" class="mb-2"> |
82 | 100 | <span class="text-2xl font-bold"> Stats: </span> |
83 | 101 | {#each answerStats as answer} |
84 | 102 | <div class="mb-4 last:mb-0"> |
85 | 103 | <span class="mb-1 flex w-full justify-between gap-4 text-text-muted"> |
86 | | - <span>{decode(answer.answer)}</span> |
| 104 | + <span class={[answer.correctAnswer ? 'text-surface-success' : 'text-surface-error']} |
| 105 | + >{decode(answer.answer)}</span> |
87 | 106 | <span>{totalAnswers ? ((answer.numPicks / totalAnswers) * 100).toFixed(2) : 0}%</span> |
88 | 107 | </span> |
89 | | - <ProgressBar color="info" value={totalAnswers ? (answer.numPicks / totalAnswers) * 100 : 0} /> |
| 108 | + <ProgressBar |
| 109 | + color={answer.correctAnswer ? 'success' : 'error'} |
| 110 | + value={totalAnswers ? (answer.numPicks / totalAnswers) * 100 : 0} /> |
90 | 111 | </div> |
91 | 112 | {/each} |
92 | 113 | </Card> |
93 | 114 |
|
| 115 | +<Scoreboard scoreData={getSortedScoreboard()} showGauges={false} class="mb-4" /> |
| 116 | + |
94 | 117 | {#if gameData.isAdmin} |
95 | 118 | <div class="flex w-full gap-2"> |
96 | 119 | <Button label="Back to Lobby" class="ml-auto" variant="secondary" onclick={backToLobby} /> |
|
0 commit comments