Quiz.js 4.92 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

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

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

baesangjune's avatar
home    
baesangjune committed
10
function Quiz() {
baesangjune's avatar
baesangjune committed
11
    const [question, setQuestion] = useState({
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
12
        ...localQnA[0]
baesangjune's avatar
home    
baesangjune committed
13
    })
Jiwon Yoon's avatar
Jiwon Yoon committed
14
    const [selected, setSelected] = useState("")  //선택한 답을 보여줄 것
baesangjune's avatar
baesangjune committed
15

baesangjune's avatar
baesangjune committed
16
    const [timeout, settimeout] = useState(false)
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    //for each 사용하기
    let Solutions = []          //빈 배열
    console.log(localQnA)
    localQnA.map((x) => {      //A만 꺼내서 q에 추가
        // Answers.push(0)
        return Solutions.push(x.A)
    })
    useEffect(() => {
        for (let i = 1; i <= Solutions.length; i++) {
            Answers.push(0)
            localStorage.setItem('Answers', JSON.stringify(Answers))
            localStorage.setItem("Solutions", JSON.stringify(Solutions))
        }
    }, [])



    //그걸 로컬에 저장
    //foreach 쓰기
    let finalQnA = localQnA.map((x, index) => {
        //delete x.A                       //A 삭제
        return { ...x, N: index + 1 }    //N 추가
    })
baesangjune's avatar
baesangjune committed
40

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

baesangjune's avatar
home    
baesangjune committed
46
47
    let handleChange = (ev) => {
        setSelected(ev.target.value)  //selected값 변경
baesangjune's avatar
.    
baesangjune committed
48
        Answers[question.N - 1] = Number(ev.target.id) + 1
baesangjune's avatar
baesangjune committed
49
        localStorage.setItem('Answers', JSON.stringify(Answers))
Jiwon Yoon's avatar
Jiwon Yoon committed
50
    }
baesangjune's avatar
home    
baesangjune committed
51
    return (
baesangjune's avatar
baesangjune committed
52
        <>
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
53
54
55
56
57
58
59
            <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
60
                    </div>
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
61
62
63
                    <div className="col-md-auto">
                        <div className="h2 mt-2">
                            {localQnA[0].Q}
baesangjune's avatar
baesangjune committed
64
                        </div>
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
65
66
67
68
69
70
71
                        <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
72
                                )}
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
                            </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
                                    initialTime={30010}
                                    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
108
                    </div>
baesangjune's avatar
baesangjune committed
109
                </div>
Jiwon Yoon's avatar
Jiwon Yoon committed
110
            </div>
Jiwon Yoon's avatar
ha..    
Jiwon Yoon committed
111
            {timeout ? <Redirect to='/end' /> : ''}
baesangjune's avatar
baesangjune committed
112
        </>
baesangjune's avatar
home    
baesangjune committed
113
114
115
116
    )



Jiwon Yoon's avatar
quiz    
Jiwon Yoon committed
117
118
}

baesangjune's avatar
home    
baesangjune committed
119

baesangjune's avatar
baesangjune committed
120
export default Quiz;