Showing
4 changed files
with
110 additions
and
8 deletions
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) | ... | ... |
-
Please register or login to post a comment