From 83af51c473fb5bc93a33bf19928cfa9c53a29e31 Mon Sep 17 00:00:00 2001 From: hhjk00 Date: Wed, 25 Oct 2023 11:05:27 +0900 Subject: [PATCH] =?UTF-8?q?QNA=20=EC=82=AC=EC=9A=A9=EC=9E=90=20=EB=AC=B8?= =?UTF-8?q?=EC=9D=98=20=EB=AA=A9=EB=A1=9D=20api=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inquiry/UserInquiryContainer.js | 643 ++++-------------- .../cstmrService/inquiry/action/index.ts | 18 +- .../cstmrService/inquiry/apis/index.ts | 15 + .../cstmrService/inquiry/model/index.ts | 26 +- .../cstmrService/inquiry/reducers/index.ts | 7 + .../cstmrService/inquiry/sagas/index.ts | 26 + 6 files changed, 226 insertions(+), 509 deletions(-) diff --git a/src/containers/cstmrService/inquiry/UserInquiryContainer.js b/src/containers/cstmrService/inquiry/UserInquiryContainer.js index 56200aa8..2b195e89 100644 --- a/src/containers/cstmrService/inquiry/UserInquiryContainer.js +++ b/src/containers/cstmrService/inquiry/UserInquiryContainer.js @@ -1,516 +1,147 @@ import { Button, Badge } from 'reactstrap'; import AppCollapse from '@components/app-collapse'; +import { useDispatch, useSelector } from 'react-redux'; +import { USER_LIST } from '../../../modules/cstmrService/inquiry/action'; +import { useEffect } from 'react'; +import moment from 'moment'; -const data = [ - { - title: ( -
-
- 답변대기 - - [불만]드론을 구매했는데 기체신고를 해야하나요? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - {/* br처리? 줄바꿈.. 추후에 생각 */} - 네 그렇습니다. -
-
- - 사용용도가 영리 목적인 경우 : 무게에 상관없이 모두 신고 -
- - 사용용도가 비영리 목적인 경우 -
- · (무인멀티콥터, 무인비행기, 무인헬리콥터) 최대이륙중량 2kg 초과 시 - 신고 -
- · (무인비행선) 연료의 무게를 제외한 자체무게가 12kg 초과, 길이 7m 초과 - 시 신고
-
-
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - }, - { - title: ( -
-
- 답변완료 - - [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? - -
-
- 수정하기 - 2022-02-02 -
-
- ), - content: ( -
- - 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 하지 - 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 비행이 - 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 우려가 - 없도록 주의하여 비행하여야 합니다. - -
- ) - } -]; export default function UserInquiryContainer() { + const dispatch = useDispatch(); + + const { userList: lists } = useSelector(state => state.qnaState); + + const textLineBreaks = text => { + return text.replace((/\n/g, '
')); + }; + + const handlerQnaList = () => { + return lists.map(i => { + return { + title: ( +
+
+ {i.anserStatus === 'Y' ? ( + 답변완료 + ) : ( + 답변대기 + )} + + + [{i.category}] + {i.title} + +
+
+ 수정하기 + + {moment(i.createDt).format('YYYY-MM-DD')} + +
+
+ ), + content: ( + <> +
+ Q + + {/* br처리? 줄바꿈.. 추후에 생각 */} + +
+ {i.anserStatus === 'Y' && ( + <> +
+
+ A + +
+ + )} + + ) + }; + }); + }; + + const data = [ + { + title: ( +
+
+ 답변대기 + + [불만]드론을 구매했는데 기체신고를 해야하나요? + +
+
+ 수정하기 + 2022-02-02 +
+
+ ), + content: ( +
+ + {/* br처리? 줄바꿈.. 추후에 생각 */} + 네 그렇습니다. +
+
+ - 사용용도가 영리 목적인 경우 : 무게에 상관없이 모두 신고 +
+ - 사용용도가 비영리 목적인 경우 +
+ · (무인멀티콥터, 무인비행기, 무인헬리콥터) 최대이륙중량 2kg 초과 시 + 신고 +
+ · (무인비행선) 연료의 무게를 제외한 자체무게가 12kg 초과, 길이 7m + 초과 시 신고
+
+
+ ) + }, + { + title: ( +
+
+ 답변완료 + + [문의]실내에서 비행할 때에도 비행승인을 받아야 할까? + +
+
+ 수정하기 + 2022-02-02 +
+
+ ), + content: ( +
+ + 사방/천장이 막혀있는 밀폐된 실내 공간에서의 비행은 승인을 필요로 + 하지 않습니다. 또한, 적절한 조명장치가 있는 실내 공간이라면 야간에도 + 비행이 가능합니다. 다면 어떠한 경우에도 인명과 재산에 위험을 초래할 + 우려가 없도록 주의하여 비행하여야 합니다. + +
+ ) + } + ]; + + useEffect(() => { + dispatch(USER_LIST.request({ category: '', searchType: '', word: '' })); + }, []); + return (
- +
{/* 링크 연결 임시 하드코딩 */} diff --git a/src/modules/cstmrService/inquiry/action/index.ts b/src/modules/cstmrService/inquiry/action/index.ts index 0bda95f2..90d65265 100644 --- a/src/modules/cstmrService/inquiry/action/index.ts +++ b/src/modules/cstmrService/inquiry/action/index.ts @@ -6,7 +6,9 @@ import { IQnaAdminList, IQnaAdminDetail, IQnaAdminAnswer, - IQnaAdminFileDown + IQnaAdminFileDown, + IQnaUserList, + IQnaUserSearch } from '../model'; // 관리자 목록 조회 @@ -37,6 +39,11 @@ const ADMIN_DELETE_REQUEST = 'cstmrService/qna/ADMIN_DELETE_REQUEST'; const ADMIN_DELETE_SUCCESS = 'cstmrService/qna/ADMIN_DELETE_SUCCESS'; const ADMIN_DELETE_FAILURE = 'cstmrService/qna/ADMIN_DELETE_FAILURE'; +// 사용자 목록 조회 +const USER_LIST_REQUEST = 'cstmrService/qna/USER_LIST_REQUEST'; +const USER_LIST_SUCCESS = 'cstmrService/qna/USER_LIST_SUCCESS'; +const USER_LIST_FAILURE = 'cstmrService/qna/USER_LIST_FAILURE'; + export const ADMIN_LIST = createAsyncAction( ADMIN_LIST_REQUEST, ADMIN_LIST_SUCCESS, @@ -78,13 +85,20 @@ export const ADMIN_DELETE = createAsyncAction( AxiosError >(); +export const USER_LIST = createAsyncAction( + USER_LIST_REQUEST, + USER_LIST_SUCCESS, + USER_LIST_FAILURE +)(); + const actions = { ADMIN_LIST, ADMIN_DETAIL, ADMIN_DETAIL_INITAL, ADMIN_ANSWER, ADMIN_FILE_DOWN, - ADMIN_DELETE + ADMIN_DELETE, + USER_LIST }; export type QnaAction = ActionType; diff --git a/src/modules/cstmrService/inquiry/apis/index.ts b/src/modules/cstmrService/inquiry/apis/index.ts index 0b94edae..154af660 100644 --- a/src/modules/cstmrService/inquiry/apis/index.ts +++ b/src/modules/cstmrService/inquiry/apis/index.ts @@ -1,5 +1,6 @@ import axios from '../../../utils/customAxiosUtil'; import qs from 'qs'; +import { IQnaUserSearch } from '../model'; export const qnaAPI = { adminList: async (data: { @@ -46,5 +47,19 @@ export const qnaAPI = { }, adminDelete: async (qnaSno: number) => { return await axios.delete(`api/cns/qna/${qnaSno}`); + }, + userList: async (data: IQnaUserSearch) => { + const params = {}; + Object.keys(data).forEach(i => { + if (data[i]) { + params[`${i}`] = data[i]; + } + }); + const queryString = qs.stringify(params, { + addQueryPrefix: true, + arrayFormat: 'repeat' + }); + + return await axios.get(`api/cns/qna/user${queryString}`); } }; diff --git a/src/modules/cstmrService/inquiry/model/index.ts b/src/modules/cstmrService/inquiry/model/index.ts index 419ee659..13ea3346 100644 --- a/src/modules/cstmrService/inquiry/model/index.ts +++ b/src/modules/cstmrService/inquiry/model/index.ts @@ -1,6 +1,7 @@ export interface IQnaState { adminList: IQnaAdminList[]; adminDetail: IQnaAdminDetail; + userList: IQnaUserList[]; } export interface IQnaAdminList { @@ -66,6 +67,28 @@ export interface IQnaAdminFileDown { fileSno: number; } +export interface IQnaUserList { + qnaSno: number; + targetSno: number; + category: string; + title: string; + content: string; + anserStatus: string; + expsrYn: string; + viewCnt: number; + createUserNm: string; + createUserId: string; + createDt: string; + updateUserId: string; + updateDt: string; +} + +export interface IQnaUserSearch { + category: string; + searchType: string; + word: string; +} + export const initalState = { adminList: [], adminDetail: { @@ -87,5 +110,6 @@ export const initalState = { updateUserId: '', updateDt: '', files: [] - } + }, + userList: [] }; diff --git a/src/modules/cstmrService/inquiry/reducers/index.ts b/src/modules/cstmrService/inquiry/reducers/index.ts index d8475dcc..8c0f50c5 100644 --- a/src/modules/cstmrService/inquiry/reducers/index.ts +++ b/src/modules/cstmrService/inquiry/reducers/index.ts @@ -25,4 +25,11 @@ export const qnaReducer = createReducer( produce(state, draft => { draft.adminDetail = state.adminDetail; }) + ) + // 사용자 목록 + .handleAction(Actions.USER_LIST.success, (state, action) => + produce(state, draft => { + const data = action.payload; + draft.userList = data || []; + }) ); diff --git a/src/modules/cstmrService/inquiry/sagas/index.ts b/src/modules/cstmrService/inquiry/sagas/index.ts index 793d1dc2..35b420bc 100644 --- a/src/modules/cstmrService/inquiry/sagas/index.ts +++ b/src/modules/cstmrService/inquiry/sagas/index.ts @@ -158,10 +158,36 @@ function* adminDeleteSaga( } } +function* userListSaga(action: ActionType) { + try { + const payload = action.payload; + const res = yield call(Apis.qnaAPI.userList, payload); + const { data, count, errorCode } = res; + + if (errorCode) { + // 오류메시지 호출 + yield put( + MessageActions.IS_ERROR({ + errorCode: errorCode, + errorMessage: '처리중 오류가 발생하였습니다', + isHistoryBack: false, + isRefresh: false + }) + ); + + return; + } + yield put(Actions.USER_LIST.success(data)); + } catch (error) { + yield put(Actions.USER_LIST.failure(error)); + } +} + export function* qnaSaga() { yield takeEvery(Actions.ADMIN_LIST.request, adminListSaga); yield takeEvery(Actions.ADMIN_DETAIL.request, adminDetailSaga); yield takeEvery(Actions.ADMIN_ANSWER.request, adminAnswerSaga); yield takeEvery(Actions.ADMIN_FILE_DOWN.request, adminFileDownSaga); yield takeEvery(Actions.ADMIN_DELETE.request, adminDeleteSaga); + yield takeEvery(Actions.USER_LIST.request, userListSaga); }