From cab65b19bc2acde7b67b45b651970c62ae2031bd Mon Sep 17 00:00:00 2001 From: "focp212@naver.com" Date: Tue, 4 Nov 2025 09:28:42 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A0=95=EC=82=B0=EB=82=B4=EC=97=AD=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/entities/settlement/model/types.ts | 8 + .../settlement/ui/detail/list-detail.tsx | 0 .../ui/detail/settlement-detail.tsx | 192 ++++++++++++++++++ .../settlement/ui/list-date-group.tsx | 4 +- src/entities/settlement/ui/list-item.tsx | 30 +-- src/entities/settlement/ui/list-wrap.tsx | 29 ++- src/pages/settlement/list/list-page.tsx | 1 - src/pages/settlement/settlement-pages.tsx | 2 - src/shared/constants/paths.ts | 1 - src/shared/constants/route-names.ts | 1 - 10 files changed, 246 insertions(+), 22 deletions(-) delete mode 100644 src/entities/settlement/ui/detail/list-detail.tsx create mode 100644 src/entities/settlement/ui/detail/settlement-detail.tsx diff --git a/src/entities/settlement/model/types.ts b/src/entities/settlement/model/types.ts index 41f0c5b..e773f96 100644 --- a/src/entities/settlement/model/types.ts +++ b/src/entities/settlement/model/types.ts @@ -186,9 +186,17 @@ export interface ListDateGroupProps { date?: string; periodType: SettlementPeriodType; items?: Array + setDetailData?: (detailData: DetailData) => void; +}; + +export interface DetailData { + settlementId?: string; + tid?: string; + detailOn: boolean; }; export interface ListItemProps extends SettlementsHistoryContent, SettlementsTransactionListContent { periodType: SettlementPeriodType; + setDetailData?: (detailData: DetailData) => void; }; export interface AmountInfoWrapProps { diff --git a/src/entities/settlement/ui/detail/list-detail.tsx b/src/entities/settlement/ui/detail/list-detail.tsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/entities/settlement/ui/detail/settlement-detail.tsx b/src/entities/settlement/ui/detail/settlement-detail.tsx new file mode 100644 index 0000000..8369499 --- /dev/null +++ b/src/entities/settlement/ui/detail/settlement-detail.tsx @@ -0,0 +1,192 @@ +import { useEffect, useState } from 'react'; +import { motion } from 'framer-motion'; +import { AmountInfoWrap } from '@/entities/settlement/ui/info-wrap/amount-info-wrap'; +import { SettlementInfoWrap } from '@/entities/settlement/ui/info-wrap/settlement-info-wrap'; +import { TransactionInfoWrap } from '@/entities/settlement/ui/info-wrap/transaction-info-wrap' +import { + AmountInfo, + InfoWrapKeys, + SettlementInfo, + SettlementPeriodType, + SettlementsHistoryDetailParams, + SettlementsHistoryDetailResponse, + SettlementsTransactionDetailParams, + SettlementsTransactionDetailResponse, + TransactionInfo +} from '@/entities/settlement/model/types'; +import { useSettlementsHistoryDetailMutation } from '@/entities/settlement/api/use-settlements-history-detail-mutation'; +import { useSettlementsTransactionDetailMutation } from '@/entities/settlement/api/use-settlements-transaction-detail-mutation'; +import { NumericFormat } from 'react-number-format'; +import moment from 'moment'; +import { useTranslation } from 'react-i18next'; +import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; +import { DetailMotionDuration, DetailMotionStyle, DetailMotionVariants } from '@/entities/common/model/constant'; + +export interface SettlementDetailProps { + detailOn: boolean; + setDetailOn: (detailOn: boolean) => void; + periodType: SettlementPeriodType; + settlementId?: string; + tid?: string; +}; + +export const SettlementDetail = ({ + detailOn, + setDetailOn, + periodType, + settlementId, + tid +}: SettlementDetailProps) => { + const { t, i18n } = useTranslation(); + + const [amountInfo, setAmountInfo] = useState(); + const [settlementInfo, setSettlementInfo] = useState(); + const [settlementAmount, setSettlementAmount] = useState(); + const [settlementDate, setSettlementDate] = useState(); + const [transactionInfo, setTransactionInfo] = useState(); + const [transactionAmount, setTransactionAmount] = useState(); + const [merchantName, setMerchantName] = useState(); + + const [showSettlement, setShowSettlement] = useState(false); + const [showTransaction, setShowTransaction] = useState(false); + + const { mutateAsync: settlementsHistoryDetail } = useSettlementsHistoryDetailMutation(); + const { mutateAsync: settlementsTransactionDetail } = useSettlementsTransactionDetailMutation(); + + const callSettlementDetail = () => { + if(settlementId){ + let params: SettlementsHistoryDetailParams = { + settlementId: settlementId + }; + + settlementsHistoryDetail(params).then((rs: SettlementsHistoryDetailResponse) => { + setAmountInfo(rs.amountInfo); + setSettlementInfo(rs.settlementInfo); + setSettlementAmount(rs.settlementAmount); + setSettlementDate(rs.settlementDate); + }); + } + }; + + const callTransactionDetail = () => { + if(tid){ + let params: SettlementsTransactionDetailParams = { + tid: tid + }; + + settlementsTransactionDetail(params).then((rs: SettlementsTransactionDetailResponse) => { + setAmountInfo(rs.amountInfo); + setTransactionInfo(rs.transactionInfo); + setTransactionAmount(rs.transactionAmount); + setMerchantName(rs.merchantName); + }); + } + }; + + const onClickToShowInfo = (infoWrapKey: InfoWrapKeys) => { + if(infoWrapKey === InfoWrapKeys.Settlement){ + setShowSettlement(!showSettlement); + } + else if(infoWrapKey === InfoWrapKeys.Transaction){ + setShowTransaction(!showTransaction); + } + }; + + const onClickToClose = () => { + setDetailOn(false); + }; + + useEffect(() => { + if(periodType === SettlementPeriodType.SETTLEMENT_DATE && settlementId){ + callSettlementDetail(); + } + else if(periodType === SettlementPeriodType.TRANSACTION_DATE && tid){ + callTransactionDetail(); + } + }, [periodType, settlementId, tid]); + + return ( + <> + +
+
+
{ t('settlement.detailTitle') }
+
+ +
+
+
+
+
+ { (periodType === SettlementPeriodType.SETTLEMENT_DATE) && +
+
+
+ {i18n.language === 'en' && {t('home.currencySymbol')}} + + {i18n.language !== 'en' && {t('home.currencyWon')}} +
+
+
{ moment(settlementDate).format('YYYY.MM.DD') }
+
+ } + { (periodType === SettlementPeriodType.TRANSACTION_DATE) && +
+
+
+ {i18n.language === 'en' && {t('home.currencySymbol')}} + + {i18n.language !== 'en' && {t('home.currencyWon')}} +
+
+
{ merchantName }
+
+ } +
+ + +
+ { (periodType === SettlementPeriodType.SETTLEMENT_DATE) && + onClickToShowInfo(infoWrapKey) } + > + } + { (periodType === SettlementPeriodType.TRANSACTION_DATE) && + onClickToShowInfo(infoWrapKey) } + > + } +
+
+
+
+
+ + ); +}; \ No newline at end of file diff --git a/src/entities/settlement/ui/list-date-group.tsx b/src/entities/settlement/ui/list-date-group.tsx index 72115bd..55a9161 100644 --- a/src/entities/settlement/ui/list-date-group.tsx +++ b/src/entities/settlement/ui/list-date-group.tsx @@ -8,7 +8,8 @@ import { useTranslation } from 'react-i18next'; export const ListDateGroup = ({ date, periodType, - items + items, + setDetailData }: ListDateGroupProps) => { const { i18n } = useTranslation(); @@ -38,6 +39,7 @@ export const ListDateGroup = ({ approvalNumber={ items[i]?.approvalNumber } approvalDate={ items[i]?.approvalDate } transactionAmount={ items[i]?.transactionAmount } + setDetailData={ setDetailData } > ) } diff --git a/src/entities/settlement/ui/list-item.tsx b/src/entities/settlement/ui/list-item.tsx index e7e934f..518f6a2 100644 --- a/src/entities/settlement/ui/list-item.tsx +++ b/src/entities/settlement/ui/list-item.tsx @@ -15,27 +15,28 @@ export const ListItem = ({ settlementAmount, approvalNumber, approvalDate, - transactionAmount + transactionAmount, + setDetailData }: ListItemProps) => { - const { navigate } = useNavigate(); - const { t, i18n } = useTranslation(); + const { t } = useTranslation(); const onClickToNavigate = () => { let detailId; if(periodType === SettlementPeriodType.SETTLEMENT_DATE){ - detailId = settlementId; + if(setDetailData && settlementId){ + setDetailData({ + settlementId: settlementId, + detailOn: true + }); + } } else if(periodType === SettlementPeriodType.TRANSACTION_DATE){ - detailId = approvalNumber; - } - - navigate(PATHS.settlement.detail + detailId, { - state: { - periodType: periodType, - settlementId: settlementId, - approvalNumber: approvalNumber, - tid: tid, + if(setDetailData && tid){ + setDetailData({ + tid: tid, + detailOn: true + }); } - }); + } }; const getDotClass = () => { @@ -46,7 +47,6 @@ export const ListItem = ({ else if(periodType === SettlementPeriodType.TRANSACTION_DATE && transactionAmount){ if(transactionAmount > 0) rs = 'blue'; } - return rs; }; diff --git a/src/entities/settlement/ui/list-wrap.tsx b/src/entities/settlement/ui/list-wrap.tsx index bdf22cc..3ad7843 100644 --- a/src/entities/settlement/ui/list-wrap.tsx +++ b/src/entities/settlement/ui/list-wrap.tsx @@ -27,13 +27,15 @@ import { SettlementsHistoryResponse, SettlementsHistorySummaryParams, SettlementsHistorySummaryResponse, - SettlementsTransactionSummaryParams + SettlementsTransactionSummaryParams, + DetailData } from '../model/types'; import { DefaultRequestPagination, SortTypeKeys } from '@/entities/common/model/types'; import { useStore } from '@/shared/model/store'; import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet'; import useIntersectionObserver from '@/widgets/intersection-observer'; import { useTranslation } from 'react-i18next'; +import { SettlementDetail } from './detail/settlement-detail'; export interface ListWrapProps { startDateFromCalendar?: string; @@ -74,6 +76,10 @@ export const ListWrap = ({ const [preSettlementCancelOffset, setPreSettlementCancelOffset] = useState(); const [isOpenSummary, setIsOpenSummary] = useState(false); + const [detailOn, setDetailOn] = useState(false); + const [detailSettlementId, setDetailSettlementId] = useState(''); + const [detailTid, setDetailTid] = useState(''); + const [emailBottomSheetOn, setEmailBottomSheetOn] = useState(false); const { mutateAsync: settlementsHistory } = useSettlementsHistoryMutation(); @@ -241,6 +247,16 @@ export const ListWrap = ({ setPeriodType(val); } }; + + const setDetailData = (detailData: DetailData) => { + setDetailOn(detailData.detailOn); + if(detailData.settlementId){ + setDetailSettlementId(detailData.settlementId); + } + if(detailData.tid){ + setDetailTid(detailData.tid); + } + }; const getSettlementDateListDateGroup = () => { let rs = []; @@ -265,6 +281,7 @@ export const ListWrap = ({ periodType={ periodType } date={ date } items={ list } + setDetailData={ setDetailData } > ); } @@ -282,6 +299,7 @@ export const ListWrap = ({ periodType={ periodType } date={ date } items={ list } + setDetailData={ setDetailData } > ); } @@ -311,6 +329,7 @@ export const ListWrap = ({ periodType={ periodType } date={ date } items={ list } + setDetailData={ setDetailData } > ); } @@ -329,6 +348,7 @@ export const ListWrap = ({ periodType={ periodType } date={ date } items={ list } + setDetailData={ setDetailData } > ); } @@ -477,6 +497,13 @@ export const ListWrap = ({ setEndDate={ setEndDate } setPaymentMethod={ setPaymentMethod } > + { !!emailBottomSheetOn && { return ( @@ -11,7 +10,6 @@ export const SettlementPages = () => { } /> } /> - } /> ); diff --git a/src/shared/constants/paths.ts b/src/shared/constants/paths.ts index 9f8c79a..68921ad 100644 --- a/src/shared/constants/paths.ts +++ b/src/shared/constants/paths.ts @@ -59,7 +59,6 @@ export const PATHS: RouteNamesType = { base: generatePath(ROUTE_NAMES.settlement.base), calendar: generatePath(ROUTE_NAMES.settlement.base, ROUTE_NAMES.settlement.calendar), list: generatePath(ROUTE_NAMES.settlement.base, ROUTE_NAMES.settlement.list), - detail: generatePath(ROUTE_NAMES.settlement.base, ROUTE_NAMES.settlement.detail), }, merchant: { base: generatePath(ROUTE_NAMES.merchant.base), diff --git a/src/shared/constants/route-names.ts b/src/shared/constants/route-names.ts index f3c53a9..720c442 100644 --- a/src/shared/constants/route-names.ts +++ b/src/shared/constants/route-names.ts @@ -26,7 +26,6 @@ export const ROUTE_NAMES = { base: '/settlement/*', calendar: 'calendar', list: 'list', - detail: 'detail/:detailId', }, merchant: { base: '/merchant/*',