Browse Source

[Redux] 네이밍 규칙 샘플 수정 및 폴더명 dron -> drone 수정

master
junh_eee(이준희) 8 months ago
parent
commit
ce7fbcd54f
  1. 29
      src/containers/basis/dron/BasisDronContainer.js
  2. 64
      src/containers/basis/dron/BasisDronDetailContainer.js
  3. 18
      src/containers/basis/dron/BasisIdntfContainer.js
  4. 36
      src/modules/_sample/actions/index.ts
  5. 4
      src/modules/_sample/apis/index.ts
  6. 13
      src/modules/_sample/models/index.ts
  7. 2
      src/modules/_sample/reducers/index.ts
  8. 6
      src/modules/_sample/sagas/index.ts
  9. 117
      src/modules/basis/dron/actions/index.ts
  10. 55
      src/modules/basis/dron/reducers/index.ts
  11. 132
      src/modules/basis/drone/actions/index.ts
  12. 54
      src/modules/basis/drone/apis/index.ts
  13. 0
      src/modules/basis/drone/index.ts
  14. 48
      src/modules/basis/drone/models/index.ts
  15. 54
      src/modules/basis/drone/reducers/index.ts
  16. 76
      src/modules/basis/drone/sagas/index.ts
  17. 2
      src/redux/reducers/rootReducer.ts

29
src/containers/basis/dron/BasisDronContainer.js

@ -2,7 +2,7 @@ import { useEffect, useState } from 'react';
import { shallowEqual, useDispatch, useSelector } from 'react-redux';
import { useHistory, Link } from 'react-router-dom';
import { Button } from 'reactstrap';
import * as DronActions from '../../../modules/basis/dron/actions';
import * as DroneActions from '../../../modules/basis/drone/actions';
import * as GroupActions from '../../../modules/basis/group/actions';
import { GET_ARCTFT_TYPE_CD } from '../../../utility/CondeUtil';
import { GET_WGHT_TYPE_CD } from '../../../utility/CondeUtil';
@ -14,10 +14,10 @@ export const BasisDronContainer = props => {
const history = useHistory();
// 현재 활성화한 그룹 정보
const { selectData } = useSelector(state => state.dronState);
const { selectGroup } = useSelector(state => state.dronState);
// 기체 목록, 총 기체 수
const { list, total } = useSelector(state => state.dronState);
const { droneList, droneTotal } = useSelector(state => state.dronState);
// 유저 정보
const { user } = useSelector(state => state.authState, shallowEqual);
@ -37,7 +37,7 @@ export const BasisDronContainer = props => {
sortable: true,
cell: row => {
return row?.groupNm;
// return selectData;
// return selectGroup;
}
},
{
@ -62,7 +62,7 @@ export const BasisDronContainer = props => {
// width: '100px',
sortable: true,
cell: row => {
return selectData?.groupId === row?.groupId ? (
return selectGroup?.groupId === row?.groupId ? (
<Button.Ripple
color='danger'
className='badge badge-danger'
@ -175,12 +175,13 @@ export const BasisDronContainer = props => {
const handlerPageChange = page => {
const param = params;
param.page = page;
dispatch(DronActions.LIST.request({ searchParams: param }));
// dispatch(DroneActions.getDroneList.request({ searchParams: param }));
dispatch(DroneActions.getDroneList.request(param));
};
// 상세보기 선택 시
const handlerDetail = (groupId, groupNm, groupAuthCd, myGroupAuthCd) => {
dispatch(DronActions.SELECT({ groupId: groupId, groupNm: groupNm }));
dispatch(DroneActions.selectGroup({ groupId: groupId, groupNm: groupNm }));
localStorage.setItem('dronGroupId', groupId);
localStorage.setItem('dronGroupNm', groupNm);
setParams({
@ -188,9 +189,7 @@ export const BasisDronContainer = props => {
groupId: groupId,
groupNm: groupNm
});
dispatch(
DronActions.LIST.request({ searchParams: { groupId: groupId, page: 1 } })
);
dispatch(DroneActions.getDroneList.request({ groupId: groupId, page: 1 }));
//기체등록버튼 활성/비활성 제어
let my = false;
@ -210,13 +209,13 @@ export const BasisDronContainer = props => {
// 기체 등록 화면으로 이동
const handlerGroupCreate = () => {
dispatch(DronActions.RESET_IDNTF()); // 초기화 진행
dispatch(DroneActions.resetIdntf()); // 초기화 진행
history.push(`/basis/dron/create`);
};
// 상세보기 선택취소 시
const handlerCancel = () => {
dispatch(DronActions.SELECT());
dispatch(DroneActions.selectGroup());
setParams({
...params,
@ -228,13 +227,13 @@ export const BasisDronContainer = props => {
return (
<BasisContainer
titleName={titleName}
selectData={selectData}
selectData={selectGroup}
column={columns}
data={[
<BasisDataGrid
titleName={params.groupNm ? `${params.groupNm} 기체` : '기체'}
data={list}
total={total}
data={droneList}
total={droneTotal}
columns={dronColumns}
pagination={true}
handlerPageChange={handlerPageChange}

64
src/containers/basis/dron/BasisDronDetailContainer.js

@ -9,8 +9,8 @@ import { yupResolver } from '@hookform/resolvers/yup';
import { BasisDronForm } from '../../../components/basis/dron/BasisDronForm';
import { BasisDronImage } from '../../../components/basis/dron/BasisDronImage';
import * as Actions from '../../../modules/basis/dron/actions';
import { dronAPI } from '../../../modules/basis/dron/apis';
import * as Actions from '../../../modules/basis/drone/actions';
import { droneAPI } from '../../../modules/basis/drone/apis';
import { IMG_PATH } from '../../../configs/constants';
export const BasisDronDetailContainer = props => {
@ -21,7 +21,7 @@ export const BasisDronDetailContainer = props => {
const { joinList, groupList } = useSelector(state => state.groupState);
// 기체 상세정보, 선택한 기체정보
const { detail, selectData } = useSelector(state => state.dronState);
const { droneDetail, selectData } = useSelector(state => state.dronState);
// 유저 정보
const { user } = useSelector(state => state.authState);
@ -104,12 +104,12 @@ export const BasisDronDetailContainer = props => {
handlerSearch();
setPageType('update');
}
return () => dispatch(Actions.RESET_IDNTF());
return () => dispatch(Actions.resetIdntf());
}, []);
// 기체 정보 존재 할 경우 데이터 셋팅
useEffect(() => {
if (!selectData && !detail) {
if (!selectData && !droneDetail) {
// history.goBack();
}
setValue(
@ -121,32 +121,32 @@ export const BasisDronDetailContainer = props => {
selectData?.groupNm || localStorage.getItem('dronGroupNm')
);
if (detail?.arcrftSno) {
setValue('arcrftModelNm', detail?.arcrftModelNm);
setValue('arcrftTypeCd', detail?.arcrftTypeCd);
setValue('cameraYn', detail?.cameraYn);
setValue('insrncYn', detail?.insrncYn);
setValue('prdctCmpnNm', detail?.prdctCmpnNm);
setValue('prdctNum', detail?.prdctNum);
setValue('imageUrl', detail?.imageUrl);
setValue('wghtTypeCd', detail?.wghtTypeCd);
setValue('updateUserId', detail?.updateUserId);
setValue('updateDt', detail?.updateDt);
if (droneDetail?.arcrftSno) {
setValue('arcrftModelNm', droneDetail?.arcrftModelNm);
setValue('arcrftTypeCd', droneDetail?.arcrftTypeCd);
setValue('cameraYn', droneDetail?.cameraYn);
setValue('insrncYn', droneDetail?.insrncYn);
setValue('prdctCmpnNm', droneDetail?.prdctCmpnNm);
setValue('prdctNum', droneDetail?.prdctNum);
setValue('imageUrl', droneDetail?.imageUrl);
setValue('wghtTypeCd', droneDetail?.wghtTypeCd);
setValue('updateUserId', droneDetail?.updateUserId);
setValue('updateDt', droneDetail?.updateDt);
if (detail?.imageUrl) {
setImg(IMG_PATH + detail?.imageUrl);
setImageUrl(detail?.imageUrl);
if (droneDetail?.imageUrl) {
setImg(IMG_PATH + droneDetail?.imageUrl);
setImageUrl(droneDetail?.imageUrl);
}
}
if (detail) {
if (droneDetail) {
if (user?.authId === 'SUPER') {
props.setIsDisabled(false);
props.setIsMyGroup(true);
} else if (user?.authId === 'ADMIN' || user?.authId === 'USER') {
//내가 등록한 기체인지
if (detail?.createUserId != '') {
if (detail?.createUserId != user?.userId) {
if (droneDetail?.createUserId != '') {
if (droneDetail?.createUserId != user?.userId) {
props.setIsDisabled(true);
} else {
props.setIsDisabled(false);
@ -158,7 +158,7 @@ export const BasisDronDetailContainer = props => {
// if(user?.authId === 'ADMIN') {
groupList?.filter(prev => {
if (prev?.myGroupAuthCd) {
if (prev?.groupId === detail?.groupId) {
if (prev?.groupId === droneDetail?.groupId) {
props.setIsMyGroup(true);
}
}
@ -171,7 +171,7 @@ export const BasisDronDetailContainer = props => {
} else {
props.setIsDisabled(false);
}
}, [selectData, detail]);
}, [selectData, droneDetail]);
// 이미지 업로드
const handlerImageChange = e => {
@ -202,14 +202,14 @@ export const BasisDronDetailContainer = props => {
// 이미지 저장
const saveFileAPI = async file => {
const fileName = await dronAPI.fileupload(file);
const fileName = await droneAPI.fileUpload(file);
setImageUrl(fileName);
setImg(IMG_PATH + fileName);
};
// 기체 상세정보 요청
const handlerSearch = () => {
dispatch(Actions.DETAIL.request(props.id));
dispatch(Actions.getDroneDetail.request(props.id));
};
// 기체 생성
@ -220,7 +220,7 @@ export const BasisDronDetailContainer = props => {
createUserId: user?.userId,
updateUserId: user?.userId
};
dispatch(Actions.CREATE.request(saveData));
dispatch(Actions.createDrone.request(saveData));
};
// 기체 수정
@ -228,16 +228,16 @@ export const BasisDronDetailContainer = props => {
const saveData = {
...data,
imageUrl: imageUrl,
arcrftSno: detail.arcrftSno,
arcrftSno: droneDetail.arcrftSno,
updateUserId: user?.userId
};
dispatch(Actions.UPDATE.request(saveData));
dispatch(Actions.updateDrone.request(saveData));
};
// 기체 삭제
const handlerDelete = async data => {
dispatch(Actions.DELETE.request(detail.arcrftSno));
dispatch(Actions.deleteDrone.request(droneDetail.arcrftSno));
};
return (
@ -256,11 +256,11 @@ export const BasisDronDetailContainer = props => {
<Col md='7' lg='9'>
<BasisDronForm
titleName={titleName}
detail={detail}
droneDetail={droneDetail}
data={register}
errors={errors}
type={pageType}
updateDt={detail?.updateDt}
updateDt={droneDetail?.updateDt}
isDisabled={props.isDisabled}
/>
</Col>

18
src/containers/basis/dron/BasisIdntfContainer.js

@ -2,7 +2,7 @@ import { useEffect, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { Card, CardBody, Col, Row } from '../../../components/ui/index';
import { BasisIdntfForm } from '../../../components/basis/dron/BasisIdntform';
import * as Actions from '../../../modules/basis/dron/actions';
import * as Actions from '../../../modules/basis/drone/actions';
import ErrorModal from '../../../components/modal/ErrorModal';
export const BasisIdntfContainer = props => {
const dispatch = useDispatch();
@ -13,7 +13,7 @@ export const BasisIdntfContainer = props => {
const [idntDataList, setIdntfDataList] = useState([]);
// 식별장치 목록, 기체 상세정보
const { listIdntf, detail, isRefreshIdntf } = useSelector(
const { idntfList, droneDetail, isRefreshIdntf } = useSelector(
state => state.dronState
);
// 유저 정보
@ -46,7 +46,7 @@ export const BasisIdntfContainer = props => {
useEffect(() => {
let newArr = [];
listIdntf?.map(item => {
idntfList?.map(item => {
newArr.push({ ...item });
});
@ -68,7 +68,7 @@ export const BasisIdntfContainer = props => {
}
setIdntfDataList(newArr);
}, [listIdntf]);
}, [idntfList]);
useEffect(() => {
if (isRefreshIdntf) {
@ -78,7 +78,7 @@ export const BasisIdntfContainer = props => {
// 식별장치 목록 요청
const handlerSearch = () => {
dispatch(Actions.IDNTF_LIST.request(props.id));
dispatch(Actions.getIdntfList.request(props.id));
};
// 식별장치 추가(+ 유효성검사)
@ -156,9 +156,9 @@ export const BasisIdntfContainer = props => {
saveArr;
dispatch(
Actions.IDNTF_CREATE.request({
Actions.createIdntf.request({
mode,
arcrftSno: detail?.arcrftSno,
arcrftSno: droneDetail?.arcrftSno,
data: saveArr.map(i => ({
...i,
idntfNum: `PA${i.idntfNum}`
@ -199,7 +199,7 @@ export const BasisIdntfContainer = props => {
if (!isSave) {
setIdntfDataList(idntDataList.filter(item => item.id !== id));
} else {
dispatch(Actions.IDNTF_DELETE.request(id));
dispatch(Actions.deleteIdntf.request(id));
}
};
@ -214,7 +214,7 @@ export const BasisIdntfContainer = props => {
setIdntfDataList(newArr);
};
return !detail ? (
return !droneDetail ? (
<Row>
<Col>
<Card>

36
src/modules/_sample/actions/index.ts

@ -3,32 +3,32 @@ import { createAsyncAction, ActionType, createAction } from 'typesafe-actions';
/**
* [Action ]
* _를 .
* .
* .
* .
* .
* DISPATCH_ .
* (ex. ) LOG로 .
*
*
* - LIST
* () - DETAIL
* / - CREATE
* / - UPDATE
* - DELETE
* - GET_[]_LIST
* - GET_[]_DETAIL
* / - CREATE_[]
* / - UPDATE_[]
* - DELETE_[]
*
*
* [Action ]
* .
* Action . (ex. DRONE_LIST_REQUEST -> dronList)
* Action . (Ex. GET_DRONE_LIST_REQUEST -> getDroneList)
* createAction을 .
*/
// 드론 목록
const DRONE_LIST_REQUEST = 'sample/DRONE_LIST_REQUEST';
const DRONE_LIST_SUCCESS = 'sample/DRONE_LIST_SUCCESS';
const DRONE_LIST_FAILURE = 'sample/DRONE_LIST_FAILURE';
const GET_DRONE_LIST_RQUEST = 'sample/GET_DRONE_LIST_RQUEST';
const GET_DRONE_LIST_SUCCESS = 'sample/GET_DRONE_LIST_SUCCESS';
const GET_DRONE_LIST_FAILURE = 'sample/GET_DRONE_LIST_FAILURE';
// 지도 타입
const DISPATHC_MAPTYPE = 'sample/DISPATCH_MAPTYPE';
const DISPATCH_MAPTYPE = 'sample/DISPATCH_MAPTYPE';
// 비행 이력 목록
const HISTORY_LIST_REQUEST = 'sample/HISTORY_LIST_REQUEST';
@ -36,16 +36,16 @@ const HISTORY_LIST_REQUEST = 'sample/HISTORY_LIST_REQUEST';
// 비행 이력 상세 목록
const HISTORY_LOG_REQUEST = 'sample/HISTORY_LOG_REQUEST';
export const droneList = createAsyncAction(
DRONE_LIST_REQUEST,
DRONE_LIST_SUCCESS,
DRONE_LIST_FAILURE
export const getDroneList = createAsyncAction(
GET_DRONE_LIST_RQUEST,
GET_DRONE_LIST_SUCCESS,
GET_DRONE_LIST_FAILURE
)();
export const dispatchMapType = createAction(DISPATHC_MAPTYPE)();
export const dispatchMapType = createAction(DISPATCH_MAPTYPE)();
const actions = {
droneList
getDroneList
};
export type SampleActions = ActionType<typeof actions>;

4
src/modules/_sample/apis/index.ts

@ -1,14 +1,14 @@
import axios from '../../utils/customAxiosUtil';
/**
* + API로 .
* + API로 .
* api는 Action .
* return은 .
*/
export const sampleAPI = {
// 드론 목록 조회
droneList: async () => {
getDroneList: async () => {
return await axios.get('api/bas/dron/list...');
}
};

13
src/modules/_sample/models/index.ts

@ -1,11 +1,17 @@
/**
* interface는 'I' .
* initialState로 .
* interface는 State로 .
*/
export const initialState: ISampleState = {
droneList: undefined,
droneCount: 0
};
export interface ISampleState {
droneList: IDroneDetail[] | undefined;
count: number | 0;
droneCount: number | 0;
}
export interface IDroneDetail {
@ -17,8 +23,3 @@ export interface IDroneDetail {
arcrftTypeCd: string;
arcrftWdth: number;
}
export const initialState: ISampleState = {
droneList: undefined,
count: 0
};

2
src/modules/_sample/reducers/index.ts

@ -10,6 +10,6 @@ import * as Actions from '../actions';
export const sampleReducer = createReducer<ISampleState, Actions.SampleActions>(
initialState
).handleAction(Actions.droneList.success, (state, action) =>
).handleAction(Actions.getDroneList.success, (state, action) =>
produce(state, draft => {})
);

6
src/modules/_sample/sagas/index.ts

@ -6,11 +6,13 @@ import { takeEvery } from 'redux-saga/effects';
* saga Action + Saga로 .
*/
function* dronListSaga(action: ActionType<typeof Actions.droneList.request>) {
function* getDroneListSaga(
action: ActionType<typeof Actions.getDroneList.request>
) {
try {
} catch (error: any) {}
}
export function* sampleSaga() {
yield takeEvery(Actions.droneList.request, dronListSaga);
yield takeEvery(Actions.getDroneList.request, getDroneListSaga);
}

117
src/modules/basis/dron/actions/index.ts

@ -1,117 +0,0 @@
import { AxiosError } from 'axios';
import { createAsyncAction, ActionType, createAction } from 'typesafe-actions';
import { DronData, DronState, SelectData, IdntfData } from '../models';
//# 목록 조회
const LIST_REQUEST = 'basis/dron/LIST_REQUEST';
const LIST_SUCCESS = 'basis/dron/LIST_SUCCESS';
const LIST_FAILURE = 'basis/dron/LIST_FAILURE';
//# 상세 조회
const DETAIL_REQUEST = 'basis/dron/DETAIL_REQUEST';
const DETAIL_SUCCESS = 'basis/dron/DETAIL_SUCCESS';
const DETAIL_FAILURE = 'basis/dron/DETAIL_FAILURE';
//## 생성
const CREATE_REQUEST = 'basis/dron/CREATE_REQUEST';
const CREATE_SUCCESS = 'basis/dron/CREATE_SUCCESS';
const CREATE_FAILURE = 'basis/dron/CREATE_FAILURE';
//## 수정
const UPDATE_REQUEST = 'basis/dron/UPDATE_REQUEST';
const UPDATE_SUCCESS = 'basis/dron/UPDATE_SUCCESS';
const UPDATE_FAILURE = 'basis/dron/UPDATE_FAILURE';
//## 삭제
const DELETE_REQUEST = 'basis/dron/DELETE_REQUEST';
const DELETE_SUCCESS = 'basis/dron/DELETE_SUCCESS';
const DELETE_FAILURE = 'basis/dron/DELETE_FAILURE';
//식별번호 목록 조회
const IDNTF_LIST_REQUEST = 'basis/idntf/IDNTF_LIST_REQUEST';
const IDNTF_LIST_SUCCESS = 'basis/idntf/IDNTF_LIST_SUCCESS';
const IDNTF_LIST_FAILURE = 'basis/idntf/IDNTF_LIST_FAILURE';
const DISPATCH_RESET_IDNTF = 'basis/idntf/IDNTF_RESET';
//식별번호 생성
const IDNTF_CREATE_REQUEST = 'basis/idntf/IDNTF_CREATE_REQUEST';
const IDNTF_CREATE_SUCCESS = 'basis/idntf/IDNTF_CREATE_SUCCESS';
const IDNTF_CREATE_FAILURE = 'basis/idntf/IDNTF_CREATE_FAILURE';
//식별번호 삭제
const IDNTF_DELETE_REQUEST = 'basis/idntf/IDNTF_DELETE_REQUEST';
const IDNTF_DELETE_SUCCESS = 'basis/idntf/IDNTF_DELETE_SUCCESS';
const IDNTF_DELETE_FAILURE = 'basis/idntf/IDNTF_DELETE_FAILURE';
//그룹 선택
const SELECT_GROUP = 'basis/dron/SELECT_GROUP';
export const LIST = createAsyncAction(LIST_REQUEST, LIST_SUCCESS, LIST_FAILURE)<
DronState,
{ data: DronData[]; count: number; total: number },
AxiosError
>();
export const IDNTF_LIST = createAsyncAction(
IDNTF_LIST_REQUEST,
IDNTF_LIST_SUCCESS,
IDNTF_LIST_FAILURE
)<number, { data: IdntfData[]; count: number }, AxiosError>();
export const DETAIL = createAsyncAction(
DETAIL_REQUEST,
DETAIL_SUCCESS,
DETAIL_FAILURE
)<number, DronData, AxiosError>();
export const RESET_IDNTF = createAction(DISPATCH_RESET_IDNTF)();
export const IDNTF_CREATE = createAsyncAction(
IDNTF_CREATE_REQUEST,
IDNTF_CREATE_SUCCESS,
IDNTF_CREATE_FAILURE
)<{ mode: string; data: IdntfData[]; arcrftSno: number }, string, AxiosError>();
export const CREATE = createAsyncAction(
CREATE_REQUEST,
CREATE_SUCCESS,
CREATE_FAILURE
)<DronData, string, AxiosError>();
export const UPDATE = createAsyncAction(
UPDATE_REQUEST,
UPDATE_SUCCESS,
UPDATE_FAILURE
)<DronData, String, AxiosError>();
export const DELETE = createAsyncAction(
DELETE_REQUEST,
DELETE_SUCCESS,
DELETE_FAILURE
)<number, string, AxiosError>();
export const IDNTF_DELETE = createAsyncAction(
IDNTF_DELETE_REQUEST,
IDNTF_DELETE_SUCCESS,
IDNTF_DELETE_FAILURE
)<string, string, AxiosError>();
export const SELECT = createAction(SELECT_GROUP)<SelectData>();
const actions = {
LIST,
DETAIL,
CREATE,
UPDATE,
DELETE,
IDNTF_LIST,
IDNTF_CREATE,
IDNTF_DELETE,
RESET_IDNTF,
SELECT
};
export type DronAction = ActionType<typeof actions>;

55
src/modules/basis/dron/reducers/index.ts

@ -1,55 +0,0 @@
import { createReducer } from 'typesafe-actions';
import produce from 'immer';
import * as Actions from '../actions';
import { DronState, initDron } from '../models';
export const dronReducer = createReducer<DronState, Actions.DronAction>(
initDron
)
.handleAction(Actions.LIST.success, (state, action) =>
produce(state, draft => {
const { data, count, total } = action.payload;
draft.list = data;
draft.count = count;
draft.total = total;
})
)
.handleAction(Actions.IDNTF_LIST.success, (state, action) =>
produce(state, draft => {
const { data, count } = action.payload;
draft.listIdntf = data;
draft.isRefreshIdntf = false;
draft.idntfCount = count;
})
)
.handleAction(Actions.SELECT, (state, action) =>
produce(state, draft => {
const selectData = action.payload;
draft.selectData = selectData;
})
)
.handleAction(Actions.IDNTF_CREATE.success, (state, action) =>
produce(state, draft => {
draft.isRefreshIdntf = true;
})
)
.handleAction(Actions.IDNTF_DELETE.success, (state, action) =>
produce(state, draft => {
draft.isRefreshIdntf = true;
})
)
.handleAction(Actions.RESET_IDNTF, (state, action) =>
produce(state, draft => {
draft.detail = undefined;
draft.listIdntf = undefined;
draft.isRefreshIdntf = false;
draft.idntfCount = 0;
})
)
.handleAction(Actions.DETAIL.success, (state, action) =>
produce(state, draft => {
const data = action.payload;
draft.detail = data;
})
);

132
src/modules/basis/drone/actions/index.ts

@ -0,0 +1,132 @@
import { AxiosError } from 'axios';
import { createAsyncAction, ActionType, createAction } from 'typesafe-actions';
import { IDroneDetail, SelectData, IdntfData, IIdntfUpdateRq } from '../models';
// 드론 목록 조회
const GET_DRONE_LIST_REQUEST = 'basis/drone/GET_DRONE_LIST_REQUEST';
const GET_DRONE_LIST_SUCCESS = 'basis/drone/GET_DRONE_LIST_SUCCESS';
const GET_DRONE_LIST_FAILURE = 'basis/drone/GET_DRONE_LIST_FAILURE';
// 드론 상세 조회
const GET_DRONE_DETAIL_REQUEST = 'basis/drone/GET_DRONE_DETAIL_REQUEST';
const GET_DRONE_DETAIL_SUCCESS = 'basis/drone/GET_DRONE_DETAIL_SUCCESS';
const GET_DRONE_DETAIL_FAILURE = 'basis/drone/GET_DRONE_DETAIL_FAILURE';
// 드론 생성
const CREATE_DRONE_REQUEST = 'basis/drone/CREATE_DRONE_REQUEST';
const CREATE_DRONE_SUCCESS = 'basis/drone/CREATE_DRONE_SUCCESS';
const CREATE_DRONE_FAILURE = 'basis/drone/CREATE_DRONE_FAILURE';
// 드론 수정
const UPDATE_DRONE_REQUEST = 'basis/drone/UPDATE_DRONE_REQUEST';
const UPDATE_DRONE_SUCCESS = 'basis/drone/UPDATE_DRONE_SUCCESS';
const UPDATE_DRONE_FAILURE = 'basis/drone/UPDATE_DRONE_FAILURE';
// 드론 삭제
const DELETE_DRONE_REQUEST = 'basis/drone/DELETE_DRONE_REQUEST';
const DELETE_DRONE_SUCCESS = 'basis/drone/DELETE_DRONE_SUCCESS';
const DELETE_DRONE_FAILURE = 'basis/drone/DELETE_DRONE_FAILURE';
// 식별장치 조회
const GET_IDNTF_LIST_REQUEST = 'basis/idntf/GET_IDNTF_LIST_REQUEST';
const GET_IDNTF_LIST_SUCCESS = 'basis/idntf/GET_IDNTF_LIST_SUCCESS';
const GET_IDNTF_LIST_FAILURE = 'basis/idntf/GET_IDNTF_LIST_FAILURE';
// 식별장치 생성
const CREATE_IDNTF_REQUEST = 'basis/idntf/CREATE_IDNTF_REQUEST';
const CREATE_IDNTF_SUCCESS = 'basis/idntf/CREATE_IDNTF_SUCCESS';
const CREATE_IDNTF_FAILURE = 'basis/idntf/CREATE_IDNTF_FAILURE';
// 식별장치 수정
const UPDATE_IDNTF_REQUEST = 'basis/idntf/UPDATE_IDNTF_REQUEST';
const UPDATE_IDNTF_SUCCESS = 'basis/idntf/UPDATE_IDNTF_SUCCESS';
const UPDATE_IDNTF_FAILURE = 'basis/idntf/UPDATE_IDNTF_FAILURE';
//식별장치 삭제
const DELETE_IDNTF_REQUEST = 'basis/idntf/DELETE_IDNTF_REQUEST';
const DELETE_IDNTF_SUCCESS = 'basis/idntf/DELETE_IDNTF_SUCCESS';
const DELETE_IDNTF_FAILURE = 'basis/idntf/DELETE_IDNTF_FAILURE';
// 드론 탭에서 그룹 선택
const DISPATCH_SELECT_GROUP = 'basis/drone/SELECT_GROUP';
const DISPATCH_RESET_IDNTF = 'basis/idntf/IDNTF_RESET';
export const getDroneList = createAsyncAction(
GET_DRONE_LIST_REQUEST,
GET_DRONE_LIST_SUCCESS,
GET_DRONE_LIST_FAILURE
)<string, { data: IDroneDetail[]; total: number }, AxiosError>();
export const getDroneDetail = createAsyncAction(
GET_DRONE_DETAIL_REQUEST,
GET_DRONE_DETAIL_SUCCESS,
GET_DRONE_DETAIL_FAILURE
)<number, IDroneDetail, AxiosError>();
export const createDrone = createAsyncAction(
CREATE_DRONE_REQUEST,
CREATE_DRONE_SUCCESS,
CREATE_DRONE_FAILURE
)<IDroneDetail, string, AxiosError>();
export const updateDrone = createAsyncAction(
UPDATE_DRONE_REQUEST,
UPDATE_DRONE_SUCCESS,
UPDATE_DRONE_FAILURE
)<IDroneDetail, String, AxiosError>();
export const deleteDrone = createAsyncAction(
DELETE_DRONE_REQUEST,
DELETE_DRONE_SUCCESS,
DELETE_DRONE_FAILURE
)<number, string, AxiosError>();
export const getIdntfList = createAsyncAction(
GET_IDNTF_LIST_REQUEST,
GET_IDNTF_LIST_SUCCESS,
GET_IDNTF_LIST_FAILURE
)<number, { data: IdntfData[]; count: number }, AxiosError>();
export const createIdntf = createAsyncAction(
CREATE_IDNTF_REQUEST,
CREATE_IDNTF_SUCCESS,
CREATE_IDNTF_FAILURE
)<{ mode: string; data: IdntfData[]; arcrftSno: number }, string, AxiosError>();
export const updateIdntf = createAsyncAction(
UPDATE_IDNTF_REQUEST,
UPDATE_IDNTF_SUCCESS,
UPDATE_IDNTF_FAILURE
)<
{ mode: string; data: IIdntfUpdateRq[]; arcrftSno: number },
string,
AxiosError
>();
export const deleteIdntf = createAsyncAction(
DELETE_IDNTF_REQUEST,
DELETE_IDNTF_SUCCESS,
DELETE_IDNTF_FAILURE
)<string, string, AxiosError>();
export const selectGroup = createAction(DISPATCH_SELECT_GROUP)<SelectData>();
export const resetIdntf = createAction(DISPATCH_RESET_IDNTF)();
const actions = {
getDroneList,
getDroneDetail,
createDrone,
updateDrone,
deleteDrone,
getIdntfList,
createIdntf,
updateIdntf,
deleteIdntf,
resetIdntf,
selectGroup
};
export type DronAction = ActionType<typeof actions>;

54
src/modules/basis/dron/apis/index.ts → src/modules/basis/drone/apis/index.ts

@ -1,54 +1,54 @@
import axios from '../../../utils/customAxiosUtil';
import qs from 'qs';
import { DronData } from '../models';
import { IDroneDetail } from '../models';
export const dronAPI = {
// 드론 목록 조회
list: async (data: string) => {
export const droneAPI = {
// 드론 목록
droneList: async (data: string) => {
const queryString = qs.stringify(data, {
addQueryPrefix: true,
arrayFormat: 'repeat'
});
return await axios.get(`api/bas/dron/list${queryString}`);
},
// 식별장치 목록 조회
idntfList: async (id: number) => {
return await axios.get(`api/bas/dron/idntf/list/${id}`);
},
// 식별장치 수정
idntfUpdate: async (item: { id: number; data: any[] }) => {
return await axios.put(`/api/bas/dron/idntf/update/${item.id}`, {
idntfNum: item.data[0].idntfNum,
ownerNm: item.data[0].ownerNm,
hpno: item.data[0].hpno
});
},
// 드론 상세 조회
detail: async (id: number) => {
// 드론 상세
droneDetail: async (id: number) => {
return await axios.get(`api/bas/dron/detail/${id}`);
},
//드론 생성
create: async (data: DronData) => {
// 드론 생성
droneCreate: async (data: IDroneDetail) => {
return await axios.post('api/bas/dron/create', data);
},
// 식별장치 생성
idntfCreate: async (item: { data: any[]; arcrftSno: number }) => {
return await axios.post('api/bas/dron/idntf/create', item);
},
// 드론 수정
update: async (data: DronData) => {
droneUpdate: async (data: IDroneDetail) => {
return await axios.put('api/bas/dron/update', data);
},
// 드론 삭제
delete: async (id: number) => {
droneDelete: async (id: number) => {
return await axios.delete(`api/bas/dron/delete/${id}`);
},
// 식별장치 목록
idntfList: async (id: number) => {
return await axios.get(`api/bas/dron/idntf/list/${id}`);
},
// 식별장치 생성
idntfCreate: async (item: { data: any[]; arcrftSno: number }) => {
return await axios.post('api/bas/dron/idntf/create', item);
},
// 식별장치 수정
idntfUpdate: async (item: { data: any[]; arcrftSno: number }) => {
return await axios.put(`/api/bas/dron/idntf/update/${item.arcrftSno}`, {
idntfNum: item.data[0].idntfNum,
ownerNm: item.data[0].ownerNm,
hpno: item.data[0].hpno
});
},
// 식별장치 삭제
idntfDelete: async (id: string) => {
return await axios.delete(`api/bas/dron/idntf/delete/${id}`);
},
// 드론 이미지 업로드
fileupload: async (file: any) => {
fileUpload: async (file: any) => {
let form = new FormData();
form.append('file', file);
return await axios.post('api/file/upload', form);

0
src/modules/basis/dron/index.ts → src/modules/basis/drone/index.ts

48
src/modules/basis/dron/models/index.ts → src/modules/basis/drone/models/index.ts

@ -1,14 +1,27 @@
export interface DronState {
list: DronData[] | undefined;
count: number | 0;
detail: DronData | undefined;
searchParams: string | '';
selectData: SelectData | undefined;
listIdntf: IdntfData[] | undefined;
export const initialState: IDroneState = {
droneList: undefined,
droneTotal: 0,
droneDetail: undefined,
idntfList: undefined,
idntfCount: 0,
selectGroup: undefined,
isRefreshIdntf: false,
page: 1
};
export interface IDroneState {
droneList: IDroneDetail[] | undefined;
droneTotal: number | 0;
droneDetail: IDroneDetail | undefined;
idntfList: IdntfData[] | undefined;
idntfCount: number | 0;
selectGroup: SelectData | undefined;
isRefreshIdntf: boolean | false;
page: number | 1;
total: number | 0;
}
export interface SelectData {
@ -16,7 +29,7 @@ export interface SelectData {
groupNm: string;
}
export interface DronData {
export interface IDroneDetail {
groupId: string;
arcrftSno: number;
arcrftHght: number;
@ -57,15 +70,8 @@ export interface IdntfData {
cstmrSno: number;
}
export const initDron = {
list: undefined,
count: 0,
detail: undefined,
searchParams: '',
selectData: undefined,
listIdntf: undefined,
idntfCount: 0,
isRefreshIdntf: false,
page: 1,
total: 0
};
export interface IIdntfUpdateRq {
idntfNum: string;
ownerNm: string;
hpno: string;
}

54
src/modules/basis/drone/reducers/index.ts

@ -0,0 +1,54 @@
import { createReducer } from 'typesafe-actions';
import produce from 'immer';
import * as Actions from '../actions';
import { IDroneState, initialState } from '../models';
export const dronReducer = createReducer<IDroneState, Actions.DronAction>(
initialState
)
.handleAction(Actions.getDroneList.success, (state, action) =>
produce(state, draft => {
const { data, total } = action.payload;
draft.droneList = data;
draft.droneTotal = total;
})
)
.handleAction(Actions.getIdntfList.success, (state, action) =>
produce(state, draft => {
const { data, count } = action.payload;
draft.idntfList = data;
draft.isRefreshIdntf = false;
draft.idntfCount = count;
})
)
.handleAction(Actions.selectGroup, (state, action) =>
produce(state, draft => {
const selectData = action.payload;
draft.selectGroup = selectData;
})
)
.handleAction(Actions.createIdntf.success, (state, action) =>
produce(state, draft => {
draft.isRefreshIdntf = true;
})
)
.handleAction(Actions.deleteIdntf.success, (state, action) =>
produce(state, draft => {
draft.isRefreshIdntf = true;
})
)
.handleAction(Actions.resetIdntf, (state, action) =>
produce(state, draft => {
draft.droneDetail = undefined;
draft.idntfList = undefined;
draft.isRefreshIdntf = false;
draft.idntfCount = 0;
})
)
.handleAction(Actions.getDroneDetail.success, (state, action) =>
produce(state, draft => {
const data = action.payload;
draft.droneDetail = data;
})
);

76
src/modules/basis/dron/sagas/index.ts → src/modules/basis/drone/sagas/index.ts

@ -10,13 +10,12 @@ import * as MessageActions from '../../../comn/message/actions/comnMessageAction
import * as Actions from '../actions';
import * as Apis from '../apis';
function* listSaga(action: ActionType<typeof Actions.LIST.request>) {
function* listSaga(action: ActionType<typeof Actions.getDroneList.request>) {
try {
const { searchParams } = action.payload;
const res = yield call(Apis.dronAPI.list, searchParams);
const params = action.payload;
const res = yield call(Apis.droneAPI.droneList, params);
const {
data: { items, total },
count,
errorCode
} = res;
@ -34,21 +33,22 @@ function* listSaga(action: ActionType<typeof Actions.LIST.request>) {
return;
}
yield put(
Actions.LIST.success({
Actions.getDroneList.success({
data: items,
count,
total
})
);
} catch (error: any) {
yield put(Actions.LIST.failure(error));
yield put(Actions.getDroneList.failure(error));
}
}
function* listIdntfSaga(action: ActionType<typeof Actions.IDNTF_LIST.request>) {
function* listIdntfSaga(
action: ActionType<typeof Actions.getIdntfList.request>
) {
try {
const params = action.payload;
const res = yield call(Apis.dronAPI.idntfList, params);
const res = yield call(Apis.droneAPI.idntfList, params);
const { data, count, errorCode, errorMessage } = res;
if (errorCode) {
@ -75,33 +75,35 @@ function* listIdntfSaga(action: ActionType<typeof Actions.IDNTF_LIST.request>) {
]
: [];
yield put(
Actions.IDNTF_LIST.success({
Actions.getIdntfList.success({
data: list,
count: count
})
);
} catch (error: any) {
yield put(Actions.IDNTF_LIST.failure(error));
yield put(Actions.getIdntfList.failure(error));
}
}
function* detailSaga(action: ActionType<typeof Actions.DETAIL.request>) {
function* detailSaga(
action: ActionType<typeof Actions.getDroneDetail.request>
) {
try {
const id = action.payload;
const res = yield call(Apis.dronAPI.detail, id);
const res = yield call(Apis.droneAPI.droneDetail, id);
const { data } = res;
yield put(Actions.DETAIL.success(data));
yield put(Actions.getDroneDetail.success(data));
} catch (error: any) {
yield put(Actions.DETAIL.failure(error));
yield put(Actions.getDroneDetail.failure(error));
}
}
function* createSaga(action: ActionType<typeof Actions.CREATE.request>) {
function* createSaga(action: ActionType<typeof Actions.createDrone.request>) {
try {
const detail = action.payload;
const res = yield call(Apis.dronAPI.create, detail);
const res = yield call(Apis.droneAPI.droneCreate, detail);
const { data } = res;
@ -142,18 +144,18 @@ function* createSaga(action: ActionType<typeof Actions.CREATE.request>) {
}
function* createIdntfSaga(
action: ActionType<typeof Actions.IDNTF_CREATE.request>
action: ActionType<typeof Actions.createIdntf.request>
) {
try {
const detail = action.payload;
let res;
if (detail.mode === 'update') {
res = yield call(Apis.dronAPI.idntfUpdate, {
res = yield call(Apis.droneAPI.idntfUpdate, {
data: detail.data,
id: detail.arcrftSno
arcrftSno: detail.arcrftSno
});
} else {
res = yield call(Apis.dronAPI.idntfCreate, {
res = yield call(Apis.droneAPI.idntfCreate, {
data: detail.data,
arcrftSno: detail.arcrftSno
});
@ -170,7 +172,7 @@ function* createIdntfSaga(
isRefresh: false
})
);
yield put(Actions.IDNTF_CREATE.success(data));
yield put(Actions.createIdntf.success(data));
} else {
if (data.errorCode === 'DT002') {
yield put(
@ -198,10 +200,10 @@ function* createIdntfSaga(
}
}
function* updateSaga(action: ActionType<typeof Actions.UPDATE.request>) {
function* updateSaga(action: ActionType<typeof Actions.updateDrone.request>) {
try {
const detail = action.payload;
const res = yield call(Apis.dronAPI.update, detail);
const res = yield call(Apis.droneAPI.droneUpdate, detail);
console.log(res, '---res');
const { data } = res;
@ -242,10 +244,10 @@ function* updateSaga(action: ActionType<typeof Actions.UPDATE.request>) {
}
}
function* deleteSaga(action: ActionType<typeof Actions.DELETE.request>) {
function* deleteSaga(action: ActionType<typeof Actions.deleteDrone.request>) {
try {
const id = action.payload;
const res = yield call(Apis.dronAPI.delete, id);
const res = yield call(Apis.droneAPI.droneDelete, id);
const { data } = res;
@ -275,11 +277,11 @@ function* deleteSaga(action: ActionType<typeof Actions.DELETE.request>) {
}
function* deleteIdntfSaga(
action: ActionType<typeof Actions.IDNTF_DELETE.request>
action: ActionType<typeof Actions.deleteIdntf.request>
) {
try {
const id = action.payload;
const res = yield call(Apis.dronAPI.idntfDelete, id);
const res = yield call(Apis.droneAPI.idntfDelete, id);
const { data } = res;
@ -292,7 +294,7 @@ function* deleteIdntfSaga(
isRefresh: false
})
);
yield put(Actions.IDNTF_DELETE.success(data));
yield put(Actions.deleteIdntf.success(data));
} else {
throw Error;
}
@ -310,12 +312,12 @@ function* deleteIdntfSaga(
}
export function* dronSaga() {
yield takeEvery(Actions.LIST.request, listSaga);
yield takeEvery(Actions.IDNTF_LIST.request, listIdntfSaga);
yield takeEvery(Actions.DETAIL.request, detailSaga);
yield takeEvery(Actions.CREATE.request, createSaga);
yield takeEvery(Actions.IDNTF_CREATE.request, createIdntfSaga);
yield takeEvery(Actions.UPDATE.request, updateSaga);
yield takeEvery(Actions.DELETE.request, deleteSaga);
yield takeEvery(Actions.IDNTF_DELETE.request, deleteIdntfSaga);
yield takeEvery(Actions.getDroneList.request, listSaga);
yield takeEvery(Actions.getDroneDetail.request, detailSaga);
yield takeEvery(Actions.createDrone.request, createSaga);
yield takeEvery(Actions.updateDrone.request, updateSaga);
yield takeEvery(Actions.deleteDrone.request, deleteSaga);
yield takeEvery(Actions.getIdntfList.request, listIdntfSaga);
yield takeEvery(Actions.createIdntf.request, createIdntfSaga);
yield takeEvery(Actions.deleteIdntf.request, deleteIdntfSaga);
}

2
src/redux/reducers/rootReducer.ts

@ -23,7 +23,7 @@ import {
analysisSimulatorSaga,
analysisSimulatorReducer
} from '../../modules/analysis/simulation';
import { dronSaga, dronReducer } from '../../modules/basis/dron';
import { dronSaga, dronReducer } from '../../modules/basis/drone';
import { basGroupSaga, groupReducer } from '../../modules/basis/group';
import { messageReducer } from '../../modules/comn/message';
import {

Loading…
Cancel
Save