Login.js 5.97 KB
Newer Older
한규민's avatar
login    
한규민 committed
1
import styles from "./login.module.scss";
한규민's avatar
한규민 committed
2
3
4
5
import { useState } from "react";
import authApi from "../../apis/auth.api.js";
import { Redirect } from "react-router";
import catchErrors from "../../utils/catchErrors";
한규민's avatar
login    
한규민 committed
6

한규민's avatar
한규민 committed
7
const Login = () => {
8
9
    //useState를 이용해서 각 state 생성 및 초기값 저장
    const [state, setState] = useState(true); // 이 줄은 css에 해당하는 state
한규민's avatar
한규민 committed
10
    //state변수 지정 하지만 이 변수는 react에 의해 없어지지 않음, 그리고 그 다음 변수는 state변수를 갱신해주는 함수
한규민's avatar
한규민 committed
11
    const [login, setLogin] = useState({
12
13
14
        id:'',
        password:''
    });
한규민's avatar
한규민 committed
15
16
    const [error, setError] = useState("");
    const [loading, setLoading] = useState(false);
한규민's avatar
한규민 committed
17
    const [success, setSuccess] = useState(false);
18

한규민's avatar
한규민 committed
19
    const [guest, setGuset] = useState({
20
21
22
23
24
25
26
27
28
29
        guestName:'',
        gusetBirthday:'',
        gusetMbnum:'',
        guestPassword:''
    })

    //input태그에 걸려있는 onchange에서 실행할 함수설정
    const handleLoginOnChange = (e) =>{
        // ... 전개 연산자
        // 현재 state에 방금 변화한 값을 다시 저장함
한규민's avatar
한규민 committed
30
        setLogin({ ...login,
31
            [e.target.name]:e.target.value
32
33
34
35
        })
    };

    const handleGuestOnChange = (e) =>{
한규민's avatar
한규민 committed
36
        setGuset({ ...guest,
37
38
39
            [e.target.name]:e.target.value
        })
    }
한규민's avatar
한규민 committed
40

한규민's avatar
한규민 committed
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
    const handleOnSummitUser = async(e) => {
        e.preventDefault();
        try{
            console.log("하하")
            setError("");
            setLoading(true);
            const userData = login;
            await authApi.login(userData);
            alert('로그인이 완료되었습니다.')
            setSuccess(true);
        }catch(error){
            catchErrors(error, setError);
        }finally{
            setLoading(false);
        }
    }

    const handleOnSummitGuest = async(e) => {
        e.preventDefault();
        try{
            setError("");
            setLoading(true);
            const gusetData = guest;
한규민's avatar
한규민 committed
64
            await authApi.login(gusetData);
한규민's avatar
한규민 committed
65
66
67
68
69
70
71
72
73
74
75
76
77
78
            alert('로그인이 완료되었습니다.')
            setSuccess(true);
        }catch(error){
            catchErrors(error, setError);
        }finally{
            setLoading(false);
        }
    }


    if (success) {
        return <Redirect to="/" />;
    }
    
한규민's avatar
한규민 committed
79
    return (
한규민's avatar
한규민 committed
80
        <div className={`d-flex flex-column col-md-5 col-10`}>
한규민's avatar
한규민 committed
81
            {/* nav-tabs */}
한규민's avatar
한규민 committed
82
            {/* {console.log(login)} */}
한규민's avatar
한규민 committed
83
            {console.log(success)}
한규민's avatar
한규민 committed
84
            <ul className="nav nav-fill nav-tabs w-100" id="loginTab" role="tablist">
한규민's avatar
login    
한규민 committed
85
                <li className="nav-item fs-6" role="presentation">
86
                    <button className={`nav-link active px-2 ${styles.fontSize}`} style={{ color: state ? "black" : "#FEDC00", backgroundColor: state ? "#FEDC00" : "black"}} 
한규민's avatar
login    
한규민 committed
87
88
                    id="login-tab" data-bs-toggle="tab" data-bs-target="#login" type="button" role="tab" aria-controls="login" aria-selected="true" 
                    onClick={() => setState(true)}>로그인</button>
한규민's avatar
한규민 committed
89
90
                </li>
                <li className="nav-item" role="presentation">
한규민's avatar
login    
한규민 committed
91
92
                    <button className={`nav-link px-2 ${styles.fontSize}`}
                    id="guest-tab" data-bs-toggle="tab" data-bs-target="#guest" type="button" role="tab" aria-controls="guest" aria-selected="false" 
93
                    onClick={() => setState(false)} style={{ color: state ? "#FEDC00" : "black", backgroundColor: state ? "black" : "#FEDC00" }}>비회원 예매 확인</button>
한규민's avatar
한규민 committed
94
95
                </li>
            </ul>
한규민's avatar
한규민 committed
96

한규민's avatar
한규민 committed
97
            <div className="tab-content w-100" id="myTabContent">
한규민's avatar
한규민 committed
98
99
                {/* 로그인 */}
                <div className="tab-pane fade show active" id="login" role="tabpanel" aria-labelledby="login-tab">
한규민's avatar
한규민 committed
100
101
102
103
                    <form className="d-flex flex-column" onSubmit={handleOnSummitUser}>
                        <input className={styles.input} type="text" name="id" placeholder="ID" onChange={handleLoginOnChange} maxLength="10" required/>
                        <input className={styles.input} type="password" name="password" placeholder="Password" onChange={handleLoginOnChange} maxLength="8" required />
                    <input className={`rounded-2 mt-2 ${styles.butterYellowAndBtn} ${styles.btnHover}`} type="submit" value="Login" disabled={loading} />
한규민's avatar
한규민 committed
104
                        <span><a href="./signup" className={styles.intoSignupPage}>회원이 아니십니까?</a></span>
한규민's avatar
한규민 committed
105
                    </form>
한규민's avatar
한규민 committed
106
107
108
109
                </div>

                {/* 비회원예매 학인 */}
                <div className="tab-pane fade" id="guest" role="tabpanel" aria-labelledby="guest-tab">
한규민's avatar
한규민 committed
110
111
112
113
114
                    <form className="d-flex flex-column" onSubmit={handleOnSummitGuest}>
                        <input className={styles.input} type="text" name="guestName" id="guestName" placeholder="이름" onChange={handleGuestOnChange} maxLength="5" required />
                        <input className={styles.input} type="number" name="gusetBirthday" id="gusetBirthday" placeholder="생년월일" onChange={handleGuestOnChange} maxLength="6" required />
                        <input className={styles.input} type="number" name="gusetMbnum" id="gusetMbnum" placeholder="휴대폰 번호" onChange={handleGuestOnChange} maxLength="11" required />
                        <input className={styles.input} type="password" name="guestPassword" id="password" placeholder="비밀번호" onChange={handleGuestOnChange} maxLength="8" required />
한규민's avatar
한규민 committed
115
116

                        <p className={`text-white ${styles.fontSizeTwo}`}>
한규민's avatar
한규민 committed
117
118
                             비회원 정보  입력  예매 내역 확인/취소  티켓 발권이 어려울  있으니 다시 한번 확인해 주시기 바랍니다.
                        </p>
한규민's avatar
한규민 committed
119
120
                        <input className={`rounded-2 mt-2 ${styles.butterYellowAndBtn} ${styles.btnHover}`} type="submit" value="비회원 예매 확인" disabled={loading}/>
                    </form>
한규민's avatar
한규민 committed
121
                </div>
한규민's avatar
login    
한규민 committed
122
123
124
125
126
127
            </div>
        </div>
    )
}

export default Login