diff --git a/web/components/views/AssessmentView.tsx b/web/components/views/AssessmentView.tsx index f5136bc..4197d76 100644 --- a/web/components/views/AssessmentView.tsx +++ b/web/components/views/AssessmentView.tsx @@ -53,6 +53,7 @@ export const AssessmentView: React.FC = ({ const [selectedTemplate, setSelectedTemplate] = useState(null); const [timeCheck, setTimeCheck] = useState<{ totalTimeRemaining: number; questionTimeRemaining: number; isTotalTimeout: boolean; isQuestionTimeout: boolean } | null>(null); const [selectedChoice, setSelectedChoice] = useState(null); + const [autoSubmitted, setAutoSubmitted] = useState(false); const isTimedOut = timeCheck?.isTotalTimeout || timeCheck?.isQuestionTimeout; const messagesEndRef = useRef(null); @@ -106,6 +107,10 @@ export const AssessmentView: React.FC = ({ setTimeCheck(data); if (data.isTotalTimeout || data.isQuestionTimeout) { setError(t('timeLimitExceeded')); + if (!autoSubmitted && !isLoading) { + setAutoSubmitted(true); + await handleSubmitAnswer(true); + } } } catch (err) { console.error('Failed to check time:', err); @@ -233,17 +238,19 @@ export const AssessmentView: React.FC = ({ } }; - const handleSubmitAnswer = async () => { + const handleSubmitAnswer = async (forced = false) => { const currentQuestion = state?.questions?.[state.currentQuestionIndex || 0] as any; const isChoice = currentQuestion?.questionType === 'MULTIPLE_CHOICE' && currentQuestion?.options?.length > 0; - if (isChoice) { - if (!selectedChoice || isLoading || isTimedOut) return; - } else { - if (!inputValue.trim() || isLoading || isTimedOut) return; + if (!forced) { + if (isChoice) { + if (!selectedChoice || isLoading || isTimedOut) return; + } else { + if (!inputValue.trim() || isLoading || isTimedOut) return; + } } - const answer = isChoice ? selectedChoice! : inputValue.trim(); + const answer = isChoice ? (selectedChoice || '') : inputValue.trim(); setInputValue(''); setSelectedChoice(null); setIsLoading(true);