diff --git a/src/entities/common/api/use-codes-cache-refresh-mutation.ts b/src/entities/common/api/use-codes-cache-refresh-mutation.ts index d9dcaa2..e791307 100644 --- a/src/entities/common/api/use-codes-cache-refresh-mutation.ts +++ b/src/entities/common/api/use-codes-cache-refresh-mutation.ts @@ -10,7 +10,7 @@ import { export const codesCacheRefresh = () => { return resultify( - axios.post(API_URL.counselList()), + axios.post(API_URL.codesCacheRefresh()), ); }; diff --git a/src/entities/common/model/constants.ts b/src/entities/common/model/constants.ts index 5330218..5b443c0 100644 --- a/src/entities/common/model/constants.ts +++ b/src/entities/common/model/constants.ts @@ -1,8 +1,8 @@ export const DEFAULT_PAGE_PARAM = { - cursor: 'string', + page: 0, size: 0, sortBy: 'string', sortOrder: 'ASC', orderBy: 'string', - limit: 0, + offset: 0 }; \ No newline at end of file diff --git a/src/entities/common/model/types.ts b/src/entities/common/model/types.ts index 94eb0c3..5242c45 100644 --- a/src/entities/common/model/types.ts +++ b/src/entities/common/model/types.ts @@ -1,3 +1,11 @@ +export interface DefaultRequestPagination { + page: number; + size: number; + sortBy: string; + sortOrder: string; + orderBy: string; + offset: number; +}; export interface DefaulResponsePagination { nextCursor: string | null; hasNext: boolean; diff --git a/src/entities/support/api/use-counsel-list-mutation.ts b/src/entities/support/api/use-counsel-list-mutation.ts deleted file mode 100644 index 00d98ee..0000000 --- a/src/entities/support/api/use-counsel-list-mutation.ts +++ /dev/null @@ -1,29 +0,0 @@ -import axios from 'axios'; -import { API_URL } from '@/shared/api/urls'; -import { resultify } from '@/shared/lib/resultify'; -import { CBDCAxiosError } from '@/shared/@types/error'; -import { - CounselListParams, - CounselListResponse -} from '../model/types'; -import { - useMutation, - UseMutationOptions -} from '@tanstack/react-query'; - -export const counselList = (params: CounselListParams) => { - return resultify( - axios.post(API_URL.counselList(), params), - ); -}; - -export const useCounselListMutation = (options?: UseMutationOptions) => { - const mutation = useMutation({ - ...options, - mutationFn: (params: CounselListParams) => counselList(params), - }); - - return { - ...mutation, - }; -}; diff --git a/src/entities/support/api/use-counsel-save-mutation.ts b/src/entities/support/api/use-counsel-save-mutation.ts deleted file mode 100644 index 4663ffd..0000000 --- a/src/entities/support/api/use-counsel-save-mutation.ts +++ /dev/null @@ -1,29 +0,0 @@ -import axios from 'axios'; -import { API_URL } from '@/shared/api/urls'; -import { resultify } from '@/shared/lib/resultify'; -import { CBDCAxiosError } from '@/shared/@types/error'; -import { - CounselSaveParams, - CounselSaveResponse -} from '../model/types'; -import { - useMutation, - UseMutationOptions -} from '@tanstack/react-query'; - -export const counselSave = (params: CounselSaveParams) => { - return resultify( - axios.post(API_URL.counselSave(), params), - ); -}; - -export const useCounselSaveMutation = (options?: UseMutationOptions) => { - const mutation = useMutation({ - ...options, - mutationFn: (params: CounselSaveParams) => counselSave(params), - }); - - return { - ...mutation, - }; -}; diff --git a/src/entities/support/api/use-qna-list-mutation.ts b/src/entities/support/api/use-qna-list-mutation.ts new file mode 100644 index 0000000..e4c9a15 --- /dev/null +++ b/src/entities/support/api/use-qna-list-mutation.ts @@ -0,0 +1,29 @@ +import axios from 'axios'; +import { API_URL } from '@/shared/api/urls'; +import { resultify } from '@/shared/lib/resultify'; +import { CBDCAxiosError } from '@/shared/@types/error'; +import { + QnaListParams, + QnaListResponse +} from '../model/types'; +import { + useMutation, + UseMutationOptions +} from '@tanstack/react-query'; + +export const qnaList = (params: QnaListParams) => { + return resultify( + axios.post(API_URL.qnaList(), params), + ); +}; + +export const useQnaListMutation = (options?: UseMutationOptions) => { + const mutation = useMutation({ + ...options, + mutationFn: (params: QnaListParams) => qnaList(params), + }); + + return { + ...mutation, + }; +}; diff --git a/src/entities/support/api/use-qna-save-mutation.ts b/src/entities/support/api/use-qna-save-mutation.ts new file mode 100644 index 0000000..bebc483 --- /dev/null +++ b/src/entities/support/api/use-qna-save-mutation.ts @@ -0,0 +1,29 @@ +import axios from 'axios'; +import { API_URL } from '@/shared/api/urls'; +import { resultify } from '@/shared/lib/resultify'; +import { CBDCAxiosError } from '@/shared/@types/error'; +import { + QnaSaveParams, + QnaSaveResponse +} from '../model/types'; +import { + useMutation, + UseMutationOptions +} from '@tanstack/react-query'; + +export const qnaSave = (params: QnaSaveParams) => { + return resultify( + axios.post(API_URL.qnaSave(), params), + ); +}; + +export const useQnaSaveMutation = (options?: UseMutationOptions) => { + const mutation = useMutation({ + ...options, + mutationFn: (params: QnaSaveParams) => qnaSave(params), + }); + + return { + ...mutation, + }; +}; diff --git a/src/entities/support/model/types.ts b/src/entities/support/model/types.ts index 3b8e723..ee9b57c 100644 --- a/src/entities/support/model/types.ts +++ b/src/entities/support/model/types.ts @@ -1,4 +1,4 @@ -import { DefaulResponsePagination } from '@/entities/common/model/types'; +import { DefaulResponsePagination, DefaultRequestPagination } from '@/entities/common/model/types'; export interface SupportParams { mid?: string; @@ -6,8 +6,9 @@ export interface SupportParams { export interface FaqListParams { category: string; searchValue: string; + page?: DefaultRequestPagination; }; -export interface FaqListItem { +export interface FaqItem { sortNo?: string; seq?: string; category?: string; @@ -16,31 +17,34 @@ export interface FaqListItem { contents?: string; }; export interface FaqListResponse extends DefaulResponsePagination { - content: Array; + content: Array; hasNext: boolean; nextCursor: string | null; }; -export interface FaqItemProps extends FaqListItem { +export interface FaqItemProps extends FaqItem { } -export interface CounselListParams extends SupportParams { - +export interface QnaListParams extends SupportParams { + page?: DefaultRequestPagination; }; -export interface CounselListItemProps { - sortNo: string; - seq: string; - statusCode: string; - statusName: string; - requestDate: string; - requestName: string; - title: string; - contents: string; - answer: string; +export interface QnaItem { + sortNo?: string; + seq?: string; + statusCode?: string; + statusName?: string; + requestDate?: string; + requestName?: string; + title?: string; + contents?: string; + answer?: string; }; -export interface CounselListResponse extends DefaulResponsePagination { - content: Array +export interface QnaListResponse extends DefaulResponsePagination { + content: Array }; -export interface CounselSaveParams extends SupportParams { +export interface QnaItemProps extends QnaItem { + +}; +export interface QnaSaveParams extends SupportParams { counselType: string; requestName: string; requestTel: string; @@ -48,6 +52,6 @@ export interface CounselSaveParams extends SupportParams { title: string; contents: string; }; -export interface CounselSaveResponse { +export interface QnaSaveResponse { }; \ No newline at end of file diff --git a/src/entities/support/ui/qna-item.tsx b/src/entities/support/ui/qna-item.tsx new file mode 100644 index 0000000..1028473 --- /dev/null +++ b/src/entities/support/ui/qna-item.tsx @@ -0,0 +1,50 @@ +import moment from 'moment'; +import { PATHS } from '@/shared/constants/paths'; +import { useNavigate } from '@/shared/lib/hooks/use-navigate'; +import { QnaItemProps } from '../model/types'; + +export const SupportQnaItem = ({ + sortNo, + seq, + statusCode, + statusName, + requestDate, + requestName, + title, + contents, + answer +}: QnaItemProps) => { + const { navigate } = useNavigate(); + + const onClickToDetail = () => { + navigate(PATHS.support.qna.detail, { + state: { + statusCode, + statusName, + requestDate, + requestName, + title, + contents, + answer + } + }); + }; + + return ( + <> +
onClickToDetail() } + > +
+
{ contents }
+
+ 등록일{ moment(requestDate).format('YYYY.MM.DD') } + 상태 [{ statusName }] +
+ +
+
+ + ); +}; \ No newline at end of file diff --git a/src/pages/support/faq/list-page.tsx b/src/pages/support/faq/list-page.tsx index 0baa2e9..fb2ad94 100644 --- a/src/pages/support/faq/list-page.tsx +++ b/src/pages/support/faq/list-page.tsx @@ -4,7 +4,7 @@ import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { HeaderType } from '@/entities/common/model/types'; import { useFaqListMutation } from '@/entities/support/api/use-faq-list-mutation'; import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constants'; -import { FaqListItem } from '@/entities/support/model/types'; +import { FaqItem } from '@/entities/support/model/types'; import { SupportFaqItem } from '@/entities/support/ui/faq-item'; import { useSetHeaderTitle, @@ -18,7 +18,7 @@ export const FaqListPage = () => { const [pageParam, setPageParam] = useState(DEFAULT_PAGE_PARAM); const [searchValue, setSearchValue] = useState(''); - const [resultList, setResultList] = useState>([]); + const [resultList, setResultList] = useState>([]); useSetHeaderTitle('자주 묻는 질문'); useSetHeaderType(HeaderType.LeftArrow); diff --git a/src/pages/support/qna/detail-page.tsx b/src/pages/support/qna/detail-page.tsx index 81f0245..853f6da 100644 --- a/src/pages/support/qna/detail-page.tsx +++ b/src/pages/support/qna/detail-page.tsx @@ -1,18 +1,91 @@ +import moment from 'moment'; +import { useEffect, useState } from 'react'; +import { PATHS } from '@/shared/constants/paths'; +import { useLocation } from 'react-router'; +import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { HeaderType } from '@/entities/common/model/types'; import { useSetHeaderTitle, useSetHeaderType, - useSetFooterMode + useSetFooterMode, + useSetOnBack } from '@/widgets/sub-layout/use-sub-layout'; export const QnaDetailPage = () => { + const { navigate } = useNavigate(); + const location = useLocation(); + + const [statusCode, setStatusCode] = useState(''); + const [statusName, setStatusName] = useState(''); + const [requestDate, setRequestDate] = useState(''); + const [requestName, setRequestName] = useState(''); + const [title, setTitle] = useState(''); + const [contents, setContents] = useState(''); + const [answer, setAnswer] = useState(''); + useSetHeaderTitle('1:1 문의'); - useSetHeaderType(HeaderType.RightClose); + useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); + useSetOnBack(() => { + navigate(PATHS.support.faq.list); + }); + + useEffect(() => { + setStatusCode(location?.state.statusCode); + setStatusName(location?.state.statusName); + setRequestDate(location?.state.requestDate); + setRequestName(location?.state.requestName); + setTitle(location?.state.title); + setContents(location?.state.contents); + setAnswer(location?.state.answer); + }, []); return ( <> - +
+
+
+
+
+
+ 제목 + 보증보험 가입 완료에 따른 한도증액 요청... +
+
+ 유형 + 한도/보증보험 문의 +
+
+ 등록일 + { moment(requestDate).format('YYYY.MM.DD') } +
+
+ 답변일 + 2025.07.31 +
+
+
+
+
문의 답변
+
{ answer }
+
+
+
문의 내용
+
+
+
제목
+
{ title }
+
+
+
내용
+
{ contents }
+
+
+
+
+
+
+
); }; \ No newline at end of file diff --git a/src/pages/support/qna/list-page.tsx b/src/pages/support/qna/list-page.tsx index d546194..ad31eca 100644 --- a/src/pages/support/qna/list-page.tsx +++ b/src/pages/support/qna/list-page.tsx @@ -1,18 +1,106 @@ +import { ChangeEvent, useEffect, useState } from 'react'; +import { PATHS } from '@/shared/constants/paths'; +import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { HeaderType } from '@/entities/common/model/types'; +import { useQnaListMutation } from '@/entities/support/api/use-qna-list-mutation'; +import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constants'; +import { QnaItem } from '@/entities/support/model/types'; +import { SupportQnaItem } from '@/entities/support/ui/qna-item'; + import { useSetHeaderTitle, useSetHeaderType, - useSetFooterMode + useSetFooterMode, + useSetOnBack } from '@/widgets/sub-layout/use-sub-layout'; export const QnaListPage = () => { + const { navigate } = useNavigate(); + + const [pageParam, setPageParam] = useState(DEFAULT_PAGE_PARAM); + const [searchValue, setSearchValue] = useState(''); + const [resultList, setResultList] = useState>([]); + useSetHeaderTitle('1:1 문의'); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(true); + useSetOnBack(() => { + navigate(PATHS.home); + }); + + const { mutateAsync: qnaList } = useQnaListMutation(); + const callList = () => { + let listParams = { + ...{page: pageParam} + }; + + qnaList(listParams).then((rs) => { + console.log(rs) + setResultList(rs.content); + }); + }; + + const getQnaList = () => { + let rs = []; + for(let i=0;i + ) + } + return rs; + }; + + const onClickToNavigation = () => { + navigate(PATHS.support.qna.register); + }; + + useEffect(() => { + callList(); + }, []); return ( <> - +
+
+
+
+
+
가맹점
+
+ +
+
+
+ +
+
+ { getQnaList() } +
+
+
+ +
+
+
+
); }; \ No newline at end of file diff --git a/src/shared/api/urls.ts b/src/shared/api/urls.ts index 691b617..6f5df09 100644 --- a/src/shared/api/urls.ts +++ b/src/shared/api/urls.ts @@ -167,11 +167,11 @@ export const API_URL = { }, /* Counsel Management - 문의상담 API */ - counselList: () => { + qnaList: () => { // POST: 1:1 문의 목록 조회 return `${API_BASE_URL}/api/v1/${API_URL_KEY}/counsel/list`; }, - counselSave: () => { + qnaSave: () => { // POST: 1:1 문의 등록 return `${API_BASE_URL}/api/v1/${API_URL_KEY}/counsel/save`; }, diff --git a/src/shared/constants/paths.ts b/src/shared/constants/paths.ts index 9aedaab..169cc0a 100644 --- a/src/shared/constants/paths.ts +++ b/src/shared/constants/paths.ts @@ -261,6 +261,10 @@ export const PATHS: RouteNamesType = { `${ROUTE_NAMES.support.base}${ROUTE_NAMES.support.qna.base}`, ROUTE_NAMES.support.qna.detail, ), + register: generatePath( + `${ROUTE_NAMES.support.base}${ROUTE_NAMES.support.qna.base}`, + ROUTE_NAMES.support.qna.register, + ), }, }, setting: generatePath(ROUTE_NAMES.setting), diff --git a/src/shared/constants/route-names.ts b/src/shared/constants/route-names.ts index d002cdc..2897d34 100644 --- a/src/shared/constants/route-names.ts +++ b/src/shared/constants/route-names.ts @@ -123,7 +123,8 @@ export const ROUTE_NAMES = { qna: { base: '/qna/*', list: 'list', - detail: 'detail/:qnaId', + detail: 'detail', + register: 'register', } }, setting: '/setting',