@@ -17,16 +17,18 @@ import {
17
17
TooltipTrigger ,
18
18
} from '@/components/ui/tooltip' ;
19
19
import HealthBar from '@/components/HealthBar' ;
20
- import useSoundEffects from '@/hooks/useSoundEffects.ts ' ;
20
+ import useSoundEffects from '@/hooks/useSoundEffects' ;
21
21
import ConfettiCelebration from '@/components/ConfettiCelebration' ;
22
- import { levels as levelsData } from '@/lib/levels.ts ' ;
22
+ import { levels as levelsData } from '@/lib/levels' ;
23
23
24
24
interface GameState {
25
25
currentLevel : number ;
26
26
score : number ;
27
27
playerHealth : number ;
28
28
badges : string [ ] ;
29
29
hintUsed : boolean ;
30
+ answerSelected : boolean ;
31
+ isCorrect : boolean ;
30
32
}
31
33
32
34
const OpenEHRQuest : React . FC = ( ) => {
@@ -36,6 +38,8 @@ const OpenEHRQuest: React.FC = () => {
36
38
playerHealth : 100 ,
37
39
badges : [ ] ,
38
40
hintUsed : false ,
41
+ answerSelected : false ,
42
+ isCorrect : false ,
39
43
} ) ;
40
44
const [ soundEnabled , setSoundEnabled ] = useState ( true ) ;
41
45
const { playCorrectSound, playWrongSound, playCompletionSound } =
@@ -60,28 +64,41 @@ const OpenEHRQuest: React.FC = () => {
60
64
61
65
const handleAnswer = ( selectedIndex : number ) => {
62
66
const currentLevel = levels [ gameState . currentLevel ] ;
63
- if ( selectedIndex === currentLevel . correctAnswer ) {
67
+ const isCorrect = selectedIndex === currentLevel . correctAnswer ;
68
+
69
+ if ( isCorrect ) {
64
70
if ( soundEnabled ) playCorrectSound ( ) ;
65
71
setGameState ( ( prevState ) => ( {
66
72
...prevState ,
67
73
score : prevState . score + ( prevState . hintUsed ? 50 : 100 ) ,
68
- currentLevel : prevState . currentLevel + 1 ,
69
- hintUsed : false ,
70
- badges : [
71
- ...prevState . badges ,
72
- `Level ${ prevState . currentLevel + 1 } Master` ,
73
- ] ,
74
+ answerSelected : true ,
75
+ isCorrect : true ,
74
76
} ) ) ;
75
77
} else {
76
78
if ( soundEnabled ) playWrongSound ( ) ;
77
79
setGameState ( ( prevState ) => ( {
78
80
...prevState ,
79
81
playerHealth : Math . max ( 0 , prevState . playerHealth - 20 ) ,
80
- hintUsed : false ,
82
+ answerSelected : true ,
83
+ isCorrect : false ,
81
84
} ) ) ;
82
85
}
83
86
} ;
84
87
88
+ const nextLevel = ( ) => {
89
+ setGameState ( ( prevState ) => ( {
90
+ ...prevState ,
91
+ currentLevel : prevState . currentLevel + 1 ,
92
+ hintUsed : false ,
93
+ answerSelected : false ,
94
+ isCorrect : false ,
95
+ badges : [
96
+ ...prevState . badges ,
97
+ `Level ${ prevState . currentLevel + 1 } Master` ,
98
+ ] ,
99
+ } ) ) ;
100
+ } ;
101
+
85
102
const useHint = ( ) => {
86
103
setGameState ( ( prevState ) => ( { ...prevState , hintUsed : true } ) ) ;
87
104
} ;
@@ -93,6 +110,8 @@ const OpenEHRQuest: React.FC = () => {
93
110
playerHealth : 100 ,
94
111
badges : [ ] ,
95
112
hintUsed : false ,
113
+ answerSelected : false ,
114
+ isCorrect : false ,
96
115
} ) ;
97
116
} ;
98
117
@@ -155,6 +174,7 @@ const OpenEHRQuest: React.FC = () => {
155
174
</ div >
156
175
) ;
157
176
}
177
+
158
178
const currentLevel = levels [ gameState . currentLevel ] ;
159
179
160
180
return (
@@ -196,17 +216,38 @@ const OpenEHRQuest: React.FC = () => {
196
216
onClick = { ( ) => handleAnswer ( index ) }
197
217
className = "w-full justify-start text-left whitespace-normal h-auto"
198
218
variant = "outline"
219
+ disabled = { gameState . answerSelected }
199
220
>
200
221
{ option }
201
222
</ Button >
202
223
) ) }
203
224
</ div >
225
+ { gameState . answerSelected && (
226
+ < Alert
227
+ className = { `mt-4 ${
228
+ gameState . isCorrect ? 'bg-green-100' : 'bg-red-100'
229
+ } `}
230
+ >
231
+ < AlertTitle >
232
+ { gameState . isCorrect ? 'Correct!' : 'Incorrect' }
233
+ </ AlertTitle >
234
+ < AlertDescription > { currentLevel . explanation } </ AlertDescription >
235
+ </ Alert >
236
+ ) }
237
+ { gameState . answerSelected && (
238
+ < Button onClick = { nextLevel } className = "w-full mt-4" >
239
+ Next Level
240
+ </ Button >
241
+ ) }
204
242
< div className = "mt-4 space-y-4" >
205
243
< div className = "flex justify-between items-center" >
206
244
< TooltipProvider >
207
245
< Tooltip >
208
246
< TooltipTrigger asChild >
209
- < Button onClick = { useHint } disabled = { gameState . hintUsed } >
247
+ < Button
248
+ onClick = { useHint }
249
+ disabled = { gameState . hintUsed || gameState . answerSelected }
250
+ >
210
251
< Zap className = "mr-2 h-4 w-4" /> Use Hint
211
252
</ Button >
212
253
</ TooltipTrigger >
@@ -227,7 +268,7 @@ const OpenEHRQuest: React.FC = () => {
227
268
) ) }
228
269
</ div >
229
270
</ div >
230
- { gameState . hintUsed && (
271
+ { gameState . hintUsed && ! gameState . answerSelected && (
231
272
< Alert >
232
273
< AlertTitle > Hint</ AlertTitle >
233
274
< AlertDescription > { currentLevel . hint } </ AlertDescription >
0 commit comments