Signup.js 9.5 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
14
    })

한규민's avatar
한규민 committed
15
16
17
18
19
20
21
22
23
24
25
26
27
    const [errors, setErrors] = useState({
        errorId: null,
        errorName: false,
        errorBirthday: false,
        errorMbnum: false,
        errorPassword: false,
        errorRePassword: false
    })
    // id중복확인 여부 state
    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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    //id(중복확인 체크, 형식 에러)
    const handleOnClickId = (e) => {
        if (userText.userId.length < 5) {
            e.preventDefault();
            // e.stopPropagati//on();
            setErrors({
                ...errors,
                [e.target.name]: true
            });
            if (overlapId === true) {
                setOverlapId(false);
            };
        } else {
            e.preventDefault();
            e.stopPropagation();
            setErrors({
                ...errors,
                [e.target.name]: false
            });
            setOverlapId(true);
        }
한규민's avatar
signup    
한규민 committed
56
    }
한규민's avatar
한규민 committed
57
58
59
60
61
62

    //중복되었으면 중복확인 창 띄우는 여부를 state에 전달
    // const handleOverlapIdError = (e) => {
    //     e.preventDefault();
    //     setOverlapIdError(() => {if()});
    // }
한규민's avatar
signup    
한규민 committed
63
    //가입완료 누르면 콘솔창에 전달하려는 state 보여줌
한규민's avatar
한규민 committed
64
65

    const handleonSubmit = (e) => {
66
        e.preventDefault();
한규민's avatar
한규민 committed
67
68
69
70
71
72
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
108
109
110
111
112
113
114
115
116
        setPreId(()=> (userText.userId));
        console.log(preId);
        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);
        //별명 유효성 검사
        if (userText.userName.length === 0) {
            setErrors(errors => ({ ...errors, errorName: true }))
        } else{
            setErrors(errors => ({ ...errors, errorName: false }))
        }
        // 생일 유효성 검사
        if (userText.userBirthday.length !== 6) {
            setErrors(errors => ({ ...errors, errorBirthday: true }))
        } else{
            setErrors(errors => ({ ...errors, errorBirthday: false }))
        }
        // 휴대폰 유효성 검사
        if (userText.userMbnum.length !== 11) {
            setErrors(errors => ({ ...errors, errorMbnum: true }))
        } else{
            setErrors(errors => ({ ...errors, errorMbnum: false }))
        }
        // 비밀번호 유효성 검사
        if (userText.userPassword.length !== 8) {
            setErrors(errors => ({ ...errors, errorPassword: true }))
        } else{
            setErrors(errors => ({ ...errors, errorPassword: false }))
        }
        // 비밀번호 확인 유효성 검사
        if (userText.userRePassword.length !== 8) {
            setErrors(errors => ({ ...errors, errorRePassword: true }))
        } else{
            setErrors(errors => ({ ...errors, errorRePassword: false }))
        }

        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
117
    }
118

한규민's avatar
한규민 committed
119
    return (
한규민's avatar
한규민 committed
120
        // 데이터 입력과 유효성 검사 후 보이는 경고창
한규민's avatar
한규민 committed
121
        <form className={`d-flex col-md-6 col-12 justify-content-center`}>
한규민's avatar
한규민 committed
122
            {console.log("userText==", userText, errors, overlapId)}
한규민's avatar
한규민 committed
123
            <div className="d-flex flex-column">
한규민's avatar
signup    
한규민 committed
124
125
126
127
128
                <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
129
130
                            <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
131
                        </div>
한규민's avatar
한규민 committed
132
133
134
135
                    </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>}
136
                </div>
한규민's avatar
한규민 committed
137
138
139
140
141
142
143

                <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>}
144
                </div>
한규민's avatar
한규민 committed
145
146
147
148
149
150
151

                <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>}
152
                </div>
한규민's avatar
한규민 committed
153
154
155
156
157
158
159

                <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>}
160
                </div>
한규민's avatar
한규민 committed
161
162
163
164
165
166
167

                <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>}
168
                </div>
한규민's avatar
한규민 committed
169

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

한규민's avatar
한규민 committed
178
                <buttom className={`rounded my-3 py-2 fs-5 ${styles.butterYellowAndBtn} ${styles.btnHover}`} type="submit" onClick={handleonSubmit}>가입하기</buttom>
한규민's avatar
한규민 committed
179
180
181
182
183
184
185
186
187
188
189
190
            </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">
191
                            <button type="button" className="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
한규민's avatar
한규민 committed
192
193
194
                        </div>
                    </div>
                </div>
195
            </div>
한규민's avatar
한규민 committed
196
        </form>
한규민's avatar
한규민 committed
197
198
199
200
    )
}

export default Signup