import { PATHS } from '@/shared/constants/paths'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { DefaultRequestPagination, HeaderType, SortTypeKeys } from '@/entities/common/model/types'; import { IMAGE_ROOT } from '@/shared/constants/common'; import { useExtensionPayoutListMutation } from '@/entities/additional-service/api/payout/use-extension-payout-list-mutation'; import { ExtensionPayoutExcelParams, ExtensionPayoutExcelResponse, ExtensionPayoutListParams, ExtensionPayoutListResponse, PayoutListItem, PayoutDisbursementStatus, PayoutSearchDateType } from '@/entities/additional-service/model/payout/types'; import { JSX, useEffect, useState } from 'react'; import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant'; import { useSetHeaderTitle, useSetHeaderType, useSetFooterMode, useSetOnBack } from '@/widgets/sub-layout/use-sub-layout'; import moment from 'moment'; import { SortTypeBox } from '@/entities/common/ui/sort-type-box'; import { useExtensionPayoutExcelMutation } from '@/entities/additional-service/api/payout/use-extension-payout-excel-mutation'; import { PayoutFilter } from '@/entities/additional-service/ui/payout/filter/payout-filter'; import { getPayoutDisbursementStatusBtnGroup } from '@/entities/additional-service/model/payout/constant'; import { ListDateGroup } from '@/entities/additional-service/ui/list-date-group'; import { useTranslation } from 'react-i18next'; import { AdditionalServiceCategory, DetailData } from '@/entities/additional-service/model/types'; import { useStore } from '@/shared/model/store'; import { DownloadBottomSheet, DownloadSelectedMode } from '@/entities/common/ui/download-bottom-sheet'; import { useExtensionAccessCheck } from '@/shared/lib/hooks/use-extension-access-check'; import useIntersectionObserver from '@/widgets/intersection-observer'; import { PayoutList } from '@/entities/additional-service/ui/payout/payout-list'; import { PayoutDetail } from '@/entities/additional-service/ui/payout/detail/payout-detail'; import { checkGrant } from '@/shared/lib/check-grant'; import { showAlert } from '@/widgets/show-alert'; import { snackBar } from '@/shared/lib'; export const PayoutListPage = () => { // Access check const { hasAccess, AccessDeniedDialog } = useExtensionAccessCheck({ extensionCode: 'PAYOUT' }); const { navigate } = useNavigate(); const { t } = useTranslation(); const userMid = useStore.getState().UserStore.mid; 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 [searchDateType, setSearchDateType] = useState(PayoutSearchDateType.REQUEST_DATE); const [fromDate, setFromDate] = useState(moment().format('YYYYMMDD')); const [toDate, setToDate] = useState(moment().format('YYYYMMDD')); const [status, setStatus] = useState(PayoutDisbursementStatus.ALL); const [minAmount, setMinAmount] = useState(); const [maxAmount, setMaxAmount] = useState(); const [downloadBottomSheetOn, setDownloadBottomSheetOn] = useState(false); const [detailOn, setDetailOn] = useState(false); const [detailMid, setDetailMid] = useState(''); const [detailTid, setDetailTid] = useState(''); const [detailDepositAmount, setDetailDepositAmount] = useState(); const { mutateAsync: extensionPayoutList } = useExtensionPayoutListMutation(); const { mutateAsync: extensionPayoutExcel } = useExtensionPayoutExcelMutation(); 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 }); useSetHeaderTitle(t('additionalService.payout.title')); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => { navigate(PATHS.home); }); const onClickToNavigation = () => { if (!checkGrant(53, 'X')) { showAlert(t('common.nopermission')); return; } navigate(PATHS.additionalService.payout.request); }; const callList = (type?: string) => { setOnActionIntersect(false); let listParams: ExtensionPayoutListParams = { mid: mid, searchDateType: searchDateType, fromDate: fromDate, toDate: toDate, status: status, minAmount: minAmount, maxAmount: maxAmount, page: { ...pageParam, ...{ sortType: sortType } } }; if (type !== 'page' && listParams.page) { listParams.page.cursor = null; } extensionPayoutList(listParams).then((rs: ExtensionPayoutListResponse) => { 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){ snackBar(e.response?.data?.error?.message); return; } }); }; const onClickToOpenDownloadBottomSheet = () => { if (!checkGrant(53, 'D')) { showAlert(t('common.nopermission')); return; } setDownloadBottomSheetOn(true); }; const onRequestDownloadExcel = ( selectedMode: DownloadSelectedMode, userEmail?: string ) => { if(selectedMode === DownloadSelectedMode.EMAIL && userEmail ){ const params: ExtensionPayoutExcelParams = { mid: mid, email: userEmail, fromDate: fromDate, toDate: toDate, }; extensionPayoutExcel(params).then((rs: ExtensionPayoutExcelResponse) => { console.log('Excel Download Status:', rs); }).catch((e: any) => { if(e.response?.data?.error?.message){ snackBar(e.response?.data?.error?.message); return; } }); } }; const setDetailData = (detailData: DetailData) => { setDetailOn(detailData.detailOn); if (detailData.mid) { setDetailMid(detailData.mid); } if (detailData.tid) { setDetailTid(detailData.tid); } if (detailData.depositAmount !== undefined) { setDetailDepositAmount(detailData.depositAmount); } }; const onClickToOpenFilter = () => { setFilterOn(!filterOn); }; const onClickToSort = (sort: SortTypeKeys) => { setSortType(sort); }; const onClickToDisbursementStatus = (val: PayoutDisbursementStatus) => { setStatus(val); }; useEffect(() => { callList(); }, [ mid, searchDateType, fromDate, toDate, status, minAmount, maxAmount, sortType ]); const getListDateGroup = () => { let rs = []; let date = ''; let list = []; for (let i = 0; i < listItems.length; i++) { let itemDateStr = ''; if (searchDateType === PayoutSearchDateType.REQUEST_DATE) { itemDateStr = listItems[i]?.requestDate || ''; } else if (searchDateType === PayoutSearchDateType.SETTLEMENT_DATE) { itemDateStr = listItems[i]?.settlementDate || ''; } let itemDate = itemDateStr.substring(0, 8); if (i === 0) { date = itemDate; } if (date !== itemDate) { if (list.length > 0) { rs.push( ); } date = itemDate; list = []; } list.push(listItems[i] as any); } if (list.length > 0) { rs.push( ); } return rs; }; if (!hasAccess) { return ; } return ( <>
{t('additionalService.payout.depositBalance')} {t('home.money', { value: new Intl.NumberFormat('en-US').format(50000000) })}
{ getPayoutDisbursementStatusBtnGroup(t).map((value: any, index: number) => ( onClickToDisbursementStatus(value.value)} >{value.name} )) }
{ !!downloadBottomSheetOn && } ); };