Browse Source

qna 사용자 문의 상세,삭제 api 추가

pull/2/head
hhjk00 11 months ago
parent
commit
ef1a18c97f
  1. 10
      src/containers/cstmrService/inquiry/UserInquiryContainer.js
  2. 61
      src/modules/cstmrService/inquiry/action/index.ts
  3. 14
      src/modules/cstmrService/inquiry/apis/index.ts
  4. 46
      src/modules/cstmrService/inquiry/model/index.ts
  5. 13
      src/modules/cstmrService/inquiry/reducers/index.ts
  6. 95
      src/modules/cstmrService/inquiry/sagas/index.ts

10
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);
};

61
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
)<IQnaUserInquiry, {}, AxiosError>();
export const USER_INQUIRY_UPDATE = createAsyncAction(
USER_INQUIRY_UPDATE_REQUEST,
USER_INQUIRY_UPDATE_SUCCESS,
USER_INQUIRY_UPDATE_FAILURE
)<IQnaUserInquiryUpdate, {}, AxiosError>();
export const USER_DETAIL = createAsyncAction(
USER_DETAIL_REQUEST,
USER_DETAIL_SUCCESS,
USER_DETAIL_FAILURE
)<number, IQnaUserDetail, AxiosError>();
export const USER_DETAIL_INITAL = createAction(USER_DETAIL_INITAL_ACTION)();
export const USER_UPDATE = createAsyncAction(
USER_UPDATE_REQUEST,
USER_UPDATE_SUCCESS,
USER_UPDATE_FAILURE
)<IQnaUserUpdate, {}, AxiosError>();
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<typeof actions>;

14
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}`);
}
};

46
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: []
}
};

13
src/modules/cstmrService/inquiry/reducers/index.ts

@ -32,4 +32,17 @@ export const qnaReducer = createReducer<IQnaState, Actions.QnaAction>(
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;
})
);

95
src/modules/cstmrService/inquiry/sagas/index.ts

@ -120,8 +120,7 @@ function* adminDeleteSaga(
action: ActionType<typeof Actions.ADMIN_DELETE.request>
) {
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<typeof Actions.USER_INQUIRY_UPDATE.request>
function* userDetailSaga(
action: ActionType<typeof Actions.USER_DETAIL.request>
) {
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<typeof Actions.USER_UPDATE.request>
) {
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<typeof Actions.USER_DELETE.request>
) {
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);
}

Loading…
Cancel
Save