From ce7fbcd54f54b3768e067c53d4143810fcd43b69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?junh=5Feee=28=EC=9D=B4=EC=A4=80=ED=9D=AC=29?= Date: Wed, 31 Jan 2024 19:12:48 +0900 Subject: [PATCH] =?UTF-8?q?[Redux]=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20?= =?UTF-8?q?=EA=B7=9C=EC=B9=99=20=EC=83=98=ED=94=8C=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20=ED=8F=B4=EB=8D=94=EB=AA=85=20dron=20->=20drone=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basis/dron/BasisDronContainer.js | 29 ++-- .../basis/dron/BasisDronDetailContainer.js | 64 ++++----- .../basis/dron/BasisIdntfContainer.js | 18 +-- src/modules/_sample/actions/index.ts | 36 ++--- src/modules/_sample/apis/index.ts | 4 +- src/modules/_sample/models/index.ts | 13 +- src/modules/_sample/reducers/index.ts | 2 +- src/modules/_sample/sagas/index.ts | 6 +- src/modules/basis/dron/actions/index.ts | 117 ---------------- src/modules/basis/dron/reducers/index.ts | 55 -------- src/modules/basis/drone/actions/index.ts | 132 ++++++++++++++++++ .../basis/{dron => drone}/apis/index.ts | 54 +++---- src/modules/basis/{dron => drone}/index.ts | 0 .../basis/{dron => drone}/models/index.ts | 48 ++++--- src/modules/basis/drone/reducers/index.ts | 54 +++++++ .../basis/{dron => drone}/sagas/index.ts | 76 +++++----- src/redux/reducers/rootReducer.ts | 2 +- 17 files changed, 367 insertions(+), 343 deletions(-) delete mode 100644 src/modules/basis/dron/actions/index.ts delete mode 100644 src/modules/basis/dron/reducers/index.ts create mode 100644 src/modules/basis/drone/actions/index.ts rename src/modules/basis/{dron => drone}/apis/index.ts (69%) rename src/modules/basis/{dron => drone}/index.ts (100%) rename src/modules/basis/{dron => drone}/models/index.ts (65%) create mode 100644 src/modules/basis/drone/reducers/index.ts rename src/modules/basis/{dron => drone}/sagas/index.ts (74%) diff --git a/src/containers/basis/dron/BasisDronContainer.js b/src/containers/basis/dron/BasisDronContainer.js index e92a7c75..6cd48a07 100644 --- a/src/containers/basis/dron/BasisDronContainer.js +++ b/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 ? ( { 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 ( { @@ -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 => { diff --git a/src/containers/basis/dron/BasisIdntfContainer.js b/src/containers/basis/dron/BasisIdntfContainer.js index f7565420..8301fd18 100644 --- a/src/containers/basis/dron/BasisIdntfContainer.js +++ b/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 ? ( diff --git a/src/modules/_sample/actions/index.ts b/src/modules/_sample/actions/index.ts index bdca7557..705065bd 100644 --- a/src/modules/_sample/actions/index.ts +++ b/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; diff --git a/src/modules/_sample/apis/index.ts b/src/modules/_sample/apis/index.ts index 7b052f08..50583cfc 100644 --- a/src/modules/_sample/apis/index.ts +++ b/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...'); } }; diff --git a/src/modules/_sample/models/index.ts b/src/modules/_sample/models/index.ts index 7d744c58..d26cad94 100644 --- a/src/modules/_sample/models/index.ts +++ b/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 -}; diff --git a/src/modules/_sample/reducers/index.ts b/src/modules/_sample/reducers/index.ts index ddd867bb..41e03e41 100644 --- a/src/modules/_sample/reducers/index.ts +++ b/src/modules/_sample/reducers/index.ts @@ -10,6 +10,6 @@ import * as Actions from '../actions'; export const sampleReducer = createReducer( initialState -).handleAction(Actions.droneList.success, (state, action) => +).handleAction(Actions.getDroneList.success, (state, action) => produce(state, draft => {}) ); diff --git a/src/modules/_sample/sagas/index.ts b/src/modules/_sample/sagas/index.ts index ebf9a16e..69bc038a 100644 --- a/src/modules/_sample/sagas/index.ts +++ b/src/modules/_sample/sagas/index.ts @@ -6,11 +6,13 @@ import { takeEvery } from 'redux-saga/effects'; * saga 함수는 카멜케이스를 사용하여 Action 함수 + Saga로 통일한다. */ -function* dronListSaga(action: ActionType) { +function* getDroneListSaga( + action: ActionType +) { try { } catch (error: any) {} } export function* sampleSaga() { - yield takeEvery(Actions.droneList.request, dronListSaga); + yield takeEvery(Actions.getDroneList.request, getDroneListSaga); } diff --git a/src/modules/basis/dron/actions/index.ts b/src/modules/basis/dron/actions/index.ts deleted file mode 100644 index 3f13e722..00000000 --- a/src/modules/basis/dron/actions/index.ts +++ /dev/null @@ -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 -)(); - -export const DETAIL = createAsyncAction( - DETAIL_REQUEST, - DETAIL_SUCCESS, - DETAIL_FAILURE -)(); - -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 -)(); - -export const UPDATE = createAsyncAction( - UPDATE_REQUEST, - UPDATE_SUCCESS, - UPDATE_FAILURE -)(); - -export const DELETE = createAsyncAction( - DELETE_REQUEST, - DELETE_SUCCESS, - DELETE_FAILURE -)(); - -export const IDNTF_DELETE = createAsyncAction( - IDNTF_DELETE_REQUEST, - IDNTF_DELETE_SUCCESS, - IDNTF_DELETE_FAILURE -)(); - -export const SELECT = createAction(SELECT_GROUP)(); - -const actions = { - LIST, - DETAIL, - CREATE, - UPDATE, - DELETE, - IDNTF_LIST, - IDNTF_CREATE, - IDNTF_DELETE, - RESET_IDNTF, - SELECT -}; - -export type DronAction = ActionType; diff --git a/src/modules/basis/dron/reducers/index.ts b/src/modules/basis/dron/reducers/index.ts deleted file mode 100644 index c31701c0..00000000 --- a/src/modules/basis/dron/reducers/index.ts +++ /dev/null @@ -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( - 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; - }) - ); diff --git a/src/modules/basis/drone/actions/index.ts b/src/modules/basis/drone/actions/index.ts new file mode 100644 index 00000000..de5ebfa9 --- /dev/null +++ b/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 +)(); + +export const getDroneDetail = createAsyncAction( + GET_DRONE_DETAIL_REQUEST, + GET_DRONE_DETAIL_SUCCESS, + GET_DRONE_DETAIL_FAILURE +)(); + +export const createDrone = createAsyncAction( + CREATE_DRONE_REQUEST, + CREATE_DRONE_SUCCESS, + CREATE_DRONE_FAILURE +)(); + +export const updateDrone = createAsyncAction( + UPDATE_DRONE_REQUEST, + UPDATE_DRONE_SUCCESS, + UPDATE_DRONE_FAILURE +)(); + +export const deleteDrone = createAsyncAction( + DELETE_DRONE_REQUEST, + DELETE_DRONE_SUCCESS, + DELETE_DRONE_FAILURE +)(); + +export const getIdntfList = createAsyncAction( + GET_IDNTF_LIST_REQUEST, + GET_IDNTF_LIST_SUCCESS, + GET_IDNTF_LIST_FAILURE +)(); + +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 +)(); + +export const selectGroup = createAction(DISPATCH_SELECT_GROUP)(); + +export const resetIdntf = createAction(DISPATCH_RESET_IDNTF)(); + +const actions = { + getDroneList, + getDroneDetail, + createDrone, + updateDrone, + deleteDrone, + getIdntfList, + createIdntf, + updateIdntf, + deleteIdntf, + resetIdntf, + selectGroup +}; + +export type DronAction = ActionType; diff --git a/src/modules/basis/dron/apis/index.ts b/src/modules/basis/drone/apis/index.ts similarity index 69% rename from src/modules/basis/dron/apis/index.ts rename to src/modules/basis/drone/apis/index.ts index e3f0f29a..229ea465 100644 --- a/src/modules/basis/dron/apis/index.ts +++ b/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); diff --git a/src/modules/basis/dron/index.ts b/src/modules/basis/drone/index.ts similarity index 100% rename from src/modules/basis/dron/index.ts rename to src/modules/basis/drone/index.ts diff --git a/src/modules/basis/dron/models/index.ts b/src/modules/basis/drone/models/index.ts similarity index 65% rename from src/modules/basis/dron/models/index.ts rename to src/modules/basis/drone/models/index.ts index 6f0b476a..ecd3c4e5 100644 --- a/src/modules/basis/dron/models/index.ts +++ b/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; +} diff --git a/src/modules/basis/drone/reducers/index.ts b/src/modules/basis/drone/reducers/index.ts new file mode 100644 index 00000000..aa082880 --- /dev/null +++ b/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( + 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; + }) + ); diff --git a/src/modules/basis/dron/sagas/index.ts b/src/modules/basis/drone/sagas/index.ts similarity index 74% rename from src/modules/basis/dron/sagas/index.ts rename to src/modules/basis/drone/sagas/index.ts index 9c31513f..9a341cc2 100644 --- a/src/modules/basis/dron/sagas/index.ts +++ b/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) { +function* listSaga(action: ActionType) { 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) { 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) { +function* listIdntfSaga( + action: ActionType +) { 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) { ] : []; 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) { +function* detailSaga( + action: ActionType +) { 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) { +function* createSaga(action: ActionType) { 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) { } function* createIdntfSaga( - action: ActionType + action: ActionType ) { 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) { +function* updateSaga(action: ActionType) { 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) { } } -function* deleteSaga(action: ActionType) { +function* deleteSaga(action: ActionType) { 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) { } function* deleteIdntfSaga( - action: ActionType + action: ActionType ) { 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); } diff --git a/src/redux/reducers/rootReducer.ts b/src/redux/reducers/rootReducer.ts index 731b015c..d21350c5 100644 --- a/src/redux/reducers/rootReducer.ts +++ b/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 {