import moment from 'moment'; import { useStore } from '@/shared/model/store'; import { ChangeEvent, useEffect, useState } from 'react'; import { IMAGE_ROOT } from '@/shared/constants/common'; import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { AllTransactionList } from '@/entities/transaction/ui/all-transaction-list'; import { TransactionCategory, AllTransactionSearchCl, AllTransactionListParams, ListItemProps, AllTransactionListSummaryParams, AllTransactionListResponse, 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'; import { useDownloadExcelMutation } from '@/entities/transaction/api/use-download-excel-mutation'; import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant'; import { AllTransactionFilter } from '@/entities/transaction/ui/filter/all-transaction-filter'; import { SortTypeBox } from '@/entities/common/ui/sort-type-box'; import { SortTypeKeys, HeaderType, DefaultRequestPagination } from '@/entities/common/model/types'; import { useSetOnBack, useSetHeaderTitle, useSetHeaderType, useSetFooterMode } from '@/widgets/sub-layout/use-sub-layout'; 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'; import { showAlert } from '@/widgets/show-alert'; import { snackBar } from '@/shared/lib'; import { checkGrant } from '@/shared/lib/check-grant'; /* 거래내역조회 31 */ const menuId = 31; export const AllTransactionListPage = () => { const { navigate } = useNavigate(); const { t, i18n } = useTranslation(); const userMid = useStore.getState().UserStore.mid; const [serviceCodeOptions, setServiceCodeOptions] = useState>>(); const [onActionIntersect, setOnActionIntersect] = useState(false); const [sortType, setSortType] = useState(SortTypeKeys.LATEST); const [listItems, setListItems] = useState>([]); const [filterOn, setFilterOn] = useState(false); const [pageParam, setPageParam] = useState(DEFAULT_PAGE_PARAM); const [mid, setMid] = useState(userMid); const [moid, setMoid] = useState(''); const [tid, setTid] = useState(''); const [dateCl, setDateCl] = useState(''); const [goodsName, setGoodsName] = useState(''); const [fromDate, setFromDate] = useState(moment().format('YYYYMMDD')); const [toDate, setToDate] = useState(moment().format('YYYYMMDD')); const [statusCode, setStatusCode] = useState(''); const [serviceCode, setServiceCode] = useState('01'); const [minAmount, setMinAmount] = useState(); const [maxAmount, setMaxAmount] = useState(); const [cardCode, setCardCode] = useState(); const [bankCode, setBankCode] = useState(); const [searchCl, setSearchCl] = useState(); const [searchValue, setSearchValue] = useState(); const [totalCount, setTotalCount] = useState(0); const [totalAmount, setTotalAmount] = useState(0); const [emailBottomSheetOn, setEmailBottomSheetOn] = useState(false); const [detailOn, setDetailOn] = useState(false); const [detailTid, setDetailTid] = useState(''); const [detailServiceCode, setDetailServiceCode] = useState(''); useSetHeaderTitle(t('transaction.listTitle')); useSetHeaderType(HeaderType.LeftArrow); useSetOnBack(() => { navigate(PATHS.home); }); useSetFooterMode(false); const { mutateAsync: allTransactionList } = useAllTransactionListMutation(); const { mutateAsync: allTransactionListSummary } = useAllTransactionListSummaryMutation(); const { mutateAsync: downloadExcel } = useDownloadExcelMutation(); const onIntersect: IntersectionObserverCallback = (entries: Array) => { entries.forEach((entry: IntersectionObserverEntry) => { if(entry.isIntersecting){ if(onActionIntersect && !!pageParam.cursor){ setOnActionIntersect(false); callList('page'); } } }); }; const { setTarget } = useIntersectionObserver({ threshold: 1, onIntersect }); const callList = (type?: string) => { setOnActionIntersect(false); let listSummaryParams: AllTransactionListSummaryParams = { mid: mid, moid: moid, tid: tid, fromDate: fromDate, toDate: toDate, statusCode: statusCode, serviceCode: serviceCode, minAmount: minAmount, maxAmount: maxAmount, dateCl: dateCl, goodsName: goodsName, cardCode: cardCode, bankCode: bankCode, searchCl: searchCl, searchValue: searchValue, sortType: sortType }; let listParams: AllTransactionListParams = { ...listSummaryParams, ...{ page: { ...pageParam, ...{ sortType: sortType } } } }; if(type !== 'page' && listParams.page){ listParams.page.cursor = null; } allTransactionList(listParams).then((rs: AllTransactionListResponse) => { if(type === 'page'){ setListItems([ ...listItems, ...rs.content ]); } else{ setListItems(rs.content); } if(rs.hasNext && rs.nextCursor !== pageParam.cursor && rs.content.length === DEFAULT_PAGE_PARAM.size ){ setPageParam({ ...pageParam, ...{ cursor: rs.nextCursor } }); } else{ setPageParam({ ...pageParam, ...{ cursor: null } }); } setOnActionIntersect( !!rs.hasNext && rs.nextCursor !== pageParam.cursor && rs.content.length === DEFAULT_PAGE_PARAM.size ); }).catch((e: any) => { if(e.response?.data?.error?.message){ showAlert(e.response?.data?.error?.message); return; } }); allTransactionListSummary(listSummaryParams).then((rs: AllTransactionListSummaryResponse) => { setTotalAmount(rs.totalAmount); setTotalCount(rs.totalCount); }).catch((e: any) => { if(e.response?.data?.error?.message){ showAlert(e.response?.data?.error?.message); return; } }); }; const onClickToOpenFilter = () => { setFilterOn(!filterOn); }; const onClickToDownloadExcel = () => { if(checkGrant(menuId, 'D')){ setEmailBottomSheetOn(true); } else{ showAlert(t('common.nopermission')); } }; const onRequestDownloadExcel = (userEmail?: string) => { }; const onClickToSort = (sort: SortTypeKeys) => { setSortType(sort); }; const callServiceCodeOptions = () => { let serviceCodes = useStore.getState().CommonStore.serviceCodes; setServiceCodeOptions(serviceCodes); setServiceCode(serviceCodes[0].value); }; const onChangeServiceCode = (e: ChangeEvent) => { let val = e.target.value; // onchagne 에서 useState가 즉시 반영 안되므로 값을 직접 바로 넘긴다. setServiceCode(val); }; const getServiceCodeOptions = () => { let rs = []; if(!!serviceCodeOptions && serviceCodeOptions.length > 0) for(let i=0;i{ localizedName } ) } 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 ''; const nameMap: Record = { '전체': t('transaction.constants.all'), '신용카드': t('transaction.constants.creditCard'), '계좌이체': t('transaction.constants.accountTransfer'), '가상계좌': t('transaction.constants.virtualAccount'), '휴대폰': t('transaction.constants.mobilePayment'), '문화상품권': t('transaction.constants.cultureLand'), '(구)SSG머니': t('transaction.constants.ssgMoney'), 'SSG은행계좌결제': t('transaction.constants.ssgBank'), '계좌간편결제': t('transaction.constants.accountSimpleTransfer'), '티머니페이': t('transaction.constants.tmoneyPay'), }; return nameMap[name] || name; }; useEffect(() => { callServiceCodeOptions(); }, []); useEffect(() => { callList(); }, [ mid, moid, tid, sortType, fromDate, toDate, statusCode, serviceCode, minAmount, maxAmount, bankCode, cardCode, searchCl, searchValue ]); return ( <>
{t('transaction.searchAmount')}
{t('home.money', { value: new Intl.NumberFormat('en-US').format(totalAmount || 0) })}
{t('transaction.searchDate')} { moment(fromDate).format('YYYY.MM.DD') } ~ { moment(toDate).format('YYYY.MM.DD') }
{t('transaction.transactionCount')} {t('transaction.total')} {t('home.count', { value: new Intl.NumberFormat('en-US').format(totalCount || 0) })}
{ !!emailBottomSheetOn && } ); };