import moment from 'moment'; import { PATHS } from '@/shared/constants/paths'; import { useEffect, useState } from 'react'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { IMAGE_ROOT } from '@/shared/constants/common'; import { DefaultRequestPagination, HeaderType } from '@/entities/common/model/types'; import { AccountHolderSearchFilter } from '@/entities/additional-service/ui/account-holder-search/filter/account-holder-search-filter'; import { DetailData, ProcessResult } from '@/entities/additional-service/model/types'; import { useSetHeaderTitle, useSetHeaderType, useSetFooterMode, useSetOnBack } from '@/widgets/sub-layout/use-sub-layout'; import { useExtensionAccountHolderSearchListMutation } from '@/entities/additional-service/api/account-holder-search/use-extension-account-holder-search-list-mutation'; import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant'; import { useExtensionAccountHolderSearchDownloadExcelMutation } from '@/entities/additional-service/api/account-holder-search/use-extension-account-holder-search-download-excel-mutation'; import { SortTypeBox } from '@/entities/common/ui/sort-type-box'; import { SortTypeKeys } from '@/entities/common/model/types'; import { AccountHolderSearchList } from '@/entities/additional-service/ui/account-holder-search/account-holder-search-list'; import { useStore } from '@/shared/model/store'; import { AccountHolderSearchListItem, AccountHolderSearchCl, AccountHolderResultStatus } from '@/entities/additional-service/model/account-holder-search/types'; import { getResultStatusBtnGroup } from '@/entities/additional-service/model/account-holder-search/constant'; import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet'; import { useTranslation } from 'react-i18next'; import { useExtensionAccessCheck } from '@/shared/lib/hooks/use-extension-access-check'; import useIntersectionObserver from '@/widgets/intersection-observer'; import { snackBar } from '@/shared/lib'; import { AccountHolderSearchDetail } from '@/entities/additional-service/ui/account-holder-search/detail/account-holder-search-detail'; export const AccountHolderSearchPage = () => { const { navigate } = useNavigate(); const { t } = useTranslation(); const userMid = useStore.getState().UserStore.mid; // 권한 체크 const { hasAccess, AccessDeniedDialog } = useExtensionAccessCheck({ extensionCode: 'SEARCH_ACCOUNT_NAME' }); const [onActionIntersect, setOnActionIntersect] = useState(false); const [sortType, setSortType] = useState(SortTypeKeys.LATEST); const [listItems, setListItems] = useState>([]); const [pageParam, setPageParam] = useState(DEFAULT_PAGE_PARAM); const [filterOn, setFilterOn] = useState(false); const [mid, setMid] = useState(userMid); const [searchCl, setSearchCl] = useState(AccountHolderSearchCl.ACCOUNT_NAME) const [searchValue, setSearchValue] = useState(''); const [startDate, setStartDate] = useState(moment().format('YYYYMMDD')); const [endDate, setEndDate] = useState(moment().format('YYYYMMDD')); const [bank, setBank] = useState(''); const [resultStatus, setResultStatus] = useState(AccountHolderResultStatus.ALL); const [emailBottomSheetOn, setEmailBottomSheetOn] = useState(false); const [detailOn, setDetailOn] = useState(false); const [detailMid, setDetailMid] = useState(''); const [detailTid, setDetailTid] = useState(''); useSetHeaderTitle(t('additionalService.services.accountHolderSearch')); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => { navigate(PATHS.home); }); const { mutateAsync: accountHolderSearchList } = useExtensionAccountHolderSearchListMutation(); const { mutateAsync: downloadExcel } = useExtensionAccountHolderSearchDownloadExcelMutation(); 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 listParams = { mid: mid, searchCl: searchCl, searchValue: searchValue, fromDate: startDate, toDate: endDate, bankCode: bank, resultStatus: resultStatus, page: { ...pageParam, ...{ sortType: sortType } } } if (type !== 'page' && listParams.page) { listParams.page.cursor = null; } accountHolderSearchList(listParams).then((rs) => { 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 ); }); } const onClickToOpenFilter = () => { setFilterOn(!filterOn); }; const onClickToOpenEmailBottomSheet = () => { setEmailBottomSheetOn(true); }; const onSendRequest = (selectedEmail?: string) => { if (selectedEmail) { downloadExcel({ mid: mid, email: selectedEmail, searchCl: searchCl, searchValue: searchValue, fromDate: startDate, toDate: endDate, bankCode: bank, resultStatus: resultStatus }).then((rs) => { if (rs.status) { setTimeout(() => { snackBar("다운로드가 완료되었습니다."); }, 2000); } else { snackBar("다운로드에 실패했습니다.") } }); } setEmailBottomSheetOn(false); }; const onClickToSort = (sort: SortTypeKeys) => { setSortType(sort); }; const onClickToTransactionStatus = (val: AccountHolderResultStatus) => { setResultStatus(val); }; const setDetailData = (detailData: DetailData) => { setDetailOn(detailData.detailOn); if(detailData.mid){ setDetailMid(detailData.mid); } if(detailData.tid){ setDetailTid(detailData.tid); } } useEffect(() => { callList(); }, [ mid, searchCl, searchValue, startDate, endDate, bank, resultStatus, sortType ]); // if (!hasAccess) { // return ; // } return ( <>
{ getResultStatusBtnGroup(t).map((value: any, index: number) => ( onClickToTransactionStatus(value.value)} >{value.name} )) }
); };