Signup.js 9.07 KB
Newer Older
한규민's avatar
한규민 committed
1
import styles from "./signup.module.scss";
2
import { useState } from 'react';
한규민's avatar
한규민 committed
3
4

const Signup = () => {
5

한규민's avatar
한규민 committed
6
7
    const [userText, setUserText] = useState({
        userId: '',
8
        userName: '',
한규민's avatar
한규민 committed
9
10
        userBirthday: '',
        userMbnum: '',
11
        userPassword: '',
한규민's avatar
한규민 committed
12
        userRePassword: ''
13
    })
한규민's avatar
한규민 committed
14
    //각 타입별 error 유무 state
한규민's avatar
한규민 committed
15
16
17
18
19
20
21
22
    const [errors, setErrors] = useState({
        errorId: null,
        errorName: false,
        errorBirthday: false,
        errorMbnum: false,
        errorPassword: false,
        errorRePassword: false
    })
한규민's avatar
한규민 committed
23
    // id중복확인 여부 state와 가입하기 누르면 id 임시 저장
한규민's avatar
한규민 committed
24
25
26
27
    const [overlapId, setOverlapId] = useState(false);
    const [preId, setPreId] = useState("");

    //입력할때마다 state에 저장
28
    const handleUserOnChange = (e) => {
한규민's avatar
한규민 committed
29
        setUserText({
30
31
32
            ...userText,
            [e.target.name]: e.target.value
        })
한규민's avatar
한규민 committed
33
    }
34

한규민's avatar
한규민 committed
35
36
37
38
39
    //id(중복확인 체크, 형식 에러)
    const handleOnClickId = (e) => {
        if (userText.userId.length < 5) {
            e.preventDefault();
            // e.stopPropagati//on();
한규민's avatar
한규민 committed
40
            setErrors(errors => ({
한규민's avatar
한규민 committed
41
42
                ...errors,
                [e.target.name]: true
한규민's avatar
한규민 committed
43
            }));
한규민's avatar
한규민 committed
44
45
46
47
48
49
            if (overlapId === true) {
                setOverlapId(false);
            };
        } else {
            e.preventDefault();
            e.stopPropagation();
한규민's avatar
한규민 committed
50
            setErrors(errors => ({
한규민's avatar
한규민 committed
51
52
                ...errors,
                [e.target.name]: false
한규민's avatar
한규민 committed
53
            }));
한규민's avatar
한규민 committed
54
55
            setOverlapId(true);
        }
한규민's avatar
signup    
한규민 committed
56
    }
한규민's avatar
한규민 committed
57

한규민's avatar
한규민 committed
58
59
60
61
62
63
64
65
    //유효성 검사 함수
    const vaildationData = (text, compareValue, error) =>{
        if (text !== compareValue) {
            setErrors(errors => ({ ...errors, [error]: true }))
        } else{
            setErrors(errors => ({ ...errors, [error]: false }))
        }
    }
한규민's avatar
한규민 committed
66

한규민's avatar
한규민 committed
67
    //가입하기와 동시에 유효성 검사
한규민's avatar
한규민 committed
68
    const handleonSubmit = (e) => {
69
        e.preventDefault();
한규민's avatar
한규민 committed
70
71
        setPreId(()=> (userText.userId));
        console.log(preId);
한규민's avatar
한규민 committed
72
        //아이디 유효성 검사
한규민's avatar
한규민 committed
73
74
75
76
77
78
79
80
81
82
83
84
85
        if ((userText.userId.length < 5)) {
            setErrors(errors => ({ ...errors, errorId: true }));
        } else if((userText.userId.length >= 5) && (overlapId === true)){
            if(preId !== userText.userId){
                console.log(preId);
            setOverlapId(()=> (false));
            }
        } 
        else if(userText.userId >= 5){
            setErrors(errors => ({ ...errors, errorId: false }));
        }
        console.log(preId);

한규민's avatar
한규민 committed
86
87
88
89
90
91
92
93
94
95
96
97
        //별명 에러유무 검사
        vaildationData((userText.userName.length === 0), false, "errorName");
        // 생일 에러유무 검사
        vaildationData(userText.userBirthday.length, 6, "errorBirthday");
        // 휴대폰 에러유무 검사
        vaildationData(userText.userMbnum.length, 11, "errorMbnum");
        // 비밀번호 에러유무 검사
        vaildationData(userText.userPassword.length, 8, "errorPassword");
        // 비밀번호 확인 에러유무 검사
        vaildationData(userText.userRePassword, userText.userPassword, "errorRePassword");

        // 최종 유효성 검사
한규민's avatar
한규민 committed
98
99
100
101
102
        if (overlapId && (errors.errorId === false) && (errors.errorName === false) && (errors.errorBirthday === false)
            && (errors.errorMbnum === false) && (errors.errorPassword === false) && (errors.errorRePassword === false)) {
            console.log(userText);
            setTimeout(()=>{console.log("회원가입을 완료했습니다.")},2000)
        }
한규민's avatar
한규민 committed
103
    }
104

한규민's avatar
한규민 committed
105
    return (
한규민's avatar
한규민 committed
106
        // 데이터 입력과 유효성 검사 후 보이는 경고창
한규민's avatar
한규민 committed
107
        <form className={`d-flex col-md-6 col-12 justify-content-center`}>
한규민's avatar
한규민 committed
108
            {console.log("userText==", userText, errors, overlapId)}
한규민's avatar
한규민 committed
109
            <div className="d-flex flex-column">
한규민's avatar
signup    
한규민 committed
110
111
112
113
114
                <span className={styles.title}>회원가입</span>
                <div className="d-flex flex-column">
                    <div className={styles.inputContent}>
                        <label className={styles.signupLabel}>아이디</label>
                        <div className="d-flex col-md-auto">
한규민's avatar
한규민 committed
115
116
                            <input className={styles.input} type="text" name="userId" id="userId" placeholder="5~10자리 사이" onChange={handleUserOnChange} maxLength="10" required />
                            <button type="button" name="errorId" className={`rounded-2 mt-2 ${styles.butterYellowAndBtn} ${styles.btnHover}`} onClick={handleOnClickId} data-bs-toggle="modal" data-bs-target="#exampleModal">중복확인</button>
한규민's avatar
signup    
한규민 committed
117
                        </div>
한규민's avatar
한규민 committed
118
119
120
121
                    </div>
                    {(overlapId === false) && errors.errorId && <p className={styles.passwordConfirmError}>5~10자리 사이로 입력해주세요.</p>}
                    {overlapId && (errors.errorId === false) && <p className={styles.passwordConfirmError}>아이디 중복이 확인되었습니다.</p>}
                    {(errors.errorId === false) && (overlapId === false) && <p className={styles.passwordConfirmError}>아이디 중복확인을 해주세요.</p>}
122
                </div>
한규민's avatar
한규민 committed
123
124
125
126
127
128
129

                <div className="d-flex flex-column">
                    <div className={styles.inputContent}>
                        <label className={styles.signupLabel}>별명</label>
                        <input className={`${styles.input} ${styles.inputSize}`} type="text" name="userName" id="userName" placeholder="10자리 이내" onChange={handleUserOnChange} maxLength="10" required />
                    </div>
                    {errors.errorName && <p className={styles.passwordConfirmError}>10 이내로 입력해주세요.</p>}
130
                </div>
한규민's avatar
한규민 committed
131
132
133
134
135
136
137

                <div className="d-flex flex-column">
                    <div className={styles.inputContent}>
                        <label className={styles.signupLabel}>생년월일</label>
                        <input className={`${styles.input} ${styles.inputSize} ${styles.input.placeholder}`} type="number" name="userBirthday" id="userBirthday" placeholder="6자리(예시: 991225)" onChange={handleUserOnChange} min="0" max="999999" required />
                    </div>
                    {errors.errorBirthday && <p className={styles.passwordConfirmError}>숫자 6자리를 입력해주세요.</p>}
138
                </div>
한규민's avatar
한규민 committed
139
140
141
142
143
144
145

                <div className="d-flex flex-column">
                    <div className={styles.inputContent}>
                        <label className={styles.signupLabel}>휴대폰 번호</label>
                        <input className={`${styles.input} ${styles.inputSize}`} type="number" name="userMbnum" id="userMbnum" placeholder="-없이 11자리 입력" onChange={handleUserOnChange} min="0" max="99999999999" required />
                    </div>
                    {errors.errorMbnum && <p className={styles.passwordConfirmError}>-없이 숫자 11자리를 입력해주세요.</p>}
146
                </div>
한규민's avatar
한규민 committed
147
148
149
150
151
152
153

                <div className="d-flex flex-column">
                    <div className={`${styles.inputContent}`}>
                        <label className={styles.signupLabel}>비밀번호</label>
                        <input className={`${styles.input} ${styles.inputSize}`} type="password" name="userPassword" id="password" placeholder="8자리 입력" onChange={handleUserOnChange} maxLength="8" required />
                    </div>
                    {errors.errorPassword && <p className={styles.passwordConfirmError}>8자리를 입력해주세요.</p>}
154
                </div>
한규민's avatar
한규민 committed
155

156
                <div className="d-flex flex-column">
한규민's avatar
한규민 committed
157
                    <div className={styles.inputContent}>
158
                        <label className={styles.signupLabel}>비밀번호 확인</label>
한규민's avatar
한규민 committed
159
                        <input className={`${styles.input} ${styles.inputSize}`} type="password" name="userRePassword" id="userRePassword" placeholder="8자리 입력" onChange={handleUserOnChange} maxLength="8" required />
한규민's avatar
한규민 committed
160
                    </div>
한규민's avatar
한규민 committed
161
                    {errors.errorRePassword && <p className={styles.passwordConfirmError}>비밀번호가 일치하지 않습니다.</p>}
한규민's avatar
한규민 committed
162
163
                </div>

한규민's avatar
한규민 committed
164
                <buttom className={`rounded my-3 py-2 fs-5 ${styles.butterYellowAndBtn} ${styles.btnHover}`} type="submit" onClick={handleonSubmit}>가입하기</buttom>
한규민's avatar
한규민 committed
165
166
167
168
169
170
171
172
173
174
175
176
            </div>
            {/* 아이디 중복 확인 모달창 */}
            <div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
                <div class="modal-dialog">
                    <div class="modal-content">
                        <div class="modal-header">
                            <h5 class="modal-title" id="exampleModalLabel">아이디 중복 확인</h5>
                        </div>
                        <div class="modal-body">
                             아이디는 사용가능합니다.
                        </div>
                        <div class="modal-footer">
177
                            <button type="button" className="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
한규민's avatar
한규민 committed
178
179
180
                        </div>
                    </div>
                </div>
181
            </div>
한규민's avatar
한규민 committed
182
        </form>
한규민's avatar
한규민 committed
183
184
185
186
    )
}

export default Signup