Fix mobile correct answer not recognized — race condition in startQuiz
Root cause: setQuizMode(mode) was called BEFORE the network fetch completed. React immediately re-rendered showing the quiz, but quiz.questions still had the initial load data (without correct_answer for study mode). On fast desktop networks the fetch completed before the user could tap; on slower mobile networks the user tapped an option while correct_answer was still null, making every answer appear incorrect. Fix: setQuizMode(mode) moved to AFTER setQuiz(quizRes.data) and setAttemptId(). The ModeSelectScreen stays visible while data loads, then switches to the quiz view only when all data (including correct_answer) is ready. Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
1343eb5801
commit
9def89aac3
1 changed files with 4 additions and 2 deletions
|
|
@ -207,19 +207,21 @@ export default function QuizPage() {
|
||||||
if (hasStarted.current) return
|
if (hasStarted.current) return
|
||||||
hasStarted.current = true
|
hasStarted.current = true
|
||||||
setSelectedVoice(voice)
|
setSelectedVoice(voice)
|
||||||
setQuizMode(mode)
|
// DON'T set quizMode yet — wait for data to load first
|
||||||
|
// (prevents mobile race condition where quiz renders without correct_answer)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const quizRes = await api.get(`/quizzes/${id}${mode === 'study' ? '?study=true' : ''}`)
|
const quizRes = await api.get(`/quizzes/${id}${mode === 'study' ? '?study=true' : ''}`)
|
||||||
setQuiz(quizRes.data)
|
setQuiz(quizRes.data)
|
||||||
const attemptRes = await api.post(`/attempts/start?quiz_id=${id}`)
|
const attemptRes = await api.post(`/attempts/start?quiz_id=${id}`)
|
||||||
setAttemptId(attemptRes.data.id)
|
setAttemptId(attemptRes.data.id)
|
||||||
// Timer: use custom input → quiz default → no timer
|
|
||||||
const mins = timerMinutes || quizRes.data.time_limit_minutes
|
const mins = timerMinutes || quizRes.data.time_limit_minutes
|
||||||
if (mode === 'exam' && mins) {
|
if (mode === 'exam' && mins) {
|
||||||
const secs = mins * 60
|
const secs = mins * 60
|
||||||
setTimeLeft(secs); setTotalTime(secs)
|
setTimeLeft(secs); setTotalTime(secs)
|
||||||
}
|
}
|
||||||
|
// NOW set mode — quiz data is fully loaded, safe to render
|
||||||
|
setQuizMode(mode)
|
||||||
} catch { navigate('/') }
|
} catch { navigate('/') }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue