상세 수정

This commit is contained in:
focp212@naver.com
2025-11-03 20:57:55 +09:00
parent 344e5c324a
commit d2b477e7bd
38 changed files with 1569 additions and 256 deletions

View File

@@ -5,7 +5,7 @@ import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { DefaultRequestPagination, HeaderType } from '@/entities/common/model/types';
import { useFaqListMutation } from '@/entities/support/api/use-faq-list-mutation';
import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant';
import { FaqItem, FaqListParams, FaqListResponse, SearchCl } from '@/entities/support/model/types';
import { DetailData, FaqItem, FaqListParams, FaqListResponse, SearchCl } from '@/entities/support/model/types';
import { SupportFaqItem } from '@/entities/support/ui/faq-item';
import {
useSetHeaderTitle,
@@ -14,6 +14,7 @@ import {
useSetOnBack
} from '@/widgets/sub-layout/use-sub-layout';
import useIntersectionObserver from '@/widgets/intersection-observer';
import { FaqDetail } from '@/entities/support/ui/detail/faq-detail';
export const FaqListPage = () => {
const { navigate } = useNavigate();
@@ -24,6 +25,8 @@ export const FaqListPage = () => {
const [searchValue, setSearchValue] = useState<string>('');
const [selectedCategory, setSelectedCategory] = useState<string>('');
const [resultList, setResultList] = useState<Array<FaqItem>>([]);
const [detailOn, setDetailOn] = useState<boolean>(false);
const [detailFaqItem, setDetailFaqItem] = useState<FaqItem>({});
useSetHeaderTitle(t('support.faq.title'));
useSetHeaderType(HeaderType.LeftArrow);
@@ -103,19 +106,26 @@ export const FaqListPage = () => {
callList();
};
const setDetailData = (detailData: DetailData) => {
setDetailOn(detailData.detailOn);
if(detailData?.faqItem){
setDetailFaqItem(detailData?.faqItem);
}
};
const getFaqList = () => {
let rs = [];
for(let i=0;i<resultList.length;i++){
rs.push(
<SupportFaqItem
key={ `key-support-faq-item-${i}` }
cursorId={ resultList[i]?.cursorId }
seq={ resultList[i]?.seq }
category={ resultList[i]?.category }
title={ resultList[i]?.title }
contents={ resultList[i]?.contents }
></SupportFaqItem>
)
let faqItem = resultList[i];
if(faqItem){
rs.push(
<SupportFaqItem
key={ `key-support-faq-item-${i}` }
faqItem={ faqItem }
setDetailData={ setDetailData }
></SupportFaqItem>
);
}
}
return rs;
};
@@ -175,15 +185,20 @@ export const FaqListPage = () => {
</div>
<div ref={ setTarget }></div>
</div>
<div className="apply-row">
<button
className="btn-50 btn-blue flex-1"
onClick={ () => onClickToNavigation() }
>{t('support.faq.inquiryButton')}</button>
</div>
</div>
</div>
<div className="apply-row">
<button
className="btn-50 btn-blue flex-1"
onClick={ () => onClickToNavigation() }
>{t('support.faq.inquiryButton')}</button>
</div>
</main>
<FaqDetail
detailOn={ detailOn }
setDetailOn={ setDetailOn }
faqItem={ detailFaqItem }
></FaqDetail>
</>
);
};

View File

@@ -4,7 +4,7 @@ import { PATHS } from '@/shared/constants/paths';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { useNoticeListMutation } from '@/entities/support/api/use-notice-list-mutation';
import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant';
import { InformCl, NoticeItem, NoticeListParams, NoticeListResponse, SearchCl } from '@/entities/support/model/types';
import { DetailData, InformCl, NoticeItem, NoticeListParams, NoticeListResponse, SearchCl } from '@/entities/support/model/types';
import { SupportNoticeItem } from '@/entities/support/ui/notice-item';
import { DefaultRequestPagination, HeaderType } from '@/entities/common/model/types';
import {
@@ -14,6 +14,7 @@ import {
useSetOnBack
} from '@/widgets/sub-layout/use-sub-layout';
import useIntersectionObserver from '@/widgets/intersection-observer';
import { NoticeDetail } from '@/entities/support/ui/detail/notice-detail';
export const NoticeListPage = () => {
const { navigate } = useNavigate();
@@ -24,6 +25,8 @@ export const NoticeListPage = () => {
const [informCl, setInformCl] = useState<InformCl | string>('');
const [searchKeyword, setSearchKeyword] = useState<string>('');
const [resultList, setResultList] = useState<Array<NoticeItem>>([]);
const [detailOn, setDetailOn] = useState<boolean>(false);
const [detailSeq, setDetailSeq] = useState<number>(0);
useSetHeaderTitle(t('support.notice.title'));
useSetHeaderType(HeaderType.LeftArrow);
@@ -102,19 +105,27 @@ export const NoticeListPage = () => {
}
callList();
};
const setDetailData = (detailData: DetailData) => {
setDetailOn(detailData.detailOn);
if(detailData?.seq){
setDetailSeq(detailData?.seq);
}
};
const getNoticeList = () => {
let rs = [];
for(let i=0;i<resultList.length;i++){
rs.push(
<SupportNoticeItem
key={ `key-support-notice-item-${i}` }
seq={ resultList[i]?.seq }
title={ resultList[i]?.title }
informCl={ resultList[i]?.informCl }
regDt={ resultList[i]?.regDt }
></SupportNoticeItem>
)
let noticeItem = resultList[i];
if(noticeItem){
rs.push(
<SupportNoticeItem
key={ `key-support-notice-item-${i}` }
noticeItem={ noticeItem }
setDetailData={ setDetailData }
></SupportNoticeItem>
);
}
}
return rs;
};
@@ -173,6 +184,11 @@ export const NoticeListPage = () => {
</div>
</div>
</div>
<NoticeDetail
detailOn={ detailOn }
setDetailOn={ setDetailOn }
seq={ detailSeq }
></NoticeDetail>
</main>
</>
);

View File

@@ -6,7 +6,7 @@ import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { DefaultRequestPagination, HeaderType } from '@/entities/common/model/types';
import { useQnaListMutation } from '@/entities/support/api/use-qna-list-mutation';
import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant';
import { QnaItem, QnaListParams, QnaListResponse } from '@/entities/support/model/types';
import { DetailData, QnaItem, QnaListParams, QnaListResponse } from '@/entities/support/model/types';
import { SupportQnaItem } from '@/entities/support/ui/qna-item';
import useIntersectionObserver from '@/widgets/intersection-observer';
import {
@@ -15,6 +15,7 @@ import {
useSetFooterMode,
useSetOnBack
} from '@/widgets/sub-layout/use-sub-layout';
import { QnaDetail } from '@/entities/support/ui/detail/qna-detail';
export const QnaListPage = () => {
const { navigate } = useNavigate();
@@ -31,6 +32,8 @@ export const QnaListPage = () => {
const [pageParam, setPageParam] = useState<DefaultRequestPagination>(DEFAULT_PAGE_PARAM);
const [statusCode, setStatusCode] = useState<string>(''); // 02, 03
const [resultList, setResultList] = useState<Array<QnaItem>>([]);
const [detailOn, setDetailOn] = useState<boolean>(false);
const [detailQnaItem, setDetailQnaItem] = useState<QnaItem>({});
useSetHeaderTitle(t('support.qna.title'));
useSetHeaderType(HeaderType.LeftArrow);
@@ -102,27 +105,27 @@ export const QnaListPage = () => {
);
});
};
const setDetailData = (detailData: DetailData) => {
setDetailOn(detailData.detailOn);
if(detailData?.qnaItem){
setDetailQnaItem(detailData?.qnaItem);
}
};
const getQnaList = () => {
let rs = [];
for(let i=0;i<resultList.length;i++){
rs.push(
<SupportQnaItem
key={ `key-support-faq-item-${i}` }
answer={ resultList[i]?.answer }
answerDate={ resultList[i]?.answerDate }
contents={ resultList[i]?.contents }
corpName={ resultList[i]?.corpName }
cursorId={ resultList[i]?.cursorId }
requestDate={ resultList[i]?.requestDate }
requestName={ resultList[i]?.requestName }
requestType={ resultList[i]?.requestType }
sendEmail={ resultList[i]?.sendEmail }
seq={ resultList[i]?.seq }
statusCode={ resultList[i]?.statusCode }
title={ resultList[i]?.title }
></SupportQnaItem>
);
let qnaItem = resultList[i];
if(qnaItem){
rs.push(
<SupportQnaItem
key={ `key-support-faq-item-${i}` }
qnaItem={ qnaItem }
setDetailData={ setDetailData }
></SupportQnaItem>
);
}
}
return rs;
};
@@ -176,16 +179,20 @@ export const QnaListPage = () => {
</div>
<div ref={ setTarget }></div>
</div>
<div className="apply-row">
<button
className="btn-50 btn-blue flex-1"
onClick={ () => onClickToNavigation() }
>{t('support.qna.inquiryButton')}</button>
</div>
</div>
</div>
<div className="apply-row">
<button
className="btn-50 btn-blue flex-1"
onClick={ () => onClickToNavigation() }
>{t('support.qna.inquiryButton')}</button>
</div>
</main>
<QnaDetail
detailOn={ detailOn }
setDetailOn={ setDetailOn }
qnaItem={ detailQnaItem }
></QnaDetail>
</>
);
};

View File

@@ -13,7 +13,8 @@ import {
ListItemProps,
AllTransactionListSummaryParams,
AllTransactionListResponse,
AllTransactionListSummaryResponse
AllTransactionListSummaryResponse,
DetailData
} from '@/entities/transaction/model/types';
import { useAllTransactionListMutation } from '@/entities/transaction/api/use-all-transaction-list-mutation';
import { useAllTransactionListSummaryMutation } from '@/entities/transaction/api/use-all-transaction-list-summary-mutation';
@@ -31,6 +32,7 @@ import {
import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet';
import useIntersectionObserver from '@/widgets/intersection-observer';
import { useTranslation } from 'react-i18next';
import { AllTransactionDetail } from '@/entities/transaction/ui/detail/all-transaction-detail';
export const AllTransactionListPage = () => {
const { navigate } = useNavigate();
@@ -65,6 +67,10 @@ export const AllTransactionListPage = () => {
const [totalAmount, setTotalAmount] = useState<number>(0);
const [emailBottomSheetOn, setEmailBottomSheetOn] = useState<boolean>(false);
const [detailOn, setDetailOn] = useState<boolean>(false);
const [detailTid, setDetailTid] = useState<string>('');
const [detailServiceCode, setDetailServiceCode] = useState<string>('');
useSetHeaderTitle(t('transaction.listTitle'));
useSetHeaderType(HeaderType.LeftArrow);
@@ -209,6 +215,14 @@ export const AllTransactionListPage = () => {
return rs;
};
const setDetailData = (detailData: DetailData) => {
setDetailOn(detailData.detailOn);
setDetailTid(detailData.tid);
if(detailData?.serviceCode){
setDetailServiceCode(detailData?.serviceCode);
}
};
const getLocalizedServiceCodeName = (name?: string): string => {
if (!name) return '';
@@ -307,6 +321,7 @@ export const AllTransactionListPage = () => {
<AllTransactionList
listItems={ listItems }
transactionCategory={ TransactionCategory.AllTransaction }
setDetailData={ setDetailData }
></AllTransactionList>
<div ref={ setTarget }></div>
</div>
@@ -341,7 +356,12 @@ export const AllTransactionListPage = () => {
setSearchValue={ setSearchValue }
serviceCodeOptions={ serviceCodeOptions }
></AllTransactionFilter>
<AllTransactionDetail
detailOn={ detailOn }
setDetailOn={ setDetailOn }
tid={ detailTid }
serviceCode={ detailServiceCode }
></AllTransactionDetail>
{ !!emailBottomSheetOn &&
<EmailBottomSheet
bottomSheetOn={ emailBottomSheetOn }

View File

@@ -14,7 +14,8 @@ import {
BillingSearchType,
ListItemProps,
BillingListParams,
BillingListResponse
BillingListResponse,
DetailData
} from '@/entities/transaction/model/types';
import { useBillingListMutation } from '@/entities/transaction/api/use-billing-list-mutation';
import { useDownloadExcelMutation } from '@/entities/transaction/api/use-download-excel-mutation';
@@ -31,6 +32,7 @@ import {
} from '@/widgets/sub-layout/use-sub-layout';
import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet';
import useIntersectionObserver from '@/widgets/intersection-observer';
import { BillingDetail } from '@/entities/transaction/ui/detail/billing-detail';
export const BillingListPage = () => {
const { navigate } = useNavigate();
@@ -55,6 +57,8 @@ export const BillingListPage = () => {
const [maxAmount, setMaxAmount] = useState<number>();
const [downloadBottomSheetOn, setDownloadBottomSheetOn] = useState<boolean>(false);
const [detailOn, setDetailOn] = useState<boolean>(false);
const [detailTid, setDetailTid] = useState<string>('');
useSetHeaderTitle(t('billing.title'));
useSetHeaderType(HeaderType.LeftArrow);
@@ -149,10 +153,17 @@ export const BillingListPage = () => {
const onClickToRequestStatus = (val: BillingRequestStatus) => {
setRequestStatus(val);
};
const onClickToNavigate = () => {
navigate(PATHS.transaction.billing.charge);
};
const onRequestDownload = (userEmail?: string) => {
};
const setDetailData = (detailData: DetailData) => {
setDetailOn(detailData.detailOn);
setDetailTid(detailData.tid);
};
useEffect(() => {
callList();
@@ -217,11 +228,18 @@ export const BillingListPage = () => {
<BillingList
listItems={ listItems }
transactionCategory={ TransactionCategory.Billing }
setDetailData={ setDetailData }
></BillingList>
<div ref={ setTarget }></div>
</div>
</div>
</main>
<div className="apply-row">
<button
className="btn-50 btn-blue flex-1"
onClick={ () => onClickToNavigate() }
>{ t('transaction.list.paymentRequest') }</button>
</div>
<BillingFilter
filterOn={ filterOn }
setFilterOn={ setFilterOn }
@@ -246,6 +264,11 @@ export const BillingListPage = () => {
setMinAmount={ setMinAmount }
setMaxAmount={ setMaxAmount }
></BillingFilter>
<BillingDetail
detailOn={ detailOn }
setDetailOn={ setDetailOn }
tid={ detailTid }
></BillingDetail>
{ !!downloadBottomSheetOn &&
<EmailBottomSheet
bottomSheetOn={ downloadBottomSheetOn }

View File

@@ -16,7 +16,8 @@ import {
CashReceiptSearchNumberType,
CashReceiptSummaryParams,
CashReceiptListResponse,
CashReceiptSummaryResponse
CashReceiptSummaryResponse,
DetailData
} from '@/entities/transaction/model/types';
import { useCashReceiptListMutation } from '@/entities/transaction/api/use-cash-receipt-list-mutation';
import { useDownloadExcelMutation } from '@/entities/transaction/api/use-download-excel-mutation';
@@ -35,6 +36,7 @@ import { useStore } from '@/shared/model/store';
import { useCashReceiptSummaryMutation } from '@/entities/transaction/api/use-cash-receipt-summary-mutation';
import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet';
import useIntersectionObserver from '@/widgets/intersection-observer';
import { CashReceiptDetail } from '@/entities/transaction/ui/detail/cash-receit-detail';
export const CashReceiptListPage = () => {
const { navigate } = useNavigate();
@@ -62,12 +64,16 @@ export const CashReceiptListPage = () => {
const [emailBottomSheetOn, setEmailBottomSheetOn] = useState<boolean>(false);
const [detailOn, setDetailOn] = useState<boolean>(false);
const [detailTid, setDetailTid] = useState<string>('');
const [detailServiceCode, setDetailServiceCode] = useState<string>('');
useSetHeaderTitle(t('cashReceipt.title'));
useSetHeaderType(HeaderType.LeftArrow);
useSetOnBack(() => {
navigate(PATHS.home);
});
useSetFooterMode(false);
useSetFooterMode(false);
const { mutateAsync: cashReceiptList } = useCashReceiptListMutation();
const { mutateAsync: cashReceiptSummary } = useCashReceiptSummaryMutation();
@@ -157,6 +163,14 @@ export const CashReceiptListPage = () => {
setEmailBottomSheetOn(true);
};
const setDetailData = (detailData: DetailData) => {
setDetailOn(detailData.detailOn);
setDetailTid(detailData.tid);
if(detailData?.serviceCode){
setDetailServiceCode(detailData?.serviceCode);
}
};
const onClickToOpenFilter = () => {
setFilterOn(!filterOn);
};
@@ -175,6 +189,9 @@ export const CashReceiptListPage = () => {
const onClickToTransactionType = (val: CashReceiptTransactionType) => {
setTransactionType(val);
};
const onClickToNavigate = () => {
navigate(PATHS.transaction.cashReceipt.handWrittenIssuance);
};
useEffect(() => {
callList();
@@ -271,11 +288,18 @@ export const CashReceiptListPage = () => {
<CashReceiptList
listItems={ listItems }
transactionCategory={ TransactionCategory.CashReceipt }
setDetailData={ setDetailData }
></CashReceiptList>
<div ref={ setTarget }></div>
</div>
</div>
</main>
<div className="apply-row">
<button
className="btn-50 btn-blue flex-1"
onClick={ () => onClickToNavigate() }
>{ t('transaction.list.manualIssuance') }</button>
</div>
<CashReceiptFilter
filterOn={ filterOn }
setFilterOn={ setFilterOn }
@@ -296,6 +320,11 @@ export const CashReceiptListPage = () => {
setSearchNumberType={ setSearchNumberType }
setSearchNumber={ setSearchNumber }
></CashReceiptFilter>
<CashReceiptDetail
detailOn={ detailOn }
setDetailOn={ setDetailOn }
tid={ detailTid }
></CashReceiptDetail>
{ !!emailBottomSheetOn &&
<EmailBottomSheet
bottomSheetOn={ emailBottomSheetOn }

View File

@@ -13,7 +13,8 @@ import {
EscrowSettlementStatus,
ListItemProps,
EscrowListParams,
EscrowListResponse
EscrowListResponse,
DetailData
} from '@/entities/transaction/model/types';
import { useEscrowListMutation } from '@/entities/transaction/api/use-escrow-list-mutation';
import { useDownloadExcelMutation } from '@/entities/transaction/api/use-download-excel-mutation';
@@ -30,6 +31,7 @@ import {
} from '@/widgets/sub-layout/use-sub-layout';
import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet';
import useIntersectionObserver from '@/widgets/intersection-observer';
import { EscrowDetail } from '@/entities/transaction/ui/detail/escrow-detail';
export const EscrowListPage = () => {
const { navigate } = useNavigate();
@@ -54,6 +56,10 @@ export const EscrowListPage = () => {
const [maxAmount, setMaxAmount] = useState<number>();
const [emailBottomSheetOn, setEmailBottomSheetOn] = useState<boolean>(false);
const [detailOn, setDetailOn] = useState<boolean>(false);
const [detailTid, setDetailTid] = useState<string>('');
const [detailServiceCode, setDetailServiceCode] = useState<string>('');
useSetHeaderTitle(t('escrow.title'));
useSetHeaderType(HeaderType.LeftArrow);
@@ -150,6 +156,15 @@ export const EscrowListPage = () => {
});
*/
};
const setDetailData = (detailData: DetailData) => {
setDetailOn(detailData.detailOn);
setDetailTid(detailData.tid);
if(detailData?.serviceCode){
setDetailServiceCode(detailData?.serviceCode);
}
};
const onClickToSort = (sort: SortTypeKeys) => {
setSortType(sort);
};
@@ -221,6 +236,7 @@ export const EscrowListPage = () => {
<EscrowList
listItems={ listItems }
transactionCategory={ TransactionCategory.Escrow }
setDetailData={ setDetailData }
></EscrowList>
<div ref={ setTarget }></div>
</div>
@@ -248,6 +264,12 @@ export const EscrowListPage = () => {
setMinAmount={ setMinAmount }
setMaxAmount={ setMaxAmount }
></EscrowFilter>
<EscrowDetail
detailOn={ detailOn }
setDetailOn={ setDetailOn }
tid={ detailTid }
serviceCode={ detailServiceCode }
></EscrowDetail>
{ !!emailBottomSheetOn &&
<EmailBottomSheet
bottomSheetOn={ emailBottomSheetOn }

View File

@@ -2,39 +2,30 @@ import { Route } from 'react-router-dom';
import { SentryRoutes } from '@/shared/configs/sentry';
import { ROUTE_NAMES } from '@/shared/constants/route-names';
import { AllTransactionListPage } from './all-transaction/list-page';
import { AllTransactionDetailPage } from './all-transaction/detail-page';
import { AllTransactionCancelPage } from './all-transaction/cancel-page';
import { CashReceiptListPage } from './cash-receipt/list-page';
import { CashReceiptDetailPage } from './cash-receipt/detail-page';
import { CashReceitHandWrittenIssuancePage } from './cash-receipt/hand-written-issuance-page';
import { EscrowListPage } from './escrow/list-page';
import { EscrowDetailPage } from './escrow/detail-page';
import { BillingListPage } from './billing/list-page';
import { BillingDetailPage } from './billing/detail-page';
import { BillingChargePage } from './billing/charge-page';
export const TransactionPages = () => {
return (
<>
<SentryRoutes>
<Route path={ROUTE_NAMES.transaction.allTransaction.base}>
<Route path={ROUTE_NAMES.transaction.allTransaction.list} element={<AllTransactionListPage />} />
<Route path={ROUTE_NAMES.transaction.allTransaction.detail} element={<AllTransactionDetailPage />} />
<Route path={ROUTE_NAMES.transaction.allTransaction.cancel} element={<AllTransactionCancelPage />} />
</Route>
<Route path={ROUTE_NAMES.transaction.cashReceipt.base}>
<Route path={ROUTE_NAMES.transaction.cashReceipt.list} element={<CashReceiptListPage />} />
<Route path={ROUTE_NAMES.transaction.cashReceipt.detail} element={<CashReceiptDetailPage />} />
<Route path={ROUTE_NAMES.transaction.cashReceipt.handWrittenIssuance} element={<CashReceitHandWrittenIssuancePage />} />
</Route>
<Route path={ROUTE_NAMES.transaction.escrow.base}>
<Route path={ROUTE_NAMES.transaction.escrow.list} element={<EscrowListPage />} />
<Route path={ROUTE_NAMES.transaction.escrow.detail} element={<EscrowDetailPage />} />
</Route>
<Route path={ROUTE_NAMES.transaction.billing.base}>
<Route path={ROUTE_NAMES.transaction.billing.list} element={<BillingListPage />} />
<Route path={ROUTE_NAMES.transaction.billing.detail} element={<BillingDetailPage />} />
<Route path={ROUTE_NAMES.transaction.billing.charge} element={<BillingChargePage />} />
</Route>
</SentryRoutes>