박민정

[feat] Register page

1 // type들만 관리하는 곳 1 // type들만 관리하는 곳
2 2
3 -export const LOGIN_USER = "login_user";
...\ No newline at end of file ...\ No newline at end of file
3 +export const LOGIN_USER = "login_user";
4 +export const REGISTER_USER = "resgier_user";
...\ No newline at end of file ...\ No newline at end of file
......
1 import axios from 'axios'; 1 import axios from 'axios';
2 import { 2 import {
3 - LOGIN_USER 3 + LOGIN_USER,
4 + REGISTER_USER
4 } from './types'; 5 } from './types';
5 export function loginUser(logInfo) { 6 export function loginUser(logInfo) {
6 const request = axios.post('/api/users/login', logInfo) // logInfo를 post로 전달 7 const request = axios.post('/api/users/login', logInfo) // logInfo를 post로 전달
...@@ -14,4 +15,18 @@ export function loginUser(logInfo) { ...@@ -14,4 +15,18 @@ export function loginUser(logInfo) {
14 type: "LOGIN_USER", 15 type: "LOGIN_USER",
15 payload: request // payroad == response 16 payload: request // payroad == response
16 } 17 }
18 +}
19 +
20 +export function RegisterUser(regInfo) {
21 + const request = axios.post('/api/users/register', regInfo) // logInfo를 post로 전달
22 + .then(response => response.data); // 서버에서 받은 데이터를 request에 저장
23 +
24 + return { // return을 통해 Reducer로 보냄
25 + // Reducer에서 previousState, action을 이용해 nextState로 만들기 때문 :: (previousState, action) => nextState
26 + // request를 reducer로 보내는 작업
27 +
28 + // action은 type과 response을 넣어줘야 함
29 + type: "REGISTER_USER",
30 + payload: request // payroad == response
31 + }
17 } 32 }
...\ No newline at end of file ...\ No newline at end of file
......
1 import { 1 import {
2 - LOGIN_USER 2 + LOGIN_USER,
3 + REGISTER_USER
3 } from '../_actions/types'; 4 } from '../_actions/types';
4 5
5 6
...@@ -7,9 +8,12 @@ import { ...@@ -7,9 +8,12 @@ import {
7 export default function (prevState = {}, action) { 8 export default function (prevState = {}, action) {
8 switch (action.type) { 9 switch (action.type) {
9 case LOGIN_USER: 10 case LOGIN_USER:
10 - return {...prevState, loginSuccess:action.payload} // 위의 prevState를 그대로 가져오고, 11 + return {...prevState, loginSuccess:action.payload} // 위의 prevState를 그대로 가져오고,
11 // user_action.js에 있는 payload를 그대로 가져와서 return. 12 // user_action.js에 있는 payload를 그대로 가져와서 return.
12 break; 13 break;
14 + case REGISTER_USER:
15 + return {...prevState, success:action.payload}
16 + break;
13 default: 17 default:
14 return prevState; 18 return prevState;
15 } 19 }
......
1 import React from 'react' 1 import React from 'react'
2 +import {useState} from 'react'
3 +import {useDispatch} from 'react-redux';
4 +import {RegisterUser} from '../../../_actions/user_action'
5 +import { withRouter } from 'react-router-dom';
6 +
7 +function RegisterPage(props) {
8 +
9 + // 이 로그인페이지 안에서 input에 타이핑을 함으로써 데이터를 변화시켜주므로 state 사용.
10 + // 1-1. state을 사용하기 위해 state 만들어줌.
11 + const [Name, setName] = useState("");
12 + const [Email, setEmail] = useState(""); // 1-2. email을 위한 state
13 + const [Password, setPassword] = useState(""); // 1-2. password를 위한 state
14 + const [Password2, setPassword2] = useState("");
15 +
16 + //1-3. 아래 input value에 넣어줌
17 +
18 + // 2-1. 타이핑할 때 타이핑 하는 거 보이게 하도록 핸들러를 만들어줌
19 + const emailEvent = (event) => {
20 + setEmail(event.currentTarget.value)
21 + }
22 + const passwordEvent = (event) => {
23 + setPassword(event.currentTarget.value)
24 +
25 + }
26 + const password2Event = (event) => {
27 + setPassword2(event.currentTarget.value)
28 +
29 + }
30 + const NameEvent = (event) => {
31 + setName(event.currentTarget.value)
32 +
33 + }
34 +
35 + const dispatch = useDispatch();
36 + const submitEvent = (event) => {
37 + event.preventDefault(); // 이걸 하지 않으면 버튼을 누를 때마다 refresh돼서 데이터 처리를 할 수 없음
38 +
39 + //console.log('Email', Email); // 잘 나오는지 확인
40 + //console.log('Password', Password); // 잘 나오는지 확인
41 +
42 + // 비밀번호 두개가 같아야 회원가입이 되도록
43 + if(Password !== Password2)
44 + return alert('비밀번호가 일치하지 않습니다.')
45 +
46 +
47 + let regiInfo = { // 보내주기 위해 저장
48 + name : Name,
49 + email: Email,
50 + password: Password
51 + }
52 +
53 + dispatch(RegisterUser(regiInfo)) // _actions폴더 user_action.js에 있음
54 + .then(response => {
55 + if(response.payload.success)
56 + props.history.push('/login');
57 +
58 + else
59 + alert('Fail to sign up');
60 + })
61 +
62 + }
2 63
3 -function RegisterPage() {
4 return ( 64 return (
5 - <div> 65 + <div style={{
6 - RegisterPage 66 + justifyContent:'center', alignItems: 'center', display:'flex', width:'100%', height:'50vh'
67 + }}>
68 + <form onSubmit={submitEvent} style={{display: 'flex', flexDirection: 'column'}}>
69 +
70 + <label>Name</label>
71 + <input type="text" value={Name} onChange={NameEvent} />
72 +
73 + <label>Email</label>
74 + <input type="email" value={Email} onChange={emailEvent} />
75 + {/* input type="email"이라서 '이메일 주소에 '@'를 포함해주세요'라는 경고문 뜸. */}
76 +
77 +
78 + <label>Password</label>
79 + <input type="password" value={Password} onChange={passwordEvent} />
80 +
81 + <label>Confirm Password</label>
82 + <input type="password" value={Password2} onChange={password2Event} />
83 +
84 + <br/>
85 + <button>
86 + Sign In
87 + </button>
88 + </form>
7 </div> 89 </div>
8 ) 90 )
9 } 91 }
10 92
11 -export default RegisterPage 93 +export default withRouter(RegisterPage)
......