import moment from 'moment'; import { DefaultRequestPagination, SortTypeKeys } from '@/entities/common/model/types'; import { IMAGE_ROOT } from '@/shared/constants/common'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { JSX, useEffect, useState } from 'react'; import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant'; import { ListDateGroup } from '../list-date-group'; import { AdditionalServiceCategory } from '../../model/types'; import { ExtensionFundAccountResultExcelParams, ExtensionFundAccountResultExcelResponse, ExtensionFundAccountResultListParams, ExtensionFundAccountResultListResponse, ExtensionFundAccountResultSummaryParams, ExtensionFundAccountResultSummaryResponse, FundAccountResultContent, FundAccountResultContentItem, FundAccountResultStatus, FundAccountSearchCl, FundAccountSearchDateType, FundAccountStatus } from '../../model/fund-account/types'; import { useExtensionFundAccountResultSummaryMutation } from '../../api/fund-account/use-extension-fund-account-result-summary-mutation'; import { useExtensionFundAccountResultExcelMutation } from '../../api/fund-account/use-extension-fund-account-result-excel-mutation'; import { useExtensionFundAccountResultListMutation } from '../../api/fund-account/use-extension-fund-account-result-list-mutation'; import { PATHS } from '@/shared/constants/paths'; import { NumericFormat } from 'react-number-format'; import { SortTypeBox } from '@/entities/common/ui/sort-type-box'; import { FundAccountResultStatusBtnGroup, FundAccountStatusBtnGroup } from '../../model/fund-account/constant'; import { FundAccountResultFilter } from '../filter/fund-account-result-filter'; import { useStore } from '@/shared/model/store'; import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet'; import useIntersectionObserver from '@/widgets/intersection-observer'; export const FundAccountResultListWrap = () => { const { navigate } = useNavigate(); 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 [searchCl, setSearchCl] = useState(FundAccountSearchCl.ACCOUNT_NAME); const [searchValue, setSearchValue] = useState(''); const [searchDateType, setSearchDateType] = useState(FundAccountSearchDateType.REQUEST_DATE) const [fromDate, setFromDate] = useState(moment().format('YYYYMMDD')); const [toDate, setToDate] = useState(moment().format('YYYYMMDD')); const [bankCode, setBankCode] = useState(''); const [resultStatus, setResultStatus] = useState(FundAccountResultStatus.ALL); const [emailBottomSheetOn, setEmailBottomSheetOn] = useState(false); const [totalRequestCount, setTotalRequestCount] = useState(0); const [totalRequestAmount, setTotalRequestAmount] = useState(0); const [totalSuccessCount, setTotalSuccessCount] = useState(0); const [totalSuccessAmount, setTotalSuccessAmount] = useState(0); const [totalFailCount, setTotalFailCount] = useState(0); const [totalFailAmount, setTotalFailAmount] = useState(0); const { mutateAsync: extensionFundAccountResultList } = useExtensionFundAccountResultListMutation(); const { mutateAsync: extensionFundAccountResultExcel } = useExtensionFundAccountResultExcelMutation(); const { mutateAsync: extensionFundAccountResultSummary } = useExtensionFundAccountResultSummaryMutation(); const onIntersect: IntersectionObserverCallback = (entries: Array) => { entries.forEach((entry: IntersectionObserverEntry) => { if(entry.isIntersecting){ console.log('Element is now intersecting with the root. [' + onActionIntersect + ']'); if(onActionIntersect && !!pageParam.cursor){ callList('page'); } } else{ console.log('Element is no longer intersecting with the root.'); } }); }; const { setTarget } = useIntersectionObserver({ threshold: 1, onIntersect }); const callList = (type?: string) => { setOnActionIntersect(false); let listParams: ExtensionFundAccountResultListParams = { mid: mid, searchCl: searchCl, searchValue: searchValue, searchDateType: searchDateType, fromDate: fromDate, toDate: toDate, bankCode: bankCode, resultStatus: resultStatus, page: { ...pageParam, ...{ sortType: sortType } } }; if(type !== 'page' && listParams.page){ listParams.page.cursor = null; } extensionFundAccountResultList(listParams).then((rs: any) => { if(type === 'page'){ setListItems([ ...listItems, ...rs.content ]); } else{ setListItems(rs.content); } if(rs.hasNext){ setPageParam({ ...pageParam, ...{ cursor: rs.nextCursor } }); setOnActionIntersect(true); } else{ setPageParam({ ...pageParam, ...{ cursor: null } }); } }); }; const callSummary = () => { let params: ExtensionFundAccountResultSummaryParams = { mid: mid }; extensionFundAccountResultSummary(params).then((rs: ExtensionFundAccountResultSummaryResponse) => { setTotalRequestCount(rs.totalRequestCount); setTotalRequestAmount(rs.totalRequestAmount); setTotalSuccessCount(rs.totalSuccessCount); setTotalSuccessAmount(rs.totalSuccessAmount); setTotalFailCount(rs.totalFailCount); setTotalFailAmount(rs.totalFailAmount); }); }; const onClickToOpenEmailBottomSheet = () => { setEmailBottomSheetOn(true); }; const onSendRequest = (selectedEmail?: string) => { if (selectedEmail) { let params: ExtensionFundAccountResultExcelParams = { mid: mid, email: selectedEmail, searchDateType: searchDateType, fromDate: fromDate, toDate: toDate, }; extensionFundAccountResultExcel(params).then((rs: ExtensionFundAccountResultExcelResponse) => { console.log('Excel Download Status:', rs); }); } setEmailBottomSheetOn(false); }; const onClickToOpenFilter = () => { setFilterOn(!filterOn); }; const onClickToSort = (sort: SortTypeKeys) => { setSortType(sort); }; const onClickToStatus = (val: FundAccountResultStatus) => { setResultStatus(val); }; const getListDateGroup = () => { let rs = []; let date = ''; let list = []; for (let i = 0; i < listItems.length; i++) { let items = listItems[i]; if (!!items) { let requestDate = items?.requestDate; requestDate = requestDate?.substring(0, 8); if (!!requestDate) { if (i === 0) { date = requestDate; } if (date !== requestDate) { if (list.length > 0) { rs.push( ); } date = requestDate; list = []; } list.push(items); } } } if (list.length > 0) { rs.push( ); } return rs; }; useEffect(() => { callSummary(); }, []); useEffect(() => { callList(); }, [ mid, searchCl, searchValue, searchDateType, fromDate, toDate, bankCode, resultStatus, sortType ]); const onClickToNavigate = () => { navigate(PATHS.additionalService.fundAccount.transferRequest); }; return ( <>
  • 요청 원 ( 건)
  • 성공 원 ( 건)
  • 실패 원 ( 건)
{ FundAccountResultStatusBtnGroup.map((value, index) => ( onClickToStatus(value.value)} >{value.name} )) }
{ getListDateGroup() }
); };