1
- import React , { useState , useEffect , useRef } from 'react' ;
1
+ import React , { useState , useEffect , useRef , useCallback } from 'react' ;
2
2
import { useLocation , useNavigate } from 'react-router-dom' ;
3
3
import {
4
4
Container ,
@@ -56,47 +56,50 @@ function QuizPage() {
56
56
} ) ;
57
57
} , [ quizID , username , navigate ] ) ;
58
58
59
- const handleSubmit = ( timerExceeded = false , submissionAnswers = answers ) => {
60
- if ( hasSubmittedRef . current ) return ;
61
- hasSubmittedRef . current = true ;
59
+ const handleSubmit = useCallback (
60
+ ( timerExceeded = false , submissionAnswers = answers ) => {
61
+ if ( hasSubmittedRef . current ) return ;
62
+ hasSubmittedRef . current = true ;
62
63
63
- setIsSubmitting ( true ) ;
64
- const submissionData = {
65
- Username : username ,
66
- QuizID : quizID ,
67
- Answers : submissionAnswers ,
68
- } ;
69
- if ( email ) {
70
- submissionData . Email = email ;
71
- }
72
- if ( timerExceeded ) {
73
- submissionData . TimerExceeded = true ;
74
- }
64
+ setIsSubmitting ( true ) ;
65
+ const submissionData = {
66
+ Username : username ,
67
+ QuizID : quizID ,
68
+ Answers : submissionAnswers ,
69
+ } ;
70
+ if ( email ) {
71
+ submissionData . Email = email ;
72
+ }
73
+ if ( timerExceeded ) {
74
+ submissionData . TimerExceeded = true ;
75
+ }
75
76
76
- fetch ( `${ process . env . REACT_APP_API_ENDPOINT } /submitquiz` , {
77
- method : 'POST' ,
78
- headers : { 'Content-Type' : 'application/json' } ,
79
- body : JSON . stringify ( submissionData ) ,
80
- } )
81
- . then ( ( res ) => res . json ( ) )
82
- . then ( ( data ) => {
83
- navigate ( '/result' , {
84
- state : { submissionID : data . SubmissionID , quizID } ,
85
- } ) ;
77
+ fetch ( `${ process . env . REACT_APP_API_ENDPOINT } /submitquiz` , {
78
+ method : 'POST' ,
79
+ headers : { 'Content-Type' : 'application/json' } ,
80
+ body : JSON . stringify ( submissionData ) ,
86
81
} )
87
- . catch ( ( err ) => {
88
- console . error ( 'Error submitting quiz:' , err ) ;
89
- alert ( 'Failed to submit quiz. Please try again.' ) ;
90
- setIsSubmitting ( false ) ;
91
- hasSubmittedRef . current = false ;
92
- } ) ;
93
- } ;
82
+ . then ( ( res ) => res . json ( ) )
83
+ . then ( ( data ) => {
84
+ navigate ( '/result' , {
85
+ state : { submissionID : data . SubmissionID , quizID } ,
86
+ } ) ;
87
+ } )
88
+ . catch ( ( err ) => {
89
+ console . error ( 'Error submitting quiz:' , err ) ;
90
+ alert ( 'Failed to submit quiz. Please try again.' ) ;
91
+ setIsSubmitting ( false ) ;
92
+ hasSubmittedRef . current = false ;
93
+ } ) ;
94
+ } ,
95
+ [ answers , email , navigate , quizID , username ]
96
+ ) ;
94
97
95
- const moveToNextQuestion = ( ) => {
98
+ const moveToNextQuestion = useCallback ( ( ) => {
96
99
if ( quizData && currentQuestionIndex < quizData . Questions . length - 1 ) {
97
100
setCurrentQuestionIndex ( ( prevIndex ) => prevIndex + 1 ) ;
98
101
}
99
- } ;
102
+ } , [ quizData , currentQuestionIndex ] ) ;
100
103
101
104
const handleSkip = ( ) => {
102
105
const timeTaken =
@@ -171,7 +174,7 @@ function QuizPage() {
171
174
172
175
return ( ) => clearInterval ( timerRef . current ) ;
173
176
}
174
- } , [ currentQuestionIndex , quizData ] ) ;
177
+ } , [ currentQuestionIndex , quizData , moveToNextQuestion , handleSubmit ] ) ;
175
178
176
179
const handleOptionChange = ( e ) => {
177
180
const selectedOption = e . target . value ;
@@ -194,8 +197,6 @@ function QuizPage() {
194
197
if ( currentQuestionIndex < quizData . Questions . length - 1 ) {
195
198
moveToNextQuestion ( ) ;
196
199
} else {
197
- // Do not auto-submit on the last question
198
- // Start the timer for the last question
199
200
if ( quizData . EnableTimer ) {
200
201
setTimeLeft ( quizData . TimerSeconds ) ;
201
202
questionStartTimeRef . current = Date . now ( ) ;
0 commit comments