Merge remote-tracking branch 'origin/main'

Resolved conflicts in:
- account-holder-auth-list.tsx
- list-item.tsx
- account-holder-auth-page.tsx

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
HyeonJongKim
2025-11-04 10:33:09 +09:00
9 changed files with 177 additions and 46 deletions

View File

@@ -1,5 +1,5 @@
import { DefaulResponsePagination, DefaultRequestPagination } from "@/entities/common/model/types"; import { DefaulResponsePagination, DefaultRequestPagination } from "@/entities/common/model/types";
import { AdditionalServiceCategory, ExtensionRequestParams, FilterProps, ListItemProps } from "../types"; import { AdditionalServiceCategory, DetailData, ExtensionRequestParams, FilterProps, ListItemProps } from "../types";
// 계좌 점유 조회 관련 타입들 // 계좌 점유 조회 관련 타입들
export enum AccountHolderAuthStatus { export enum AccountHolderAuthStatus {
@@ -27,6 +27,7 @@ export interface AccountHolderAuthListProps {
additionalServiceCategory: AdditionalServiceCategory; additionalServiceCategory: AdditionalServiceCategory;
listItems: Array<AccountHolderAuthItem>; listItems: Array<AccountHolderAuthItem>;
mid: string; mid: string;
setDetailData: (detailData: DetailData) => void;
} }
export interface AccountHolderAuthFilterProps extends FilterProps { export interface AccountHolderAuthFilterProps extends FilterProps {
mid: string; mid: string;

View File

@@ -1,12 +1,11 @@
import { ListDateGroup } from '../list-date-group'; import { ListDateGroup } from '../list-date-group';
import { AdditionalServiceCategory } from '../../model/types'; import { AccountHolderAuthListProps } from '../../model/account-holder-auth/types';
import { AccountHolderAuthListProps, AccountHolderAuthItem } from '../../model/account-holder-auth/types';
import { JSX } from 'react';
export const AccountHolderAuthList = ({ export const AccountHolderAuthList = ({
additionalServiceCategory, additionalServiceCategory,
listItems, listItems,
mid mid,
setDetailData
}: AccountHolderAuthListProps) => { }: AccountHolderAuthListProps) => {
const getListDateGroup = () => { const getListDateGroup = () => {
@@ -32,6 +31,7 @@ export const AccountHolderAuthList = ({
mid={ mid } mid={ mid }
date={ date } date={ date }
items={ list } items={ list }
setDetailData={ setDetailData }
></ListDateGroup> ></ListDateGroup>
); );
} }
@@ -50,6 +50,7 @@ export const AccountHolderAuthList = ({
key={ date + '-last' } key={ date + '-last' }
date={ date } date={ date }
items={ list } items={ list }
setDetailData={ setDetailData }
></ListDateGroup> ></ListDateGroup>
) )
} }

View File

@@ -0,0 +1,126 @@
import { useEffect, useState } from 'react';
import { motion } from 'framer-motion';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { useLocation } from 'react-router';
import { useExtensionAccountHolderAuthDetailMutation } from '@/entities/additional-service/api/account-holder-auth/use-extension-account-holder-auth-deatil-mutation';
import { ExtensionAccountHolderAuthDetailParams, ExtensionAccountHolderAuthDetailResponse } from '@/entities/additional-service/model/account-holder-auth/types';
import moment from 'moment';
import { getAuthStatusText } from '@/entities/additional-service/model/account-holder-auth/constant';
import { getAuthResultStatusText } from '@/entities/additional-service/model/face-auth/constant';
import { useTranslation } from 'react-i18next';
import { DetailMotionDuration, DetailMotionStyle, DetailMotionVariants } from '@/entities/common/model/constant';
import { FullMenuClose } from '@/entities/common/ui/full-menu-close';
export interface AccountHolderAuthDetailProps {
detailOn: boolean;
setDetailOn: (detailOn: boolean) => void;
mid: string;
tid: string;
};
export const AccountHolderAuthDetail = ({
detailOn,
setDetailOn,
mid,
tid
}: AccountHolderAuthDetailProps) => {
const { t } = useTranslation();
const [detail, setDetail] = useState<ExtensionAccountHolderAuthDetailResponse>();
const { mutateAsync: accountHolderAuthDetail } = useExtensionAccountHolderAuthDetailMutation();
const callDetail = () => {
let accountHolderAuthDetailParams: ExtensionAccountHolderAuthDetailParams = {
mid: mid,
tid: tid
}
accountHolderAuthDetail(accountHolderAuthDetailParams).then((rs: ExtensionAccountHolderAuthDetailResponse) => {
setDetail(rs);
});
};
const onClickToClose = () => {
setDetailOn(false);
};
const getDate = (date?: string) => {
return (date) ? moment(date, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '';
};
useEffect(() => {
if(!!mid && !!tid){
callDetail();
}
}, [mid, tid]);
return (
<>
<motion.div
className="full-menu-modal"
initial="hidden"
animate={ (detailOn)? 'visible': 'hidden' }
variants={ DetailMotionVariants }
transition={ DetailMotionDuration }
style={ DetailMotionStyle }
>
<div className="full-menu-container pdw-16">
<div className="full-menu-header">
<div className="full-menu-title center">{ t('additionalService.accountHolderAuth.detailTitle') }</div>
<div className="full-menu-actions">
<FullMenuClose
addClass="full-menu-close"
onClickToCallback={ onClickToClose }
></FullMenuClose>
</div>
</div>
<div className="tab-pane sub active">
<div className="pay-top">
<div className="num-amount">
<span className="amount">{detail?.accountName}</span>
</div>
<span className="num-store">{detail?.accountNo}</span>
<div className="num-day">{getDate(detail?.requestDate)}</div>
</div>
<div className="detail-divider"></div>
<div className="pay-detail">
<div className="detail-title">{t('transaction.sections.detailInfo')}</div>
<ul className="kv-list">
<li className="kv-row">
<span className="k">{t('transaction.fields.companyName')}</span>
<span className="v">{detail?.companyName}</span>
</li>
<li className="kv-row">
<span className="k">{t('transaction.fields.mid')}</span>
<span className="v">{detail?.mid}</span>
</li>
<li className="kv-row">
<span className="k">{t('additionalService.accountHolderAuth.requestDate')}</span>
<span className="v">{getDate(detail?.requestDate)}</span>
</li>
<li className="kv-row">
<span className="k">{t('transaction.fields.bank')}</span>
<span className="v">{detail?.bankName}</span>
</li>
<li className="kv-row">
<span className="k">{t('transaction.fields.accountNo')}</span>
<span className="v">{detail?.accountNo}</span>
</li>
<li className="kv-row">
<span className="k">{t('transaction.fields.accountHolder')}</span>
<span className="v">{detail?.accountName}</span>
</li>
<li className="kv-row">
<span className="k">{t('common.result')}</span>
<span className="v">{getAuthStatusText(t)(detail?.authStatus)}</span>
</li>
<li className="kv-row">
<span className="k">{t('transaction.fields.failureReason')}</span>
<span className="v">{detail?.failReason ? getAuthResultStatusText(t)(detail?.failReason) : '-' }</span>
</li>
</ul>
</div>
</div>
</div>
</motion.div>
</>
);
}

View File

@@ -1,7 +1,6 @@
import moment from 'moment'; import moment from 'moment';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { useNavigate } from '@/shared/lib/hooks/use-navigate';
import { ExtensionAccountHolderSearchDetailParams, ExtensionAccountHolderSearchDetailResponse } from '@/entities/additional-service/model/account-holder-search/types'; import { ExtensionAccountHolderSearchDetailParams, ExtensionAccountHolderSearchDetailResponse } from '@/entities/additional-service/model/account-holder-search/types';
import { useExtensionAccountHolderSearchDetailtMutation } from '@/entities/additional-service/api/account-holder-search/use-extension-account-holder-search-detail-mutation'; import { useExtensionAccountHolderSearchDetailtMutation } from '@/entities/additional-service/api/account-holder-search/use-extension-account-holder-search-detail-mutation';
import { getAccountHolderStatusText } from '@/entities/additional-service/model/account-holder-search/constant'; import { getAccountHolderStatusText } from '@/entities/additional-service/model/account-holder-search/constant';

View File

@@ -161,13 +161,13 @@ export const ListItem = ({
} }
//이하 상세페이지 존재 //이하 상세페이지 존재
else if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderAuth) { else if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderAuth) {
navigate(PATHS.additionalService.accountHolderAuth.detail, { if(setDetailData && !!mid && !!tid){
state: { setDetailData({
additionalServiceCategory: additionalServiceCategory,
mid: mid, mid: mid,
tid: tid tid: tid,
detailOn: true
});
} }
})
} }
else if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch) { else if (additionalServiceCategory === AdditionalServiceCategory.AccountHolderSearch) {
if (setDetailData && !!mid && !!tid) { if (setDetailData && !!mid && !!tid) {
@@ -177,7 +177,6 @@ export const ListItem = ({
detailOn: true detailOn: true
}); });
} }
} }
else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentHistory) { else if (additionalServiceCategory === AdditionalServiceCategory.LinkPaymentHistory) {
navigate(PATHS.additionalService.linkPayment.detail, { navigate(PATHS.additionalService.linkPayment.detail, {

View File

@@ -20,11 +20,12 @@ import { useTranslation } from 'react-i18next';
import { useExtensionAccountHolderAuthDownloadExcelMutation } from '@/entities/additional-service/api/account-holder-auth/use-extension-account-holder-auth-download-excel-mutation'; import { useExtensionAccountHolderAuthDownloadExcelMutation } from '@/entities/additional-service/api/account-holder-auth/use-extension-account-holder-auth-download-excel-mutation';
import { AccountHolderAuthFilter } from '@/entities/additional-service/ui/account-holder-auth/filter/account-holder-auth-filter'; import { AccountHolderAuthFilter } from '@/entities/additional-service/ui/account-holder-auth/filter/account-holder-auth-filter';
import { useStore } from '@/shared/model/store'; import { useStore } from '@/shared/model/store';
import { AccountHolderAuthListItem, AccountHolderAuthStatus, AccountHolderAuthItem, ExtensionAccountHolderAuthDownloadExcelParams, ExtensionAccountHolderAuthDownloadExcelResponse } from '@/entities/additional-service/model/account-holder-auth/types'; import { AccountHolderAuthStatus, AccountHolderAuthItem, ExtensionAccountHolderAuthDownloadExcelParams, ExtensionAccountHolderAuthDownloadExcelResponse } from '@/entities/additional-service/model/account-holder-auth/types';
import { AdditionalServiceCategory } from '@/entities/additional-service/model/types'; import { AdditionalServiceCategory, DetailData } from '@/entities/additional-service/model/types';
import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet'; import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet';
import { useExtensionAccessCheck } from '@/shared/lib/hooks/use-extension-access-check'; import { useExtensionAccessCheck } from '@/shared/lib/hooks/use-extension-access-check';
import useIntersectionObserver from '@/widgets/intersection-observer'; import useIntersectionObserver from '@/widgets/intersection-observer';
import { AccountHolderAuthDetail } from '@/entities/additional-service/ui/account-holder-auth/detail/account-holder-auth-detail';
export const AccountHolderAuthPage = () => { export const AccountHolderAuthPage = () => {
const { navigate } = useNavigate(); const { navigate } = useNavigate();
@@ -46,7 +47,11 @@ export const AccountHolderAuthPage = () => {
const [fromDate, setFromDate] = useState(moment().format('YYYYMMDD')); const [fromDate, setFromDate] = useState(moment().format('YYYYMMDD'));
const [toDate, setToDate] = useState(moment().format('YYYYMMDD')); const [toDate, setToDate] = useState(moment().format('YYYYMMDD'));
const [authStatus, setAuthStatus] = useState<AccountHolderAuthStatus>(AccountHolderAuthStatus.ALL) const [authStatus, setAuthStatus] = useState<AccountHolderAuthStatus>(AccountHolderAuthStatus.ALL)
const [detailOn, setDetailOn] = useState<boolean>(false);
const [detailMid, setDetailMid] = useState<string>('');
const [detailTid, setDetailTid] = useState<string>('');
const [emailBottomSheetOn, setEmailBottomSheetOn] = useState<boolean>(false); const [emailBottomSheetOn, setEmailBottomSheetOn] = useState<boolean>(false);
useSetHeaderTitle(t('additionalService.accountHolderAuth.title')); useSetHeaderTitle(t('additionalService.accountHolderAuth.title'));
useSetHeaderType(HeaderType.LeftArrow); useSetHeaderType(HeaderType.LeftArrow);
useSetFooterMode(false); useSetFooterMode(false);
@@ -132,6 +137,15 @@ export const AccountHolderAuthPage = () => {
const onClickToAuthStatus = (val: AccountHolderAuthStatus) => { const onClickToAuthStatus = (val: AccountHolderAuthStatus) => {
setAuthStatus(val); setAuthStatus(val);
}; };
const setDetailData = (detailData: DetailData) => {
setDetailOn(detailData.detailOn);
if(detailData.mid){
setDetailMid(detailData.mid);
}
if(detailData.tid){
setDetailTid(detailData.tid);
}
}
const onClickToOpenEmailBottomSheet = () => { const onClickToOpenEmailBottomSheet = () => {
@@ -233,6 +247,7 @@ export const AccountHolderAuthPage = () => {
additionalServiceCategory={ AdditionalServiceCategory.AccountHolderAuth } additionalServiceCategory={ AdditionalServiceCategory.AccountHolderAuth }
listItems={ listItems } listItems={ listItems }
mid={ mid } mid={ mid }
setDetailData={ setDetailData }
></AccountHolderAuthList> ></AccountHolderAuthList>
<div ref={ setTarget }></div> <div ref={ setTarget }></div>
</div> </div>
@@ -249,16 +264,20 @@ export const AccountHolderAuthPage = () => {
setStartDate={setFromDate} setStartDate={setFromDate}
setEndDate={setToDate} setEndDate={setToDate}
setAuthStatus={setAuthStatus} setAuthStatus={setAuthStatus}
> ></AccountHolderAuthFilter>
</AccountHolderAuthFilter> <AccountHolderAuthDetail
detailOn={ detailOn }
setDetailOn={ setDetailOn }
mid={ detailMid }
tid={ detailTid }
></AccountHolderAuthDetail>
<EmailBottomSheet <EmailBottomSheet
bottomSheetOn={emailBottomSheetOn} bottomSheetOn={emailBottomSheetOn}
setBottomSheetOn={setEmailBottomSheetOn} setBottomSheetOn={setEmailBottomSheetOn}
imageSave={false} imageSave={false}
sendEmail={true} sendEmail={true}
sendRequest={onSendRequest} sendRequest={onSendRequest}
/> ></EmailBottomSheet>
</> </>
); );
}; };

View File

@@ -36,8 +36,6 @@ import { LinkPaymentWaitDetailPage } from './link-payment/link-payment-wait-deta
import { KeyInPaymentRequestPage } from './key-in-payment/requeset-page'; import { KeyInPaymentRequestPage } from './key-in-payment/requeset-page';
import { KeyInPaymentRequestSuccessPage } from './key-in-payment/request-success-page'; import { KeyInPaymentRequestSuccessPage } from './key-in-payment/request-success-page';
import { AccountHolderSearchRequestPage } from './account-holder-search/request-page'; import { AccountHolderSearchRequestPage } from './account-holder-search/request-page';
import { AccountHolderSearchDetailPage } from './account-holder-search/detail-page';
import { AccountHolderAuthDetailPage } from './account-holder-auth/detail-page';
import { LinkPaymentSeparateApprovalPage } from './link-payment/separate-approval/link-payment-separate-approval-page'; import { LinkPaymentSeparateApprovalPage } from './link-payment/separate-approval/link-payment-separate-approval-page';
import { FaceAuthPage } from './face-auth/face-auth-page'; import { FaceAuthPage } from './face-auth/face-auth-page';
@@ -58,12 +56,10 @@ export const AdditionalServicePages = () => {
<Route path={ROUTE_NAMES.additionalService.smsPaymentNotification} element={<SmsPaymentPage />} /> <Route path={ROUTE_NAMES.additionalService.smsPaymentNotification} element={<SmsPaymentPage />} />
<Route path={ROUTE_NAMES.additionalService.accountHolderSearch.base}> <Route path={ROUTE_NAMES.additionalService.accountHolderSearch.base}>
<Route path={ROUTE_NAMES.additionalService.accountHolderSearch.list} element={<AccountHolderSearchPage />} /> <Route path={ROUTE_NAMES.additionalService.accountHolderSearch.list} element={<AccountHolderSearchPage />} />
<Route path={ROUTE_NAMES.additionalService.accountHolderSearch.detail} element={<AccountHolderSearchDetailPage />} />
<Route path={ROUTE_NAMES.additionalService.accountHolderSearch.request} element={<AccountHolderSearchRequestPage />} /> <Route path={ROUTE_NAMES.additionalService.accountHolderSearch.request} element={<AccountHolderSearchRequestPage />} />
</Route> </Route>
<Route path={ROUTE_NAMES.additionalService.accountHolderAuth.base}> <Route path={ROUTE_NAMES.additionalService.accountHolderAuth.base}>
<Route path={ROUTE_NAMES.additionalService.accountHolderAuth.list} element={<AccountHolderAuthPage/>} /> <Route path={ROUTE_NAMES.additionalService.accountHolderAuth.list} element={<AccountHolderAuthPage/>} />
<Route path={ROUTE_NAMES.additionalService.accountHolderAuth.detail} element={<AccountHolderAuthDetailPage/>} />
</Route> </Route>
<Route path={ROUTE_NAMES.additionalService.linkPayment.base}> <Route path={ROUTE_NAMES.additionalService.linkPayment.base}>
<Route path={ROUTE_NAMES.additionalService.linkPayment.shippingHistory} element={<LinkPaymentHistoryPage />} /> <Route path={ROUTE_NAMES.additionalService.linkPayment.shippingHistory} element={<LinkPaymentHistoryPage />} />

View File

@@ -156,10 +156,6 @@ export const PATHS: RouteNamesType = {
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.accountHolderSearch.base}`, `${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.accountHolderSearch.base}`,
ROUTE_NAMES.additionalService.accountHolderSearch.list ROUTE_NAMES.additionalService.accountHolderSearch.list
), ),
detail: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.accountHolderSearch.base}`,
ROUTE_NAMES.additionalService.accountHolderSearch.detail
),
request: generatePath( request: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.accountHolderSearch.base}`, `${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.accountHolderSearch.base}`,
ROUTE_NAMES.additionalService.accountHolderSearch.request, ROUTE_NAMES.additionalService.accountHolderSearch.request,
@@ -171,10 +167,6 @@ export const PATHS: RouteNamesType = {
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.accountHolderAuth.base}`, `${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.accountHolderAuth.base}`,
ROUTE_NAMES.additionalService.accountHolderAuth.list ROUTE_NAMES.additionalService.accountHolderAuth.list
), ),
detail: generatePath(
`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.accountHolderAuth.base}`,
ROUTE_NAMES.additionalService.accountHolderAuth.detail
),
}, },
linkPayment: { linkPayment: {
base: generatePath(`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.linkPayment.base}`), base: generatePath(`${ROUTE_NAMES.additionalService.base}${ROUTE_NAMES.additionalService.linkPayment.base}`),

View File

@@ -78,13 +78,11 @@ export const ROUTE_NAMES = {
accountHolderSearch: { accountHolderSearch: {
base: '/account-holder-search/*', base: '/account-holder-search/*',
list: 'list', list: 'list',
detail: 'detail',
request: 'request' request: 'request'
}, },
accountHolderAuth: { accountHolderAuth: {
base: '/account-holder-auth/*', base: '/account-holder-auth/*',
list: 'list', list: 'list',
detail: 'detail'
}, },
linkPayment: { linkPayment: {
base: '/link-payment/*', base: '/link-payment/*',