SignupPage.js 6.6 KB
Newer Older
Yoon, Daeki's avatar
Yoon, Daeki committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import React, { useState } from 'react';
import { Field, Formik } from 'formik';
import * as Yup from 'yup';
import axios from 'axios';
import { Link, Redirect } from 'react-router-dom';
import styled from 'styled-components';
import { Col, Container, Navbar, Button } from 'react-bootstrap';

const Menu = styled(Navbar)`
    background-color: #7B031D;

    a {
        color : white;
    }
`

const Wow = styled.div`
    height: 90vh;

Yoon, Daeki's avatar
Yoon, Daeki committed
20
21
    & #reCheck:after {
        content: "비밀번호를 다시 입력하세요";
Yoon, Daeki's avatar
Yoon, Daeki committed
22
23
    }

Yoon, Daeki's avatar
Yoon, Daeki committed
24
    & #reCheck:not(.right)::after {
Yoon, Daeki's avatar
Yoon, Daeki committed
25
        color: red;
Yoon, Daeki's avatar
Yoon, Daeki committed
26
        content: "비밀번호가 일치하지 않습니다";
Yoon, Daeki's avatar
Yoon, Daeki committed
27
28
29
30
    }
`

function Signup() {
Yoon, Daeki's avatar
Yoon, Daeki committed
31
32
  const [state, setState] = useState(false);
  const [checkPw, setCheckPw] = useState(true);
Yoon, Daeki's avatar
Yoon, Daeki committed
33

Yoon, Daeki's avatar
Yoon, Daeki committed
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
  if (state) {
    return <Redirect to="/login" />;
  }
  return (
    <div className="vh-100">
      <Menu expand="md" variant="dark">
        <Navbar.Brand>회원가입</Navbar.Brand>
      </Menu>
      <Container fluid>
        <Wow className="row justify-content-center">
          <Col md={3} xs={11} className="p-0">
            <Formik
              initialValues={{ name: '', id: '', password: '', password2: '', question: '', answer: '' }}
              validationSchema={Yup.object({
                name: Yup.string()
                  .required('이름을 입력해주세요.'),
                id: Yup.string()
                  .required('학번을 입력해주세요.'),
                password: Yup.string()
                  .required('비밀번호를 입력해주세요.')
                  .min(8, '8자 이상 입력해주세요.'),
                password2: Yup.string()
                  .required('비밀번호를 다시 입력해주세요.')
                  .min(8, '8자 이상 입력해주세요.')
                  .oneOf([Yup.ref("password"), null], '비밀번호가 일치하지 않습니다.'),
                answer: Yup.string()
                  .required('답변을 입력해주세요.'),
              })}
              onSubmit={(values, { setSubmitting }) => {
                axios({
                  method: 'post',
Yoon, Daeki's avatar
Yoon, Daeki committed
65
                  url: '/app/rental/api/users',
Yoon, Daeki's avatar
Yoon, Daeki committed
66
67
68
69
70
71
72
73
74
                  data: values,
                }).then(res => {
                  if (res.status === 404) return alert(res.data.error)
                  alert("회원가입이 완료되었습니다!")
                  setState(true);
                })
                  .catch(err => {
                    alert(err.error)
                  });
Yoon, Daeki's avatar
Yoon, Daeki committed
75

Yoon, Daeki's avatar
Yoon, Daeki committed
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
                setTimeout(() => {
                  setSubmitting(false);
                }, 400);  // finish the cycle in handler
              }}
            >
              {({
                errors,
                touched,
                handleSubmit,
                getFieldProps,  // contain values, handleChange, handleBlur
                isSubmitting,
              }) => (
                  <form onSubmit={handleSubmit} className="d-flex flex-column pt-3">
                    <div className="form-group ">
                      <div className={touched.name && errors.name ? "text-danger" : ""}>이름을 입력하세요</div>
                      <input
                        className={(touched.name && errors.name ? 'form-control is-invalid' : "form-control")}
                        type="text"
                        name="name"
                        {...getFieldProps('name')}
                        placeholder="이름" />
                    </div>
Yoon, Daeki's avatar
Yoon, Daeki committed
98

Yoon, Daeki's avatar
Yoon, Daeki committed
99
100
101
102
103
104
105
106
107
108
                    <div className="form-group">
                      <div className={touched.id && errors.id ? "text-danger" : ""}>학번을 입력하세요</div>
                      <input
                        className={(touched.id && errors.id ? 'form-control is-invalid' : "form-control")}
                        type="text"
                        name="id"
                        {...getFieldProps('id')}
                        placeholder="학번/교번"
                      />
                    </div>
Yoon, Daeki's avatar
Yoon, Daeki committed
109

Yoon, Daeki's avatar
Yoon, Daeki committed
110
111
112
113
114
115
116
117
118
119
                    <div className="form-group">
                      <div className={touched.password && errors.password ? "text-danger" : ""}>비밀번호를 입력하세요(8자리 이상)</div>
                      <input
                        className={(touched.password && errors.password ? 'form-control is-invalid' : "form-control")}
                        type="password"
                        name="password"
                        {...getFieldProps('password')}
                        placeholder="비밀번호"
                      />
                    </div>
Yoon, Daeki's avatar
Yoon, Daeki committed
120

Yoon, Daeki's avatar
Yoon, Daeki committed
121
122
123
124
125
126
127
128
129
130
131
                    <div className="form-group">
                      {touched.password2 && errors.password2 ? setCheckPw(false) : setCheckPw(true)}
                      <div id="reCheck" className={checkPw ? "right" : "err"}></div>
                      <input
                        className={touched.password2 && errors.password2 ? "form-control is-invalid" : "form-control"}
                        type="password"
                        name="password2"
                        {...getFieldProps('password2')}
                        placeholder="비밀번호 확인"
                      />
                    </div>
Yoon, Daeki's avatar
Yoon, Daeki committed
132

Yoon, Daeki's avatar
Yoon, Daeki committed
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
                    <div className="form-group">
                      <label>본인 확인 질문</label>
                      <Field as="select" name="question">
                        <option value="">질문을 선택하세요</option>
                        <option value="life">자신의 인생 좌우명은?</option>
                        <option value="school">자신이 다녔던 초등학교의 이름은?</option>
                        <option value="place">기억에 남는 추억의 장소는?</option>
                      </Field>
                    </div>
                    <div className="form-group">
                      <div className={touched.answer && errors.answer ? "text-danger" : ""}>답변을 입력해주세요.</div>
                      <input
                        className={(touched.answer && errors.answer ? 'form-control is-invalid' : "form-control")}
                        type="text"
                        name="answer"
                        {...getFieldProps('answer')}
                        placeholder="Input answer" />
                    </div>
                    <Button type="submit" variant="secondary" className="mb-2" disabled={isSubmitting}>회원가입</Button>
                    <Button variant="outline-secondary" as={Link} to="/login">로그인하러 가기</Button>
                  </form>
                )}
            </Formik>
          </Col>
        </Wow>
      </Container>
    </div >
  );
Yoon, Daeki's avatar
Yoon, Daeki committed
161
162
163
}

export default Signup