Browse Source

마이 페이지 components 작업

pull/2/head
sanguu 2 years ago
parent
commit
2954517ed1
  1. 6
      src/@core/layouts/components/navbar/UserDropdown.js
  2. 156
      src/components/account/mypage/MypageForm.js
  3. 51
      src/components/account/mypage/MypagePwForm.js
  4. 76
      src/containers/analysis/mypage/MypageContainer.js
  5. 16
      src/modules/account/login/actions/authAction.ts
  6. 8
      src/modules/account/login/apis/authApi.ts
  7. 2
      src/modules/account/login/models/authModel.ts
  8. 4
      src/modules/account/login/reducers/authReducer.ts
  9. 8
      src/modules/account/login/sagas/authSaga.ts
  10. 3
      src/redux/reducers/rootReducer.ts
  11. 8
      src/router/routes/RouteAccount.js
  12. 2
      src/router/routes/index.js
  13. 14
      src/views/Mypage/Mypage.js
  14. 68
      src/views/design/mypage/myinfo/DesignMyInfo.js

6
src/@core/layouts/components/navbar/UserDropdown.js

@ -60,7 +60,7 @@ const UserDropdown = () => {
};
const profileInfo = () => {
history.push('/mypage/myinfo/sample1');
history.push('/mypage/myinfo/');
};
return (
@ -78,7 +78,9 @@ const UserDropdown = () => {
<Avatar img={userAvatar} imgHeight='40' imgWidth='40' status='online' />
</DropdownToggle>
<DropdownMenu right>
<DropdownItem onClick={profileInfo}>
<DropdownItem onClick={profileInfo} tag={Link}
// to='/login'
to='#'>
<User size={14} className='mr-75' />
<span className='align-middle'>Profile</span>
</DropdownItem>

156
src/components/account/mypage/MypageForm.js

@ -0,0 +1,156 @@
// ** React Imports
import { useState, useEffect } from 'react'
import {
Card, CardBody, Row, Col, Nav, NavItem, NavLink, TabContent, TabPane, Alert, FormGroup, Form, Input, Label, Button,
Modal, ModalHeader, ModalBody, ModalFooter
} from 'reactstrap'
// ** Styles
import '../../../assets/css/custom.css';
//import {UserPageState,UserPageData,initResponseUserPageData} from '../../../../modules/account/login/models/authModel';
//const [detailData, setDetailData] = useState(userPage.UserPageData);
const MypageForm = ({ userInfo, formModal }) => {
return (
<Row className='app-user-edit'>
<Col sm='12'>
<Card>
<CardBody className='card-body-tab-cont'>
<TabPane tabId='1'>
<div className='search-info-box'>
{userInfo ?
<Row>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for='memberName'>이름</Label>
<Input type='text' id='memberName' size='sm' placeholder='' value={userInfo[0].memberName || ''} disabled />
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for='brithdyDate'>생년월일</Label>
<Input type='text' id='brithdyDate' size='sm' placeholder='' value={userInfo[0].brthdyDate || ""} disabled />
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for='cenderCD'>성별</Label>
<Input type='select' name='select' size='sm' id='cenderCD' value={userInfo[0].genderCd || ""} disabled >
<option>남자</option>
<option>여자</option>
</Input>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for='cntryCD'>국가코드</Label>
<Input type='select' name='select' size='sm' id='cntryCD' >
<option>대한민국</option>
</Input>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for='userId'>ID</Label>
<Input type='text' id='userId' size='sm' placeholder='' value={userInfo[0].userId || ""} disabled />
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for='email'>E-mail</Label>
<Input type='text' id='email' size='sm' placeholder={userInfo[0].email || ""} />
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label className='form-label' for='test'>
휴대폰 번호
</Label>
<div className='user-phone-btn' >
<Button.Ripple type='button' color='primary' onClick={() => setFormModal(!formModal)}>
<span className='d-sm-inline-block'>변경</span>
</Button.Ripple>
</div>
<Input type='number' name='test' id='hpno' size='sm' placeholder='' value={userInfo[0].hpno || ""} />
<div>
<Modal
isOpen={formModal}
toggle={() => setFormModal(!formModal)}
className='modal-dialog-centered'
>
<ModalHeader toggle={() => setFormModal(!formModal)}>
휴대폰번호 변경
</ModalHeader>
<ModalBody>
<div class='modal-box'>
<p className='ti'>휴대폰 번호 변경</p>
<p className='txt'>변경할 휴대폰 번호로 인증을 완료해주세요.</p>
</div>
<Row>
<Col className='list-input' md='12'>
<FormGroup>
<Row className='input-inline-btn'>
<Col md='8'>
<Label className='form-label' for='hpno'>휴대폰 번호</Label>
<Input type='number' name='test' id='hpno' size='sm' />
</Col>
<Col md='4' xs='12'>
{/* 발송 버튼을 누르면 남은시간 d-none를 빼주세여~ 그럼나타나여~ */}
<span className='time d-none'>
남은시간 : 3:00
</span>
<Button.Ripple type='button' color='secondary'>
<span className='d-sm-inline-block'>인증번호 발송</span>
</Button.Ripple>
</Col>
</Row>
</FormGroup>
</Col>
<Col className='list-input' md='12'>
<FormGroup>
<Row className='input-inline-btn'>
<Col md='8'>
<Label className='form-label' for='verifCode'>인증번호</Label>
<Input type='number' name='test' id='verifCode' size='sm' />
</Col>
<Col md='4' xs='12'>
<Button.Ripple type='button' color='secondary'>
<span className='d-sm-inline-block'>인증하기</span>
</Button.Ripple>
</Col>
</Row>
</FormGroup>
</Col>
</Row>
</ModalBody>
<ModalFooter>
<Button
color='primary'
onClick={() => setFormModal(!formModal)}
>
확인
</Button>
</ModalFooter>
</Modal>
</div>
</FormGroup>
</Col>
</Row>
: <></>
}
</div>
<div className='d-flex align-items-center'>
<Button.Ripple className='mr-1' color='primary' size='sm'>저장</Button.Ripple>
<Button.Ripple color='danger' size='sm'>취소</Button.Ripple>
</div>
</TabPane>
</CardBody>
</Card>
</Col>
</Row>
)
}
export default MypageForm;

51
src/components/account/mypage/MypagePwForm.js

@ -0,0 +1,51 @@
// ** React Imports
import { useState, useEffect } from 'react'
import {
Card, CardBody, Row, Col, Nav, NavItem, NavLink, TabContent, TabPane, Alert, FormGroup, Form, Input, Label, Button,
Modal, ModalHeader, ModalBody, ModalFooter
} from 'reactstrap'
// ** Styles
import '../../../assets/css/custom.css';
const MypagePwForm = ({ userInfo, formModal }) => {
return (
<TabPane tabId='2'>
<div className='search-info-box'>
<Row>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Form>
<Label for='userPswd'>기존 비밀번호</Label>
<Input type='password' id='userPswd' size='sm' autocomplete='off' placeholder='' />
</Form>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Form>
<Label for='newPswd'>새로운 비밀번호</Label>
<Input type='password' id='newPswd' size='sm' autocomplete='off' placeholder='' />
</Form>
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Form>
<Label for='pswdCheck'>새로운 비밀번호 확인</Label>
<Input type='password' id='pswdCheck' size='sm' autocomplete='off' placeholder='' />
</Form>
</FormGroup>
</Col>
</Row>
</div>
<div className='d-flex align-items-center'>
<Button.Ripple className='mr-1' color='primary' size='sm'>저장</Button.Ripple>
<Button.Ripple color='danger' size='sm'>취소</Button.Ripple>
</div>
</TabPane>
)
}
export default MypagePwForm;

76
src/containers/analysis/mypage/MypageContainer.js

@ -0,0 +1,76 @@
// ** React Imports
import { useState, useEffect } from 'react'
import { useParams, Link } from 'react-router-dom'
import { useSelector, useDispatch } from 'react-redux'
// ** Styles
import '../../../assets/css/custom.css';
// ** Third Party Components
import { User, Info, CreditCard, Lock, Check, X } from 'react-feather'
import {
Card, CardBody, Row, Col, Nav, NavItem, NavLink, TabContent, TabPane, Alert, FormGroup, Form, Input, Label, Button,
Modal, ModalHeader, ModalBody, ModalFooter
} from 'reactstrap'
import MypagePwForm from '../../../components/account/mypage/MypagePwForm';
import MypageForm from '../../../components/account/mypage/MypageForm';
import { userPageAction } from '../../../modules/account/login/actions/authAction';
// ** Function to toggle tabs
const MypageContainer = () => {
const [activeTab, setActiveTab] = useState('1'),
store = useSelector(state => state.users),
dispatch = useDispatch(),
{ id } = useParams()
const toggle = tab => setActiveTab(tab)
const [formModal, setFormModal] = useState(false)
const { userPage } = useSelector(state => state.UserPageState);
const { user } = useSelector(state => state.authState);
const [userInfo, setUserInfo] = useState();
useEffect(() => {
setUserInfo(userPage)
}, [userPage])
useEffect(() => {
if (user) {
dispatch(userPageAction.request(user.cstmrSno));
}
}, []);
return (
<div className='pal-card'>
<div className='card-body-tab-menu'>
<Nav pills>
<NavItem>
<NavLink active={activeTab === '1'} onClick={() => toggle('1')}>
<User size={14} />
<span className='align-middle d-none d-sm-block'>내정보</span>
</NavLink>
</NavItem>
<NavItem>
<NavLink active={activeTab === '2'} onClick={() => toggle('2')}>
<Lock size={14} />
<span className='align-middle d-none d-sm-block'>비밀번호 변경</span>
</NavLink>
</NavItem>
</Nav>
</div>
{activeTab == 1 ? <MypageForm
userInfo={userInfo}
toggle={toggle}
formModal={formModal}
/>
:
<></>
}
{activeTab == 2 ?
<MypagePwForm />
:
<></>
}
</div>
)
}
export default MypageContainer;

16
src/modules/account/login/actions/authAction.ts

@ -14,10 +14,16 @@ const USERS_LOGOUT_REQUEST = 'auth/USERS_LOGOUT_REQUEST';
const USERS_LOGOUT_SUCCESS = 'auth/USERS_LOGOUT_SUCCESS';
const USERS_LOGOUT_FAILURE = 'auth/USERS_LOGOUT_FAILURE';
//mypage list
const USERS_USERPAGE_REQUEST = 'auth/USERS_USERPAGE_REQUEST';
const USERS_USERPAGE_SUCCESS = 'auth/USERS_USERPAGE_SUCCESS';
const USERS_USERPAGE_FAILURE = 'auth/USERS_USERPAGE_FAILURE';
//# mypage update
const USERS_UPDATE_REQUEST = 'auth/USERS_UPDATE_REQUEST';
const USERS_UPDATE_SUCCESS = 'auth/USERS_UPDATE_SUCCESS';
const USERS_UPDATE_FAILURE = 'auth/USERS_UPDATE_FAILURE';
export const login = createAsyncAction(
USERS_LOGIN_REQUEST,
USERS_LOGIN_SUCCESS,
@ -42,7 +48,13 @@ export const refresh = createAsyncAction(
USERS_LOGOUT_FAILURE
)<TokenAccount, UserData, AxiosError>();
export const userPage = createAsyncAction(
export const USER_UPDATE = createAsyncAction(
USERS_UPDATE_REQUEST,
USERS_UPDATE_SUCCESS,
USERS_UPDATE_FAILURE
)<UserPageData, string, AxiosError>();
export const userPageAction = createAsyncAction(
USERS_USERPAGE_REQUEST,
USERS_USERPAGE_SUCCESS,
USERS_USERPAGE_FAILURE
@ -53,7 +65,7 @@ const actions = {
check,
logout,
refresh,
userPage
userPageAction,
};
export type AuthAction = ActionType<typeof actions>;

8
src/modules/account/login/apis/authApi.ts

@ -1,5 +1,5 @@
import axios from '../../../utils/customAxiosUtil';
import { ResponseUser, UserAccount, TokenAccount } from '../models/authModel';
import { ResponseUser, UserAccount, TokenAccount, UserPageData } from '../models/authModel';
import qs from 'qs';
@ -21,6 +21,10 @@ export const authAPI = {
getUserPage: async(id: string) => {
return await axios.get(`api/acnt/cstmr/profile/${id}`);
}
},
updateUser: async (data: UserPageData) => {
const res = await axios.put('api/acnt/cstmr/update', data);
return res;
}
};

2
src/modules/account/login/models/authModel.ts

@ -69,6 +69,8 @@ export interface UserPageData {
email: string;
hpno: string;
userId: string;
updateuserId:string;
updateDt:string;
}
export const initResponseUserPageData = {

4
src/modules/account/login/reducers/authReducer.ts

@ -6,7 +6,7 @@ import { createReducer } from 'typesafe-actions';
// action
import {
AuthAction,
userPage,
userPageAction,
check,
login,
logout,
@ -79,7 +79,7 @@ export const authReducer = createReducer<AuthState, AuthAction>(initialState)
export const mypageReducer = createReducer<UserPageState, AuthAction>(
initResponseUserPageData
).handleAction(userPage.success, (state, action) =>
).handleAction(userPageAction.success, (state, action) =>
produce(state, draft => {
const data: UserPageData = action.payload;

8
src/modules/account/login/sagas/authSaga.ts

@ -126,16 +126,16 @@ function* userLogoutSaga() {
}
function* userPageSaga(
action: ActionType<typeof Actions.userPage.request>
action: ActionType<typeof Actions.userPageAction.request>
) {
try{
const controlId = action.payload;
const { data } = yield call(authAPI.getUserPage, controlId);
console.log('userPageData : ', data)
yield put(Actions.userPage.success(data));
yield put(Actions.userPageAction.success(data));
} catch (error) {
yield put(Actions.userPage.failure(error));
yield put(Actions.userPageAction.failure(error));
}
}
@ -144,5 +144,5 @@ export function* authSaga() {
yield takeEvery(Actions.check.request, checkAuthencationSaga);
yield takeEvery(Actions.logout.request, userLogoutSaga);
// yield takeEvery(Actions.refresh.request, refreshTokenSaga);
yield takeEvery(Actions.userPage.request, userPageSaga);
yield takeEvery(Actions.userPageAction.request, userPageSaga);
}

3
src/redux/reducers/rootReducer.ts

@ -14,6 +14,8 @@ import { dronSaga } from '../../modules/basis/dron/sagas/basisDronSaga';
import { groupReducer } from '../../modules/basis/group/reducers/basisGroupReducer';
import { basGroupSaga } from '../../modules/basis/group/sagas/basisGroupSaga';
import { messageReducer } from '../../modules/comn/message/reducers/comnMessageReducer';
import { mypageReducer } from '../../modules/account/login/reducers/authReducer';
import {
controlGpDtlReducer,
controlGpHisReducer,
@ -63,6 +65,7 @@ const rootReducer = combineReducers({
dronState: dronReducer,
authState: authReducer,
accountState: accountReducer,
UserPageState: mypageReducer,
controlGpState: controlGpReducer,
controlGpHisState: controlGpHisReducer,
controlGpLogState: controlGpLogReducer,

8
src/router/routes/RouteAccount.js

@ -16,7 +16,13 @@ const RouteAccount = [
meta: {
authRoute: true
}
}
},
{
path: '/mypage/myinfo/',
component: lazy(() =>
import('../../views/Mypage/Mypage')
)
},
];
export default RouteAccount;

2
src/router/routes/index.js

@ -160,7 +160,7 @@ const Routes = [
{
path: '/mypage/myinfo/sample1',
component: lazy(() =>
import('../../views/design/mypage/myinfo/DesignMyinfo1')
import('../../views/design/mypage/myinfo/DesignMyInfo')
)
},
{

14
src/views/Mypage/Mypage.js

@ -0,0 +1,14 @@
import { User, Info, CreditCard, Lock, Check, X } from 'react-feather'
import { Card, CardBody, Row, Col, Nav, NavItem, NavLink, TabContent, TabPane, Alert, FormGroup, Form, Input, Label, Button,
Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'
import React from 'react';
import '../../assets/css/custom.css';
import MypageContainer from '../../containers/analysis/mypage/MypageContainer';
const Mypage = props => {
return (
<MypageContainer />
);
};
export default Mypage;

68
src/views/design/mypage/myinfo/DesignMyinfo1.js → src/views/design/mypage/myinfo/DesignMyInfo.js

@ -1,18 +1,16 @@
// ** React Imports
import { useState, useEffect } from 'react'
import { useParams, Link } from 'react-router-dom'
import { useSelector, useDispatch } from 'react-redux'
import { userPage } from '../../../../modules/account/login/actions/authAction';
// ** Third Party Components
import { User, Info, CreditCard, Lock, Check, X } from 'react-feather'
import { Card, CardBody, Row, Col, Nav, NavItem, NavLink, TabContent, TabPane, Alert, FormGroup, Form, Input, Label, Button,
import { Card, CardBody, Row, Col, Nav, NavItem, NavLink, TabContent, TabPane, Alert, FormGroup, Input, Label, Button,
Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap'
// ** Styles
import '../../../../assets/css/custom.css';
const UserEdit = () => {
// ** States & Vars
const [activeTab, setActiveTab] = useState('1'),
@ -24,16 +22,6 @@ const UserEdit = () => {
const toggle = tab => setActiveTab(tab)
const [formModal, setFormModal] = useState(false)
const { user } = useSelector(state => state.authState);
//const { userPage } = useSelector(state => state.UserPageState);
useEffect(() => {
if(user) {
dispatch(userPage.request(user.cstmrSno));
}
}, []);
return (
<div className='pal-card'>
<div className='card-body-tab-menu'>
@ -68,20 +56,20 @@ const UserEdit = () => {
<Row>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for='memberName'>이름</Label>
<Input type='text' id='memberName' size='sm' placeholder='' value='홍길동' disabled/>
<Label for='test'>이름</Label>
<Input type='text' id='test' size='sm' placeholder='' value='홍길동' disabled />
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for='brithdyDate'>생년월일</Label>
<Input type='number' id='brithdyDate' size='sm' placeholder='' value='19950915' disabled />
<Label for='test'>생년월일</Label>
<Input type='number' id='test' size='sm' placeholder='' value='19950915' disabled />
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for='cenderCD'>성별</Label>
<Input type='select' name='select' size='sm' id='cenderCD' value='여자' disabled >
<Label for='test'>성별</Label>
<Input type='select' name='select' size='sm' id='test' value='여자' disabled >
<option>남자</option>
<option>여자</option>
</Input>
@ -89,8 +77,8 @@ const UserEdit = () => {
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for='cntryCD'>국가코드</Label>
<Input type='select' name='select' size='sm' id='cntryCD' >
<Label for='test'>국가코드</Label>
<Input type='select' name='select' size='sm' id='test' >
<option>대한민국</option>
<option>2</option>
</Input>
@ -98,14 +86,14 @@ const UserEdit = () => {
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for='userId'>ID</Label>
<Input type='text' id='userId' size='sm' placeholder='' value='admin' disabled />
<Label for='test'>ID</Label>
<Input type='text' id='test' size='sm' placeholder='' value='admin' disabled />
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Label for='email'>E-mail</Label>
<Input type='text' id='email' size='sm' placeholder='' />
<Label for='test'>E-mail</Label>
<Input type='text' id='test' size='sm' placeholder='' />
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
@ -118,7 +106,7 @@ const UserEdit = () => {
<span className='d-sm-inline-block'>변경</span>
</Button.Ripple>
</div>
<Input type='number' name='test' id='hpno' size='sm' placeholder='010-0000-0000'/>
<Input type='number' name='test' id='test' size='sm' placeholder='010-0000-0000'/>
<div>
<Modal
isOpen={formModal}
@ -138,8 +126,8 @@ const UserEdit = () => {
<FormGroup>
<Row className='input-inline-btn'>
<Col md='8'>
<Label className='form-label' for='hpno'>휴대폰 번호</Label>
<Input type='number' name='test' id='hpno' size='sm' />
<Label className='form-label' for='test'>휴대폰 번호</Label>
<Input type='number' name='test' id='test' size='sm' />
</Col>
<Col md='4' xs='12'>
{/* 발송 버튼을 누르면 남은시간 d-none를 빼주세여~ 그럼나타나여~ */}
@ -157,8 +145,8 @@ const UserEdit = () => {
<FormGroup>
<Row className='input-inline-btn'>
<Col md='8'>
<Label className='form-label' for='verifCode'>인증번호</Label>
<Input type='number' name='test' id='verifCode' size='sm' />
<Label className='form-label' for='test'>인증번호</Label>
<Input type='number' name='test' id='test' size='sm' />
</Col>
<Col md='4' xs='12'>
<Button.Ripple type='button' color='secondary'>
@ -194,26 +182,20 @@ const UserEdit = () => {
<Row>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Form>
<Label for='userPswd'>기존 비밀번호</Label>
<Input type='password' id='userPswd' size='sm' autocomplete='off' placeholder='' />
</Form>
<Label for='test'>기존 비밀번호</Label>
<Input type='password' id='test' size='sm' placeholder='' />
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Form>
<Label for='newPswd'>새로운 비밀번호</Label>
<Input type='password' id='newPswd' size='sm' autocomplete='off' placeholder='' />
</Form>
<Label for='test'>새로운 비밀번호</Label>
<Input type='password' id='test' size='sm' placeholder='' />
</FormGroup>
</Col>
<Col className='list-input' md='3' sm='12'>
<FormGroup>
<Form>
<Label for='pswdCheck'>새로운 비밀번호 확인</Label>
<Input type='password' id='pswdCheck' size='sm' autocomplete='off' placeholder='' />
</Form>
<Label for='test'>새로운 비밀번호 확인</Label>
<Input type='password' id='test' size='sm' placeholder='' />
</FormGroup>
</Col>
</Row>
Loading…
Cancel
Save