Showing
8 changed files
with
218 additions
and
12 deletions
1 | +import React from 'react'; | ||
2 | +import styled from 'styled-components'; | ||
3 | +import Button from '../common/Button'; | ||
4 | +import palette from '../../lib/styles/palette'; | ||
5 | +const BJIDFormBlock = styled.div` | ||
6 | + width: 100%; | ||
7 | + border-top: 1px solid ${palette.gray[2]}; | ||
8 | + padding-top: 2rem; | ||
9 | + h4 { | ||
10 | + color: ${palette.gray[8]}; | ||
11 | + margin-top: 0; | ||
12 | + margin-bottom: 0.5rem; | ||
13 | + } | ||
14 | +`; | ||
15 | + | ||
16 | +const BJIDForm = ({ onChange, onBJIDSubmit, profile }) => { | ||
17 | + return ( | ||
18 | + <BJIDFormBlock> | ||
19 | + <h4>백준 아이디</h4> | ||
20 | + <input | ||
21 | + name="userBJID" | ||
22 | + onChange={onChange} | ||
23 | + value={profile.userBJID} | ||
24 | + placeholder="백준 아이디" | ||
25 | + /> | ||
26 | + <button type="submit" onSubmit={onBJIDSubmit}> | ||
27 | + 등록 | ||
28 | + </button> | ||
29 | + </BJIDFormBlock> | ||
30 | + ); | ||
31 | +}; | ||
32 | +export default BJIDForm; |
1 | +import React from 'react'; | ||
2 | +import styled from 'styled-components'; | ||
3 | +import Button from '../common/Button'; | ||
4 | +import palette from '../../lib/styles/palette'; | ||
5 | +import BJIDForm from './BJIDForm'; | ||
6 | + | ||
7 | +const SettingFormBlock = styled.div` | ||
8 | + h3 { | ||
9 | + margin: 0; | ||
10 | + color: ${palette.gray[8]}; | ||
11 | + margin-bottom: 1rem; | ||
12 | + } | ||
13 | + background: ${palette.gray[2]}; | ||
14 | + margin: 0 auto; | ||
15 | + display: flex; | ||
16 | + flex-direction: column; | ||
17 | +`; | ||
18 | +const StyledInput = styled.input` | ||
19 | + font-size: 1rem; | ||
20 | + border: none; | ||
21 | + border-bottom: 1px solid ${palette.gray[5]}; | ||
22 | + padding-bottom: 0.5rem; | ||
23 | + outline: none; | ||
24 | + &:focus { | ||
25 | + color: $oc-teal-7; | ||
26 | + border-bottom: 1px solid ${palette.gray[7]}; | ||
27 | + } | ||
28 | + & + & { | ||
29 | + margin-top: 1rem; | ||
30 | + } | ||
31 | +`; | ||
32 | +const SectionContainer = styled.div` | ||
33 | + display: flex; | ||
34 | +`; | ||
35 | + | ||
36 | +const SettingForm = ({ onChange, onBJIDSubmit, profile }) => { | ||
37 | + console.log(profile); | ||
38 | + return ( | ||
39 | + <SettingFormBlock> | ||
40 | + <SectionContainer> | ||
41 | + <h3>{profile.username}</h3> | ||
42 | + <p>입력</p> | ||
43 | + </SectionContainer> | ||
44 | + | ||
45 | + <SectionContainer> | ||
46 | + <BJIDForm | ||
47 | + profile={profile} | ||
48 | + onChange={onChange} | ||
49 | + onBJIDSubmit={onBJIDSubmit} | ||
50 | + /> | ||
51 | + </SectionContainer> | ||
52 | + | ||
53 | + <SectionContainer> | ||
54 | + <h3>친구</h3> | ||
55 | + <StyledInput name="BJID" placeholder="친구 아이디" /> | ||
56 | + <Button>추가</Button> | ||
57 | + </SectionContainer> | ||
58 | + <h3>친구 리스트</h3> | ||
59 | + </SettingFormBlock> | ||
60 | + ); | ||
61 | +}; | ||
62 | + | ||
63 | +export default SettingForm; |
1 | +import React, { useEffect, useState } from 'react'; | ||
2 | +import { useDispatch, useSelector } from 'react-redux'; | ||
3 | +import { withRouter } from 'react-router-dom'; | ||
4 | +import { changeField, setBJID } from '../../modules/profile'; | ||
5 | +import SettingForm from '../../components/setting/SettingForm'; | ||
6 | +const SettingContainer = ({ history }) => { | ||
7 | + const dispatch = useDispatch(); | ||
8 | + const [error, setError] = useState(null); | ||
9 | + const { user, profile } = useSelector(({ user, profile }) => ({ | ||
10 | + user: user.user, | ||
11 | + profile: profile, | ||
12 | + })); | ||
13 | + | ||
14 | + const onChange = (e) => { | ||
15 | + const { value, name } = e.target; | ||
16 | + dispatch( | ||
17 | + changeField({ | ||
18 | + key: name, | ||
19 | + value: value, | ||
20 | + }), | ||
21 | + ); | ||
22 | + }; | ||
23 | + | ||
24 | + const onBJIDSubmit = (e) => { | ||
25 | + e.preventDefault(); | ||
26 | + let username = profile.username; | ||
27 | + let userBJID = profile.userBJID; | ||
28 | + dispatch(setBJID({ username, userBJID })); | ||
29 | + }; | ||
30 | + | ||
31 | + useEffect(() => { | ||
32 | + //Do Init Form | ||
33 | + console.log(profile); | ||
34 | + }, [dispatch]); | ||
35 | + | ||
36 | + return ( | ||
37 | + <SettingForm | ||
38 | + type="setting" | ||
39 | + onChange={onChange} | ||
40 | + onBJIDSubmit={onBJIDSubmit} | ||
41 | + profile={profile} | ||
42 | + ></SettingForm> | ||
43 | + ); | ||
44 | +}; | ||
45 | + | ||
46 | +export default withRouter(SettingContainer); |
jaksimsamil-page/src/lib/api/profile.js
0 → 100644
... | @@ -5,19 +5,19 @@ import createRequestSaga, { | ... | @@ -5,19 +5,19 @@ import createRequestSaga, { |
5 | createRequestActionTypes, | 5 | createRequestActionTypes, |
6 | } from '../lib/createRequestSaga'; | 6 | } from '../lib/createRequestSaga'; |
7 | import * as authAPI from '../lib/api/auth'; | 7 | import * as authAPI from '../lib/api/auth'; |
8 | -const CHAGE_FIELD = 'auth/CHANGE_FIELD'; | 8 | +const CHANGE_FIELD = 'auth/CHANGE_FIELD'; |
9 | const INITIALIZE_FORM = 'auth/INITIALIZE_FORM'; | 9 | const INITIALIZE_FORM = 'auth/INITIALIZE_FORM'; |
10 | 10 | ||
11 | -const REGISTER = 'auth/REGISTER'; | 11 | +const [REGISTER, REGISTER_SUCCESS, REGISTER_FAILURE] = createRequestActionTypes( |
12 | -const REGISTER_SUCCESS = 'auth/REGISTER_SUCCESS'; | 12 | + 'auth/REGISTER', |
13 | -const REGISTER_FAILURE = 'auth/REGISTER_FAILURE'; | 13 | +); |
14 | 14 | ||
15 | -const LOGIN = 'auth/LOGIN'; | 15 | +const [LOGIN, LOGIN_SUCCESS, LOGIN_FAILURE] = createRequestActionTypes( |
16 | -const LOGIN_SUCCESS = 'auth/LOGIN_SUCCESS'; | 16 | + 'auth/REGISTER', |
17 | -const LOGIN_FAILURE = 'auth/LOGIN_FAILURE'; | 17 | +); |
18 | 18 | ||
19 | export const changeField = createAction( | 19 | export const changeField = createAction( |
20 | - CHAGE_FIELD, | 20 | + CHANGE_FIELD, |
21 | ({ form, key, value }) => ({ | 21 | ({ form, key, value }) => ({ |
22 | form, | 22 | form, |
23 | key, | 23 | key, |
... | @@ -59,7 +59,7 @@ export function* authSaga() { | ... | @@ -59,7 +59,7 @@ export function* authSaga() { |
59 | 59 | ||
60 | const auth = handleActions( | 60 | const auth = handleActions( |
61 | { | 61 | { |
62 | - [CHAGE_FIELD]: (state, { payload: { form, key, value } }) => | 62 | + [CHANGE_FIELD]: (state, { payload: { form, key, value } }) => |
63 | produce(state, (draft) => { | 63 | produce(state, (draft) => { |
64 | draft[form][key] = value; | 64 | draft[form][key] = value; |
65 | }), | 65 | }), | ... | ... |
... | @@ -3,15 +3,17 @@ import { all } from 'redux-saga/effects'; | ... | @@ -3,15 +3,17 @@ import { all } from 'redux-saga/effects'; |
3 | import auth, { authSaga } from './auth'; | 3 | import auth, { authSaga } from './auth'; |
4 | import loading from './loading'; | 4 | import loading from './loading'; |
5 | import user, { userSaga } from './user'; | 5 | import user, { userSaga } from './user'; |
6 | +import profile, { profileSaga } from './profile'; | ||
6 | 7 | ||
7 | const rootReducer = combineReducers({ | 8 | const rootReducer = combineReducers({ |
8 | auth, | 9 | auth, |
9 | loading, | 10 | loading, |
10 | user, | 11 | user, |
12 | + profile, | ||
11 | }); | 13 | }); |
12 | 14 | ||
13 | export function* rootSaga() { | 15 | export function* rootSaga() { |
14 | - yield all([authSaga(), userSaga()]); | 16 | + yield all([authSaga(), userSaga(), profileSaga()]); |
15 | } | 17 | } |
16 | 18 | ||
17 | export default rootReducer; | 19 | export default rootReducer; | ... | ... |
jaksimsamil-page/src/modules/profile.js
0 → 100644
1 | +import { createAction, handleActions } from 'redux-actions'; | ||
2 | +import createRequestSaga, { | ||
3 | + createRequestActionTypes, | ||
4 | +} from '../lib/createRequestSaga'; | ||
5 | +import produce from 'immer'; | ||
6 | +import * as profileAPI from '../lib/api/profile'; | ||
7 | +import { takeLatest } from 'redux-saga/effects'; | ||
8 | + | ||
9 | +const INITIALIZE = 'profile/INITIALIZE'; | ||
10 | +const CHANGE_FIELD = 'profile/CHANGE_FIELD'; | ||
11 | + | ||
12 | +const [SET_BJID, SET_BJID_SUCCESS, SET_BJID_FAILURE] = createRequestActionTypes( | ||
13 | + 'profile/SET_BJID', | ||
14 | +); | ||
15 | + | ||
16 | +export const setBJID = createAction(SET_BJID, ({ username, BJID }) => ({ | ||
17 | + username, | ||
18 | + BJID, | ||
19 | +})); | ||
20 | + | ||
21 | +export const changeField = createAction(CHANGE_FIELD, ({ key, value }) => ({ | ||
22 | + key, | ||
23 | + value, | ||
24 | +})); | ||
25 | + | ||
26 | +const initialState = { | ||
27 | + username: '', | ||
28 | + userBJID: '', | ||
29 | + solvedBJ: '', | ||
30 | + friendList: [], | ||
31 | + BJIDError: '', | ||
32 | +}; | ||
33 | + | ||
34 | +const setBJIDSaga = createRequestSaga(SET_BJID, profileAPI.setBJID); | ||
35 | +export function* profileSaga() { | ||
36 | + yield takeLatest(SET_BJID, setBJIDSaga); | ||
37 | +} | ||
38 | + | ||
39 | +export default handleActions( | ||
40 | + { | ||
41 | + [INITIALIZE]: (state) => initialState, | ||
42 | + [CHANGE_FIELD]: (state, { payload: { key, value } }) => | ||
43 | + produce(state, (draft) => { | ||
44 | + draft[key] = value; | ||
45 | + }), | ||
46 | + | ||
47 | + [SET_BJID_SUCCESS]: (state, { payload: BJID }) => ({ | ||
48 | + ...state, | ||
49 | + BJID, | ||
50 | + BJIDError: null, | ||
51 | + }), | ||
52 | + [SET_BJID_FAILURE]: (state, { payload: error }) => ({ | ||
53 | + ...state, | ||
54 | + BJIDError: error, | ||
55 | + }), | ||
56 | + }, | ||
57 | + initialState, | ||
58 | +); |
1 | import React from 'react'; | 1 | import React from 'react'; |
2 | import HeaderContainer from '../containers/common/HeaderContainer'; | 2 | import HeaderContainer from '../containers/common/HeaderContainer'; |
3 | -import Button from '../components/common/Button'; | 3 | +import SettingForm from '../components/setting/SettingForm'; |
4 | +import SettingContainer from '../containers/setting/SettingContainer'; | ||
4 | 5 | ||
5 | const SettingPage = () => { | 6 | const SettingPage = () => { |
6 | return ( | 7 | return ( |
7 | <div> | 8 | <div> |
8 | <HeaderContainer /> | 9 | <HeaderContainer /> |
9 | - <Button>setting</Button> | 10 | + <SettingContainer></SettingContainer> |
10 | </div> | 11 | </div> |
11 | ); | 12 | ); |
12 | }; | 13 | }; | ... | ... |
-
Please register or login to post a comment