1
1
import { Fragment , useEffect , useState } from 'react' ;
2
2
import classes from './Exam.module.css' ;
3
3
import flagExam from '../../images/flag-exam.png' ;
4
- import { useNavigate , useParams } from 'react-router-dom' ;
4
+ import { useNavigate , useParams , useLocation } from 'react-router-dom' ;
5
5
import {
6
6
Modal ,
7
7
Button ,
@@ -28,29 +28,46 @@ const generateAnswer = (answer) => {
28
28
return [ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' ] ;
29
29
} ;
30
30
31
- const getRamdom30 = ( id ) => {
31
+ const getRamdom = ( id , quantity ) => {
32
32
const arrayQuestion = JSON . parse ( localStorage . getItem ( id ) )
33
33
. data . map ( ( item ) => {
34
34
item . answer = item . answer . trim ( ) . toUpperCase ( ) ;
35
35
item . choose = undefined ;
36
36
return item ;
37
37
} )
38
38
. filter ( ( item ) => item . answer . length === 1 ) ;
39
- return arrayQuestion . sort ( ( ) => Math . random ( ) - 0.5 ) . slice ( 0 , 30 ) ;
39
+ return arrayQuestion
40
+ . sort ( ( ) => Math . random ( ) - 0.5 )
41
+ . slice ( 0 , quantity ? quantity : 30 ) ;
40
42
} ;
41
43
42
44
const Exam = ( ) => {
43
45
const { id } = useParams ( ) ;
44
46
const navigate = useNavigate ( ) ;
47
+ const location = useLocation ( ) ;
45
48
46
- const [ listQuestion , setListQuestion ] = useState ( getRamdom30 ( id ) ) ;
49
+ const [ listQuestion , setListQuestion ] = useState (
50
+ getRamdom ( id , location . state . quantity )
51
+ ) ;
47
52
const [ indexQuestion , setIndexQuestion ] = useState ( 0 ) ;
48
53
const [ enableSubmit , setEnableSubmit ] = useState ( false ) ;
49
54
const [ showWarning , setShowWarning ] = useState ( true ) ;
50
55
const [ countDown , setCountDown ] = useState ( 60 ) ;
56
+ const [ time , setTime ] = useState ( 60 * location . state . quantity ) ;
51
57
52
58
const [ showModal , setShowModal ] = useState ( false ) ;
53
59
60
+ useEffect ( ( ) => {
61
+ const a = setTimeout ( ( ) => {
62
+ if ( time > 0 ) {
63
+ setTime ( time - 1 ) ;
64
+ } else {
65
+ setShowModal ( true ) ;
66
+ }
67
+ } , 1000 ) ;
68
+ return ( ) => clearTimeout ( a ) ;
69
+ } , [ time ] ) ;
70
+
54
71
useEffect ( ( ) => {
55
72
const elem = document . documentElement ;
56
73
if ( elem . requestFullscreen ) {
@@ -122,33 +139,44 @@ const Exam = () => {
122
139
} , 250 ) ;
123
140
} ;
124
141
142
+ let munites = Math . floor ( time / 60 ) ;
143
+ if ( munites < 10 ) {
144
+ munites = '0' + munites ;
145
+ }
146
+ let seconds = time % 60 ;
147
+ if ( seconds < 10 ) {
148
+ seconds = '0' + seconds ;
149
+ }
150
+
125
151
return (
126
152
< Fragment >
127
- { showWarning && < div className = { classes . popup } >
128
- < Text p b css = { { color : '#ff5100' } } >
129
- < TiWarning color = "ff5100" />
130
- Cảnh báo:
131
- </ Text >
132
- < Spacer y = { 0.3 } />
133
- < Text p size = { 12 } >
134
- Đây là một trang web được thiết kế để tập trung vào việc học tập và
135
- làm quen với giao diện phần mềm EOS của trường < b > "Đại học FPT"</ b > .
136
- </ Text >
137
- < Spacer y = { 0.3 } />
138
- < Text p size = { 12 } >
139
- Nếu sử dụng trang web sai mục đích, vi phạm quy định của nhà trường, tôi
140
- sẽ không chịu trách nhiệm về bất kỳ hành vi nào của bạn.
141
- </ Text >
142
- < Spacer y = { 0.3 } />
143
- < Text p size = { 12 } >
144
- Nếu bạn không đồng ý với điều khoản trên, vui lòng thoát khỏi trang web
145
- ngay lập tức.
146
- </ Text >
147
- < Spacer y = { 0.6 } />
148
- < Text p i size = { 12 } >
149
- Cảnh báo sẽ tự đóng sau < b > { countDown } giây</ b > .
150
- </ Text >
151
- </ div > }
153
+ { showWarning && (
154
+ < div className = { classes . popup } >
155
+ < Text p b css = { { color : '#ff5100' } } >
156
+ < TiWarning color = "ff5100" />
157
+ Cảnh báo:
158
+ </ Text >
159
+ < Spacer y = { 0.3 } />
160
+ < Text p size = { 12 } >
161
+ Đây là một trang web được thiết kế để tập trung vào việc học tập và
162
+ làm quen với giao diện phần mềm EOS của trường < b > "Đại học FPT"</ b > .
163
+ </ Text >
164
+ < Spacer y = { 0.3 } />
165
+ < Text p size = { 12 } >
166
+ Nếu sử dụng trang web sai mục đích, vi phạm quy định của nhà trường,
167
+ tôi sẽ không chịu trách nhiệm về bất kỳ hành vi nào của bạn.
168
+ </ Text >
169
+ < Spacer y = { 0.3 } />
170
+ < Text p size = { 12 } >
171
+ Nếu bạn không đồng ý với điều khoản trên, vui lòng thoát khỏi trang
172
+ web ngay lập tức.
173
+ </ Text >
174
+ < Spacer y = { 0.6 } />
175
+ < Text p i size = { 12 } >
176
+ Cảnh báo sẽ tự đóng sau < b > { countDown } giây</ b > .
177
+ </ Text >
178
+ </ div >
179
+ ) }
152
180
< Modal
153
181
closeButton
154
182
aria-labelledby = "modal-title"
@@ -287,7 +315,7 @@ const Exam = () => {
287
315
</ div >
288
316
< div className = { classes . headerTimeFlag } >
289
317
< img width = { 160 } src = { flagExam } />
290
- < div > 30:00 </ div >
318
+ < div > { munites } : { seconds } </ div >
291
319
</ div >
292
320
</ div >
293
321
< div className = { classes . tempBody } >
0 commit comments