SignUpPage.js 6.53 KB
Newer Older
우지원's avatar
우지원 committed
1
import React, { useState, useEffect } from 'react';
우지원's avatar
01_06    
우지원 committed
2
import axios from 'axios'
우지원's avatar
우지원 committed
3
import { Button, Form, Container, Navbar, Alert } from 'react-bootstrap';
우지원's avatar
01_06    
우지원 committed
4
import catchErrors from '../utils/catchErrors';
우지원's avatar
우지원 committed
5
import { Redirect } from 'react-router-dom';
우지원's avatar
우지원 committed
6
import Menu from '../Components/Menu';
우지원's avatar
우지원 committed
7
8
9
10
11
12
13

const INIT_USER = {
    username: '',
    nickname: '',
    email: '',
    password: '',
}
우지원's avatar
ul    
우지원 committed
14
15
16

function SingUp() {
    const [validated, setValidated] = useState(false);
우지원's avatar
우지원 committed
17
18
19
    const [user, setUser] = useState(INIT_USER)
    const [error, setError] = useState('')
    const [disabled, setDisabled] = useState(true)
우지원's avatar
우지원 committed
20
    const [success, setSucces] = useState(false)
우지원's avatar
우지원 committed
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

    useEffect(() => {
        const isUser = Object.values(user).every(el => Boolean(el))
        //Boolean : 참거짓 판별
        //every : every뒤에 함수값이 return하는 값이 모두 참일때만 true출력 -> element가 하나도 빈 문자열이 존재하지 않을때
        //empty string때만 false로 나옴.
        isUser ? setDisabled(false) : setDisabled(true)
    }, [user])

    function handleChange(event) {
        const { name, value } = event.target
        // console.log(name, value)
        setUser({ ...user, [name]: value })
    }

    async function handleSubmit(event) {
        event.preventDefault();
우지원's avatar
ul    
우지원 committed
38

우지원's avatar
01_06    
우지원 committed
39
        //빈문자열 입력 시 오류 문자 출력
우지원's avatar
ul    
우지원 committed
40
41
42
43
        const form = event.currentTarget;
        if (form.checkValidity() === false) {
            event.preventDefault();
            event.stopPropagation();
우지원's avatar
우지원 committed
44
            //event.stopPropagation() : 이벤트 캡쳐링과 버블링에 있어 현재 이벤트 이후의 전파를 막습니다.
우지원's avatar
ul    
우지원 committed
45
46
        }
        setValidated(true);
47
        // console.log(user)
우지원's avatar
우지원 committed
48
49
50

        try {
            setError('')
우지원's avatar
01_06    
우지원 committed
51
52
53
54
55
56
57
58
59
60
61
62
63
64
            // const response = await fetch('/api/users/signup', {
            //     //post, get같은게 주어지지 않으면 기본적으로 fetch에 get요청함
            //     method: 'POST',
            //     headers: {
            //         'Content-Type': 'application/json'
            //     },
            //     body: JSON.stringify(user)
            // })
            // const data = await response.json()

            await axios.post('/users/signup', user)
            // 알아서 stringify하기 때문에 따로 해줄 필요 없음.
            // console.log(response.data)
            console.log(user)
65
            // ?????????hash 처리된 password가 저장되지 않았음
우지원's avatar
01_06    
우지원 committed
66

우지원's avatar
우지원 committed
67
            // setUser(INIT_USER)
우지원's avatar
우지원 committed
68
            setSucces(true)
우지원's avatar
우지원 committed
69
        } catch (error) {
우지원's avatar
01_06    
우지원 committed
70
            catchErrors(error, setError)
우지원's avatar
a    
우지원 committed
71
72
73
        }
    }

우지원's avatar
우지원 committed
74
75
    if (success) {
        console.log('success', success)
우지원's avatar
우지원 committed
76
        alert('회원가입이 완료되었습니다!')
우지원's avatar
우지원 committed
77
78
        return <Redirect to='/login' />
    }
우지원's avatar
01_06    
우지원 committed
79
80


우지원's avatar
ul    
우지원 committed
81
    return (
82
        <>
우지원's avatar
우지원 committed
83
            <Menu />
우지원's avatar
01_06    
우지원 committed
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

            <Form noValidate validated={validated} onSubmit={handleSubmit} className='vh-100 flex-column align-items-center justify-content-center mt-2'>
                <Container className="d-flex justify-content-center">
                    <div className="mt-5 p-5 shadow w-75">

                        <h2 className="text-center ">회원가입</h2>

                        <Form.Group controlId="formGroupUsername">
                            <Form.Label>이름</Form.Label>
                            <Form.Control
                                required
                                type="text"
                                name="username"
                                onChange={handleChange}
                                value={user.username}
                                placeholder="이름을 입력해주세요" />
                            <Form.Control.Feedback type="invalid">
                                필수 정보입니다! 이름을 입력해주세요!
우지원's avatar
ul    
우지원 committed
102
                            </Form.Control.Feedback>
우지원's avatar
01_06    
우지원 committed
103
104
105
106
107
108
109
110
111
112
113
114
115
                        </Form.Group>

                        <Form.Group controlId="formGroupNickname">
                            <Form.Label>별명</Form.Label>
                            <Form.Control
                                required
                                type="text"
                                name="nickname"
                                onChange={handleChange}
                                value={user.nickname}
                                placeholder="별명을 입력해주세요" />
                            <Form.Control.Feedback type="invalid">
                                필수 정보입니다! 별명을 입력해주세요!
우지원's avatar
ul    
우지원 committed
116
                            </Form.Control.Feedback>
우지원's avatar
01_06    
우지원 committed
117
118
119
120
121
122
123
124
125
126
127
128
129
                        </Form.Group>

                        <Form.Group controlId="formGroupEmail">
                            <Form.Label>이메일</Form.Label>
                            <Form.Control
                                required
                                type="email"
                                name="email"
                                onChange={handleChange}
                                value={user.email}
                                placeholder="이메일을 입력해주세요" />
                            <Form.Control.Feedback type="invalid">
                                필수 정보입니다! 이메일을 입력해주세요!
우지원's avatar
a    
우지원 committed
130
                            </Form.Control.Feedback>
우지원's avatar
01_06    
우지원 committed
131
132
133
134
135
136
137
138
139
140
141
142
143
                        </Form.Group>

                        <Form.Group controlId="formGroupPassword">
                            <Form.Label>비밀번호</Form.Label>
                            <Form.Control
                                required
                                type="password"
                                name="password"
                                onChange={handleChange}
                                value={user.password}
                                placeholder="비밀번호를 입력해주세요" />
                            <Form.Control.Feedback type="invalid">
                                필수 정보입니다! 비밀번호를 입력해주세요!
우지원's avatar
ul    
우지원 committed
144
                            </Form.Control.Feedback>
우지원's avatar
01_06    
우지원 committed
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
                        </Form.Group>

                        <Button
                            disabled={disabled}
                            type='submit'
                            variant="outline-success"
                            size="lg"
                            className="mr-4"
                            block>가입</Button>
                        {error && <Alert variant='danger'>
                            {error}
                        </Alert>}
                    </div>
                </Container>
            </Form>
160
        </>
우지원's avatar
ul    
우지원 committed
161
162
163
164
    )
}

export default SingUp