Quiz.js 5.15 KB
Newer Older
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
1
import React, { useState, useEffect } 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
6


Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
7
let localQnA = JSON.parse(localStorage.getItem('QnA'))
Jiwon Yoon's avatar
quiz    
Jiwon Yoon committed
8

Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
9
let Answers = []
baesangjune's avatar
0805    
baesangjune committed
10

baesangjune's avatar
home    
baesangjune committed
11
function Quiz() {
Jiwon Yoon's avatar
ASD    
Jiwon Yoon committed
12
13
14
15
16
17
18
    let Time = 0
    if (JSON.parse(localStorage.getItem("Set")) === null) {
        Time = 30010
    }
    else {
        Time = Number(JSON.parse(localStorage.getItem("Set"))[0].Time)
    } //수정. 추가. 새로 설정한 시간으로 설정
baesangjune's avatar
baesangjune committed
19
    const [question, setQuestion] = useState({
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
20
        ...localQnA[0]
baesangjune's avatar
home    
baesangjune committed
21
    })
Jiwon Yoon's avatar
Jiwon Yoon committed
22
    const [selected, setSelected] = useState("")  //선택한 답을 보여줄 것
baesangjune's avatar
baesangjune committed
23

baesangjune's avatar
baesangjune committed
24
    const [timeout, settimeout] = useState(false)
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
25
26
27
    //for each 사용하기
    let Solutions = []          //빈 배열
    console.log(localQnA)
Jiwon Yoon's avatar
ASD    
Jiwon Yoon committed
28
29
30
31

    localQnA.forEach((element) => {
        Solutions.push(Number(element.A))
    });
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
32
33
34
35
36
37
    useEffect(() => {
        for (let i = 1; i <= Solutions.length; i++) {
            Answers.push(0)
            localStorage.setItem('Answers', JSON.stringify(Answers))
            localStorage.setItem("Solutions", JSON.stringify(Solutions))
        }
baesangjune's avatar
.    
baesangjune committed
38
        // eslint-disable-next-line
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
39
40
41
42
    }, [])



baesangjune's avatar
0805    
baesangjune committed
43
    function handleQuestion() {
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
44
        setQuestion({ ...localQnA[question.N] })
Jiwon Yoon's avatar
a    
Jiwon Yoon committed
45
        setSelected("") //페이지 넘어가면 selected 초기화
Jiwon Yoon's avatar
Jiwon Yoon committed
46
    }
baesangjune's avatar
0805    
baesangjune committed
47

baesangjune's avatar
home    
baesangjune committed
48
49
    let handleChange = (ev) => {
        setSelected(ev.target.value)  //selected값 변경
baesangjune's avatar
.    
baesangjune committed
50
        Answers[question.N - 1] = Number(ev.target.id) + 1
baesangjune's avatar
baesangjune committed
51
        localStorage.setItem('Answers', JSON.stringify(Answers))
Jiwon Yoon's avatar
Jiwon Yoon committed
52
    }
baesangjune's avatar
home    
baesangjune committed
53
    return (
baesangjune's avatar
baesangjune committed
54
        <>
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
55
56
57
58
59
60
61
            <div className="container-fluid">
                <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>
baesangjune's avatar
baesangjune committed
62
                    </div>
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
63
64
                    <div className="col-md-auto">
                        <div className="h2 mt-2">
Jiwon Yoon's avatar
ASD    
Jiwon Yoon committed
65
                            {question.Q}
baesangjune's avatar
baesangjune committed
66
                        </div>
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
67
68
69
70
71
72
73
                        <div className="mt-2">
                            <form>
                                {question.Choose.map((a, index) =>
                                    <div>
                                        <input type="radio" name='answer' id={index} value={a} onChange={handleChange} checked={selected === String(a)} />
                                        <label className="font-weight-bold" htmlFor={a}>{a}</label>
                                    </div>
baesangjune's avatar
baesangjune committed
74
                                )}
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
75
76
77
78
79
80
81
82
83
84
85
86
                            </form>
                            <span className="h5 font-weight-bold"> Your Answer :</span>
                            <span className="h2 font-weight-bold text-danger"> {selected}</span>  {/* 선택한  보여줌 */}
                            <div className="text-center my-3"> {(question.N - 1 === localQnA.length - 1)
                                ? <Link to="/end">
                                    <button className="btn btn-outline-success" /*onClick={localStorage.setItem('Solutions', JSON.stringify(Solutions))}*/>제출</button>
                                </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
ASD    
Jiwon Yoon committed
87
88
                                    initialTime={Time} // 수정. 추가. 새로설정한 시간으로 설정. 하지만 새로고침해야 적용됨
                                    //    initialTime={Number(JSON.parse(localStorage.getItem("Set"))[0].Time)}
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
                                    direction="backward"
                                    checkpoints={[
                                        {
                                            time: 1,
                                            callback: () => alert('시간이 초과되었습니다.'),
                                        },
                                        {
                                            time: 0,
                                            callback: () => settimeout(true),

                                        }
                                    ]}
                                >
                                    {() => (
                                        <>
                                            <Timer.Minutes /> : <Timer.Seconds></Timer.Seconds> / 30 : 00                        </>
                                    )}
                                </Timer>     {/* npm i react-compound-timer */}
                            </p>
                        </div>
                    </div>
                    <div className="col">
baesangjune's avatar
baesangjune committed
111
                    </div>
baesangjune's avatar
baesangjune committed
112
                </div>
Jiwon Yoon's avatar
Jiwon Yoon committed
113
            </div>
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
114
            {timeout ? <Redirect to='/end' /> : ''}
baesangjune's avatar
baesangjune committed
115
        </>
baesangjune's avatar
home    
baesangjune committed
116
117
118
119
    )



Jiwon Yoon's avatar
quiz    
Jiwon Yoon committed
120
121
}

baesangjune's avatar
home    
baesangjune committed
122

baesangjune's avatar
baesangjune committed
123
export default Quiz;