Quiz.js 4.21 KB
Newer Older
baesangjune's avatar
home    
baesangjune committed
1
import React, { useState } from 'react'
baesangjune's avatar
baesangjune committed
2
import { Link, Redirect } from 'react-router-dom';
baesangjune's avatar
baesangjune committed
3
import Timer from 'react-compound-timer'; // 타이머쓰기위해 import
Jiwon Yoon's avatar
Jiwon Yoon committed
4
import logo from './img/img_question.png'
Jiwon Yoon's avatar
quiz    
Jiwon Yoon committed
5

baesangjune's avatar
home    
baesangjune committed
6
const QnA = [
baesangjune's avatar
.    
baesangjune committed
7
8
9
    { Q: "6 X 4 = ?", Choose: [6, 12, 18, 24], N: 1 },
    { Q: "3 + 3 = ?", Choose: [2, 4, 6, 8], N: 2 },
    { Q: "3 - 1 = ?", Choose: [1, 2, 3, 4], N: 3 }
Jiwon Yoon's avatar
quiz    
Jiwon Yoon committed
10
11
]

baesangjune's avatar
baesangjune committed
12
13
let Answers = [0,0,0]
localStorage.setItem('Answers', JSON.stringify(Answers))
baesangjune's avatar
baesangjune committed
14
let Solutions = [4, 3, 2]
Jiwon Yoon's avatar
a    
Jiwon Yoon committed
15
localStorage.setItem('Solutions', JSON.stringify(Solutions))
baesangjune's avatar
0805    
baesangjune committed
16

baesangjune's avatar
home    
baesangjune committed
17
function Quiz() {
baesangjune's avatar
baesangjune committed
18
    const [question, setQuestion] = useState({
baesangjune's avatar
d    
baesangjune committed
19
        ...QnA[0]
baesangjune's avatar
home    
baesangjune committed
20
    })
Jiwon Yoon's avatar
Jiwon Yoon committed
21
    const [selected, setSelected] = useState("")  //선택한 답을 보여줄 것
baesangjune's avatar
baesangjune committed
22

baesangjune's avatar
baesangjune committed
23
24
    const [timeout, settimeout] = useState(false)

baesangjune's avatar
0805    
baesangjune committed
25
    function handleQuestion() {
baesangjune's avatar
d    
baesangjune committed
26
        setQuestion({ ...QnA[question.N]})
Jiwon Yoon's avatar
a    
Jiwon Yoon committed
27
        setSelected("") //페이지 넘어가면 selected 초기화
Jiwon Yoon's avatar
Jiwon Yoon committed
28
    }
baesangjune's avatar
0805    
baesangjune committed
29

baesangjune's avatar
home    
baesangjune committed
30
31
    let handleChange = (ev) => {
        setSelected(ev.target.value)  //selected값 변경
baesangjune's avatar
.    
baesangjune committed
32
        Answers[question.N - 1] = Number(ev.target.id) + 1
baesangjune's avatar
baesangjune committed
33
        localStorage.setItem('Answers', JSON.stringify(Answers))
Jiwon Yoon's avatar
Jiwon Yoon committed
34
    }
baesangjune's avatar
home    
baesangjune committed
35
    return (
baesangjune's avatar
baesangjune committed
36
        <>
baesangjune's avatar
baesangjune committed
37
         <div className="container-fluid">
baesangjune's avatar
baesangjune committed
38
39
40
41
42
43
44
45
46
47
48
49
50
51
            <div className="text-center h2 font-weight-bold bg-warning py-2">미적분학 퀴즈</div>
            <div className="row justify-content-md-center" >
                <div className="col text-right">
                    <h1>
                        <img src={logo} width='50' height='50' alt='question' />
                    </h1>
                </div>
                <div className="col-md-auto">
                    <div className="h2 mt-2">
                        {question.Q}
                    </div>
                    <div className="mt-2">
                        <form>
                            {question.Choose.map((a, index) =>
Jiwon Yoon's avatar
addQuiz    
Jiwon Yoon committed
52
                                <div>
Jiwon Yoon's avatar
Jiwon Yoon committed
53
                                    <input type="radio" name='answer' id={index} value={a} onChange={handleChange} checked={selected === String(a)} />
baesangjune's avatar
baesangjune committed
54
55
                                    <label className="font-weight-bold" htmlFor={a}>{a}</label>
                                </div>
baesangjune's avatar
baesangjune committed
56
                            )}                          
baesangjune's avatar
baesangjune committed
57
58
59
                        </form>
                        <span className="h5 font-weight-bold"> Your Answer :</span>
                        <span className="h2 font-weight-bold text-danger"> {selected}</span>  {/* 선택한  보여줌 */}
baesangjune's avatar
d    
baesangjune committed
60
                        <div className="text-center my-3"> {(question.N-1 === QnA.length - 1)
baesangjune's avatar
baesangjune committed
61
                            ? <Link to="/end">
Jiwon Yoon's avatar
wlsWk    
Jiwon Yoon committed
62
                                <button className="btn btn-outline-success" onClick={localStorage.setItem('Solutions', JSON.stringify(Solutions))}>제출</button>
baesangjune's avatar
baesangjune committed
63
64
65
66
67
68
                            </Link>
                            : <button type="button" className="btn btn-outline-dark" onClick={handleQuestion}>다음</button>
                        }
                        </div>
                        <p className="h3 text-center text-danger ">
                            <Timer
Jiwon Yoon's avatar
a    
Jiwon Yoon committed
69
                                initialTime={30010}
baesangjune's avatar
baesangjune committed
70
71
                                direction="backward"
                                checkpoints={[
baesangjune's avatar
baesangjune committed
72
73
74
                                    {time:1,
                                        callback:()=>alert('시간이 초과되었습니다.'),
                                    },
baesangjune's avatar
baesangjune committed
75
76
                                    {
                                        time: 0,
baesangjune's avatar
baesangjune committed
77
78
                                        callback: () => settimeout(true),

baesangjune's avatar
baesangjune committed
79
80
81
82
83
                                    }
                                ]}
                            >
                                {() => (
                                    <>
Jiwon Yoon's avatar
a    
Jiwon Yoon committed
84
                                        <Timer.Minutes /> : <Timer.Seconds></Timer.Seconds> / 30 : 00                        </>
baesangjune's avatar
baesangjune committed
85
86
87
88
89
90
                                )}
                            </Timer>     {/* npm i react-compound-timer */}
                        </p>
                    </div>
                </div>
                <div className="col">
baesangjune's avatar
baesangjune committed
91
                </div>
Jiwon Yoon's avatar
Jiwon Yoon committed
92
            </div>
baesangjune's avatar
baesangjune committed
93
        </div>
baesangjune's avatar
baesangjune committed
94
95
        {timeout ? <Redirect to='/end'/> : '' }
        </>
baesangjune's avatar
home    
baesangjune committed
96
97
98
99
    )



Jiwon Yoon's avatar
quiz    
Jiwon Yoon committed
100
101
}

baesangjune's avatar
home    
baesangjune committed
102

baesangjune's avatar
baesangjune committed
103
export default Quiz;