diff --git a/src/containers/cstmrService/inquiry/UserInquiryContainer.js b/src/containers/cstmrService/inquiry/UserInquiryContainer.js index 2b7000b..65fd98e 100644 --- a/src/containers/cstmrService/inquiry/UserInquiryContainer.js +++ b/src/containers/cstmrService/inquiry/UserInquiryContainer.js @@ -11,7 +11,7 @@ import { ConfirmModal } from '../../../components/modal/ConfirmModal'; export default function UserInquiryContainer({ memberName }) { const dispatch = useDispatch(); - const { userList: lists, adminDetail: detail } = useSelector( + const { userList: lists, userDetail: detail } = useSelector( state => state.qnaState ); @@ -122,9 +122,9 @@ export default function UserInquiryContainer({ memberName }) { // 1:1 문의/수정 Modal handler const handlerInquiryModal = qnaSno => { if (!isInquiryModalOpen && qnaSno) { - dispatch(Actions.ADMIN_DETAIL.request(qnaSno)); + dispatch(Actions.USER_DETAIL.request(qnaSno)); } else { - dispatch(Actions.ADMIN_DETAIL_INITAL()); + dispatch(Actions.USER_DETAIL_INITAL()); setInquiryForm({ category: '칭찬', contact: '', @@ -204,7 +204,7 @@ export default function UserInquiryContainer({ memberName }) { dispatch(Actions.USER_INQUIRY.request(form)); } else if (type === 'edit') { dispatch( - Actions.USER_INQUIRY_UPDATE.request({ + Actions.USER_UPDATE.request({ qnaSno, category, contact, @@ -232,7 +232,7 @@ export default function UserInquiryContainer({ memberName }) { // 문의 삭제 const handlerDeleteInquiry = () => { const { qnaSno } = inquiryForm; - dispatch(Actions.ADMIN_DELETE.request({ qnaSno, role: 'user' })); + dispatch(Actions.USER_DELETE.request({ qnaSno })); setIsInquiryModalOpen(false); }; diff --git a/src/modules/cstmrService/inquiry/action/index.ts b/src/modules/cstmrService/inquiry/action/index.ts index 90455bc..ab4a59d 100644 --- a/src/modules/cstmrService/inquiry/action/index.ts +++ b/src/modules/cstmrService/inquiry/action/index.ts @@ -10,7 +10,8 @@ import { IQnaUserList, IQnaUserSearch, IQnaUserInquiry, - IQnaUserInquiryUpdate + IQnaUserDetail, + IQnaUserUpdate } from '../model'; // 관리자 목록 조회 @@ -51,13 +52,23 @@ const USER_INQUIRY_REQUEST = 'cstmrService/qna/USER_INQUIRY_REQUEST'; const USER_INQUIRY_SUCCESS = 'cstmrService/qna/USER_INQUIRY_SUCCESS'; const USER_INQUIRY_FAILURE = 'cstmrService/qna/USER_INQUIRY_FAILURE'; +// 사용자 문의 상세보기 +const USER_DETAIL_REQUEST = 'cstmrService/qna/USER_DETAIL_REQUEST'; +const USER_DETAIL_SUCCESS = 'cstmrService/qna/USER_DETAIL_SUCCESS'; +const USER_DETAIL_FAILURE = 'cstmrService/qna/USER_DETAIL_FAILURE'; + +// 관리자 문의 상세보기 초기화 +const USER_DETAIL_INITAL_ACTION = 'cstmrService/qna/USER_DETAIL_INITAL'; + +// 사용자 문의 삭제 +const USER_DELETE_REQUEST = 'cstmrService/qna/USER_DELETE_REQUEST'; +const USER_DELETE_SUCCESS = 'cstmrService/qna/USER_DELETE_SUCCESS'; +const USER_DELETE_FAILURE = 'cstmrService/qna/USER_DELETE_FAILURE'; + // 사용자 문의 수정 -const USER_INQUIRY_UPDATE_REQUEST = - 'cstmrService/qna/USER_INQUIRY_UPDATE_REQUEST'; -const USER_INQUIRY_UPDATE_SUCCESS = - 'cstmrService/qna/USER_INQUIRY_UPDATE_SUCCESS'; -const USER_INQUIRY_UPDATE_FAILURE = - 'cstmrService/qna/USER_INQUIRY_UPDATE_FAILURE'; +const USER_UPDATE_REQUEST = 'cstmrService/qna/USER_UPDATE_REQUEST'; +const USER_UPDATE_SUCCESS = 'cstmrService/qna/USER_UPDATE_SUCCESS'; +const USER_UPDATE_FAILURE = 'cstmrService/qna/USER_UPDATE_FAILURE'; export const ADMIN_LIST = createAsyncAction( ADMIN_LIST_REQUEST, @@ -95,7 +106,6 @@ export const ADMIN_DELETE = createAsyncAction( anserStatus: string; createUserNm: string; qnaSno: number; - role: string; }, {}, AxiosError @@ -113,11 +123,31 @@ export const USER_INQUIRY = createAsyncAction( USER_INQUIRY_FAILURE )(); -export const USER_INQUIRY_UPDATE = createAsyncAction( - USER_INQUIRY_UPDATE_REQUEST, - USER_INQUIRY_UPDATE_SUCCESS, - USER_INQUIRY_UPDATE_FAILURE -)(); +export const USER_DETAIL = createAsyncAction( + USER_DETAIL_REQUEST, + USER_DETAIL_SUCCESS, + USER_DETAIL_FAILURE +)(); + +export const USER_DETAIL_INITAL = createAction(USER_DETAIL_INITAL_ACTION)(); + +export const USER_UPDATE = createAsyncAction( + USER_UPDATE_REQUEST, + USER_UPDATE_SUCCESS, + USER_UPDATE_FAILURE +)(); + +export const USER_DELETE = createAsyncAction( + USER_DELETE_REQUEST, + USER_DELETE_SUCCESS, + USER_DELETE_FAILURE +)< + { + qnaSno: number; + }, + {}, + AxiosError +>(); const actions = { ADMIN_LIST, @@ -128,7 +158,10 @@ const actions = { ADMIN_DELETE, USER_LIST, USER_INQUIRY, - USER_INQUIRY_UPDATE + USER_DETAIL, + USER_DETAIL_INITAL, + USER_UPDATE, + USER_DELETE }; export type QnaAction = ActionType; diff --git a/src/modules/cstmrService/inquiry/apis/index.ts b/src/modules/cstmrService/inquiry/apis/index.ts index a337e7d..f19595b 100644 --- a/src/modules/cstmrService/inquiry/apis/index.ts +++ b/src/modules/cstmrService/inquiry/apis/index.ts @@ -1,10 +1,6 @@ import axios from '../../../utils/customAxiosUtil'; import qs from 'qs'; -import { - IQnaUserInquiry, - IQnaUserInquiryUpdate, - IQnaUserSearch -} from '../model'; +import { IQnaUserInquiry, IQnaUserSearch, IQnaUserUpdate } from '../model'; export const qnaAPI = { adminList: async (data: { @@ -73,7 +69,10 @@ export const qnaAPI = { } }); }, - userInquiryUpdate: async (data: IQnaUserInquiryUpdate) => { + userDetail: async (qnaSno: number) => { + return await axios.get(`api/cns/qna/${qnaSno}`); + }, + userUpdate: async (data: IQnaUserUpdate) => { const params = {}; Object.keys(data).forEach(i => { if (data[i]) { @@ -86,5 +85,8 @@ export const qnaAPI = { }); return await axios.put(`api/cns/qna${queryString}`); + }, + userDelete: async (qnaSno: number) => { + return await axios.delete(`api/cns/qna/${qnaSno}`); } }; diff --git a/src/modules/cstmrService/inquiry/model/index.ts b/src/modules/cstmrService/inquiry/model/index.ts index 04e0ea0..895ab86 100644 --- a/src/modules/cstmrService/inquiry/model/index.ts +++ b/src/modules/cstmrService/inquiry/model/index.ts @@ -2,6 +2,7 @@ export interface IQnaState { adminList: IQnaAdminList[]; adminDetail: IQnaAdminDetail; userList: IQnaUserList[]; + userDetail: IQnaUserDetail; } export interface IQnaAdminList { @@ -96,7 +97,28 @@ export interface IQnaUserInquiry { content: string; } -export interface IQnaUserInquiryUpdate extends IQnaUserInquiry { +export interface IQnaUserDetail { + qnaSno: number; + targetSno: number; + category: string; + title: string; + content: string; + anserContent: string; + anserStatus: string; + anserProcDt: string; + anserUserNm: string; + viewCnt: number; + fileGroupNo: number; + expsrYn: string; + createUserNm: string; + createUserId: string; + createDt: string; + updateUserId: string; + updateDt: string; + files: IQnaFiles[]; +} + +export interface IQnaUserUpdate extends IQnaUserInquiry { qnaSno: number; } @@ -122,5 +144,25 @@ export const initalState = { updateDt: '', files: [] }, - userList: [] + userList: [], + userDetail: { + qnaSno: 0, + targetSno: 0, + category: '', + title: '', + content: '', + anserContent: '', + anserStatus: '', + anserProcDt: '', + anserUserNm: '', + viewCnt: 0, + fileGroupNo: 0, + expsrYn: '', + createUserNm: '', + createUserId: '', + createDt: '', + updateUserId: '', + updateDt: '', + files: [] + } }; diff --git a/src/modules/cstmrService/inquiry/reducers/index.ts b/src/modules/cstmrService/inquiry/reducers/index.ts index 50c6fa4..0856ac8 100644 --- a/src/modules/cstmrService/inquiry/reducers/index.ts +++ b/src/modules/cstmrService/inquiry/reducers/index.ts @@ -32,4 +32,17 @@ export const qnaReducer = createReducer( const data = action.payload; draft.userList = data || []; }) + ) + // 사용자 상세 + .handleAction(Actions.USER_DETAIL.success, (state, action) => + produce(state, draft => { + const data = action.payload; + draft.userDetail = { ...state.userDetail, ...data }; + }) + ) + // 유저 상세 초기화 + .handleAction(Actions.USER_DETAIL_INITAL, (state, action) => + produce(state, draft => { + draft.userDetail = initalState.userDetail; + }) ); diff --git a/src/modules/cstmrService/inquiry/sagas/index.ts b/src/modules/cstmrService/inquiry/sagas/index.ts index d2f0456..6fbfcee 100644 --- a/src/modules/cstmrService/inquiry/sagas/index.ts +++ b/src/modules/cstmrService/inquiry/sagas/index.ts @@ -120,8 +120,7 @@ function* adminDeleteSaga( action: ActionType ) { try { - const { category, anserStatus, createUserNm, qnaSno, role } = - action.payload; + const { category, anserStatus, createUserNm, qnaSno } = action.payload; const res = yield call(Apis.qnaAPI.adminDelete, qnaSno); const { errorCode, data } = res; @@ -150,15 +149,9 @@ function* adminDeleteSaga( ); } - if (role === 'user') { - yield put( - Actions.USER_LIST.request({ category: '', searchType: '', word: '' }) - ); - } else { - yield put( - Actions.ADMIN_LIST.request({ category, anserStatus, createUserNm }) - ); - } + yield put( + Actions.ADMIN_LIST.request({ category, anserStatus, createUserNm }) + ); } catch (error) { yield put(Actions.ADMIN_DELETE.failure(error)); } @@ -228,12 +221,39 @@ function* userInquirySaga( } } -function* userInquiryUpdateSaga( - action: ActionType +function* userDetailSaga( + action: ActionType ) { try { const payload = action.payload; - const res = yield call(Apis.qnaAPI.userInquiryUpdate, payload); + const res = yield call(Apis.qnaAPI.userDetail, payload); + const { data, errorCode } = res; + + if (errorCode) { + // 오류메시지 호출 + yield put( + MessageActions.IS_ERROR({ + errorCode: errorCode, + errorMessage: '처리중 오류가 발생하였습니다', + isHistoryBack: false, + isRefresh: false + }) + ); + + return; + } + yield put(Actions.USER_DETAIL.success(data)); + } catch (error) { + yield put(Actions.USER_DETAIL.failure(error)); + } +} + +function* userUpdateSaga( + action: ActionType +) { + try { + const payload = action.payload; + const res = yield call(Apis.qnaAPI.userUpdate, payload); const { errorCode, data } = res; if (errorCode) { @@ -263,7 +283,48 @@ function* userInquiryUpdateSaga( ); // yield put(Actions.USER_INQUIRY_UPDATE.success(data)); } catch (error) { - yield put(Actions.USER_INQUIRY_UPDATE.failure(error)); + yield put(Actions.USER_UPDATE.failure(error)); + } +} + +function* userDeleteSaga( + action: ActionType +) { + try { + const { qnaSno } = action.payload; + const res = yield call(Apis.qnaAPI.adminDelete, qnaSno); + const { errorCode, data } = res; + + if (errorCode) { + // 오류메시지 호출 + yield put( + MessageActions.IS_ERROR({ + errorCode: errorCode, + errorMessage: '처리중 오류가 발생하였습니다', + isHistoryBack: false, + isRefresh: false + }) + ); + + return; + } + + if (data) { + yield put( + MessageActions.IS_MESSAGE({ + messageCode: DELETE_MESSAGE.code, + message: DELETE_MESSAGE.message, + isHistoryBack: false, + isRefresh: false + }) + ); + } + + yield put( + Actions.USER_LIST.request({ category: '', searchType: '', word: '' }) + ); + } catch (error) { + yield put(Actions.USER_DELETE.failure(error)); } } @@ -275,5 +336,7 @@ export function* qnaSaga() { yield takeEvery(Actions.ADMIN_DELETE.request, adminDeleteSaga); yield takeEvery(Actions.USER_LIST.request, userListSaga); yield takeEvery(Actions.USER_INQUIRY.request, userInquirySaga); - yield takeEvery(Actions.USER_INQUIRY_UPDATE.request, userInquiryUpdateSaga); + yield takeEvery(Actions.USER_DETAIL.request, userDetailSaga); + yield takeEvery(Actions.USER_UPDATE.request, userUpdateSaga); + yield takeEvery(Actions.USER_DELETE.request, userDeleteSaga); }