import { Badge, Button, Group, Paper, Radio, Stack, Text, Textarea } from '@mantine/core'; import { IconAlertCircle, IconCheck, IconRefresh } from '@tabler/icons-react'; import type { Bilingual } from '@ema-platform/api'; import type { CandidateQuestion, SaveState } from '../types/exam-attempt'; function SaveIndicator({ state, onRetry }: { state: SaveState; onRetry: () => void }) { if (state === 'saving') { return Saving…; } if (state === 'saved') { return ( Saved ); } if (state === 'error') { return ( Not saved ); } return null; } /** * Renders one question — never the answer key, because the API response * this reads from (`CandidateQuestion`/`CandidateOption`) has no such field * to render even by mistake. */ export function ExamQuestionDisplay({ question, index, total, localized, selectedOptionId, answerText, saveState, disabled, onSelectOption, onChangeText, onRetry, }: { question: CandidateQuestion; index: number; total: number; localized: (value: Bilingual | undefined) => string; selectedOptionId: string | null | undefined; answerText: string | null | undefined; saveState: SaveState; disabled: boolean; onSelectOption: (optionId: string) => void; onChangeText: (text: string) => void; onRetry: () => void; }) { return ( Question {index + 1} of {total} · {question.points} pts {localized(question.title)} {question.form === 'CHOICE' ? ( {question.options .slice() .sort((a, b) => a.order - b.order) .map((option) => ( {localized(option.text)} ))} ) : (