diff --git a/frontend/src/components/ExamRunner.tsx b/frontend/src/components/ExamRunner.tsx index 63ca342..334bc3a 100644 --- a/frontend/src/components/ExamRunner.tsx +++ b/frontend/src/components/ExamRunner.tsx @@ -59,12 +59,12 @@ export default function ExamRunner({ exam, state, setState, onSubmit, onExit }: if (e.key === 'f') toggleFlag() if (/^[1-9]$/.test(e.key) && q.type === 'multiple-choice' && q.choices) { const ci = parseInt(e.key, 10) - 1 - if (q.choices[ci]) setAnswer(q.choices[ci].id) + if (q.choices[ci]) setState((s) => ({ ...s, answers: { ...s.answers, [q.id]: q.choices[ci].id } })) } } window.addEventListener('keydown', handler) return () => window.removeEventListener('keydown', handler) - }, [currentIdx, q, goTo, toggleFlag]) // eslint-disable-line react-hooks/exhaustive-deps + }, [currentIdx, q, goTo, toggleFlag, setState]) const graded = feedbackMode === 'immediate' && revealed const answered = answers[q.id] != null && (!Array.isArray(answers[q.id]) || (answers[q.id] as unknown[]).length > 0) @@ -75,6 +75,7 @@ export default function ExamRunner({ exam, state, setState, onSubmit, onExit }: const r = gradeQuestion(qq, answers[qq.id]) if (r.status === 'correct') return 'correct' if (r.status === 'wrong') return 'wrong' + // fall through to answered/flagged for ungraded/unanswered revealed states (e.g. essay) } if (flags[qq.id]) return 'flagged' const a = answers[qq.id] diff --git a/frontend/src/types.ts b/frontend/src/types.ts index 8c2350d..1583c76 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -84,7 +84,7 @@ export interface ExamState { currentIdx: number answers: Record flags: Record - revealed: Record + revealed?: Record startedAt: number completedAt?: number feedbackMode: FeedbackMode