diff --git a/.env.local.server b/.env.local.server index e33bf7f..9d5f5ed 100644 --- a/.env.local.server +++ b/.env.local.server @@ -1,7 +1,7 @@ VITE_APP_ENV=development -# VITE_APP_AUTH_PROXY_HOST='http://3.35.79.250:8090' -# VITE_APP_API_PROXY_HOST='http://3.35.79.250:8080' -VITE_APP_AUTH_PROXY_HOST='https://auth.nicepay.co.kr' -VITE_APP_API_PROXY_HOST='https://rest.nicepay.co.kr' + VITE_APP_AUTH_PROXY_HOST='http://3.35.79.250:8090' + VITE_APP_API_PROXY_HOST='http://3.35.79.250:8080' +# VITE_APP_AUTH_PROXY_HOST='https://auth.nicepay.co.kr' +#VITE_APP_API_PROXY_HOST='https://rest.nicepay.co.kr' GENERATE_SOURCEMAP=false SENTRY_AUTH_TOKEN=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 \ No newline at end of file diff --git a/src/entities/additional-service/model/alimtalk/types.ts b/src/entities/additional-service/model/alimtalk/types.ts index c065831..b9de7da 100644 --- a/src/entities/additional-service/model/alimtalk/types.ts +++ b/src/entities/additional-service/model/alimtalk/types.ts @@ -46,7 +46,16 @@ export interface ExtensionAlimtalkSettingSaveParams { sendUserInfo?: SendUserInfo; }; -export interface ExtensionAlimtalkSettingSaveResponse {}; +export interface ExtensionAlimtalkSettingSaveResponse { + status: boolean; + error?: { + root?: string; + errKey?: string; + code?: string; + message?: string; + timestamp?: string; + }; +}; export interface ExtensionAlimtalkSettingDetailParams { mid: string; diff --git a/src/entities/additional-service/model/link-pay/types.ts b/src/entities/additional-service/model/link-pay/types.ts index 0b4da9d..acb6921 100644 --- a/src/entities/additional-service/model/link-pay/types.ts +++ b/src/entities/additional-service/model/link-pay/types.ts @@ -332,7 +332,19 @@ export interface ExtensionLinkPayWaitDeleteParams extends ExtensionRequestParams } export interface ExtensionLinkPayWaitDeleteRespone { - status: boolean + status: boolean; + error?: { + root?: string; + errKey?: string; + code?: string; + message?: string; + timestamp?: string; + details?: { + validationErrors?: { + [key: string]: string; + } + } + } } // 분리승인 상세 조회 Request @@ -369,7 +381,7 @@ export interface ExtensionLInkPaySeparateActionParams extends ExtensionRequestPa } export interface ExtensionLinkPaySeparateActionResponse { - success : boolean; + success: boolean; totalCount: number; successCount: number; failCount: number; diff --git a/src/entities/additional-service/ui/account-holder-auth/detail/account-holder-auth-detail.tsx b/src/entities/additional-service/ui/account-holder-auth/detail/account-holder-auth-detail.tsx index c4d01d9..18b10c5 100644 --- a/src/entities/additional-service/ui/account-holder-auth/detail/account-holder-auth-detail.tsx +++ b/src/entities/additional-service/ui/account-holder-auth/detail/account-holder-auth-detail.tsx @@ -8,6 +8,7 @@ import { getAuthResultStatusText } from '@/entities/additional-service/model/fac import { useTranslation } from 'react-i18next'; import { DetailMotionDuration, DetailMotionStyle, DetailMotionVariants } from '@/entities/common/model/constant'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; +import { showAlert } from '@/widgets/show-alert'; export interface AccountHolderAuthDetailProps { detailOn: boolean; @@ -33,7 +34,12 @@ export const AccountHolderAuthDetail = ({ tid: tid } accountHolderAuthDetail(accountHolderAuthDetailParams).then((rs: ExtensionAccountHolderAuthDetailResponse) => { - setDetail(rs); + setDetail(rs); + }).catch((e: any) => { + if (e.response?.data?.error?.message) { + showAlert(e.response?.data?.error?.message); + return; + } }); }; const onClickToClose = () => { @@ -45,77 +51,77 @@ export const AccountHolderAuthDetail = ({ }; useEffect(() => { - if(!!mid && !!tid){ + if (!!mid && !!tid) { callDetail(); } }, [mid, tid]); - + return ( <> -
-
{ t('additionalService.accountHolderAuth.detailTitle') }
+
{t('additionalService.accountHolderAuth.detailTitle')}
-
-
- {detail?.accountName} -
- {detail?.accountNo} -
{getDate(detail?.requestDate)}
-
-
-
-
{t('transaction.sections.detailInfo')}
-
    -
  • - {t('transaction.fields.companyName')} - {detail?.companyName} -
  • -
  • - {t('transaction.fields.mid')} - {detail?.mid} -
  • -
  • - {t('additionalService.accountHolderAuth.requestDate')} - {getDate(detail?.requestDate)} -
  • -
  • - {t('transaction.fields.bank')} - {detail?.bankName} -
  • -
  • - {t('transaction.fields.accountNo')} - {detail?.accountNo} -
  • -
  • - {t('transaction.fields.accountHolder')} - {detail?.accountName} -
  • -
  • - {t('common.result')} - {getAuthStatusText(t)(detail?.authStatus)} -
  • -
  • - {t('transaction.fields.failureReason')} - {detail?.failReason ? getAuthResultStatusText(t)(detail?.failReason) : '-' } -
  • -
+
+
+ {detail?.accountName}
+ {detail?.accountNo} +
{getDate(detail?.requestDate)}
+
+
+
{t('transaction.sections.detailInfo')}
+
    +
  • + {t('transaction.fields.companyName')} + {detail?.companyName} +
  • +
  • + {t('transaction.fields.mid')} + {detail?.mid} +
  • +
  • + {t('additionalService.accountHolderAuth.requestDate')} + {getDate(detail?.requestDate)} +
  • +
  • + {t('transaction.fields.bank')} + {detail?.bankName} +
  • +
  • + {t('transaction.fields.accountNo')} + {detail?.accountNo} +
  • +
  • + {t('transaction.fields.accountHolder')} + {detail?.accountName} +
  • +
  • + {t('common.result')} + {getAuthStatusText(t)(detail?.authStatus)} +
  • +
  • + {t('transaction.fields.failureReason')} + {detail?.failReason ? getAuthResultStatusText(t)(detail?.failReason) : '-'} +
  • +
+
+
); diff --git a/src/entities/additional-service/ui/ars/detail/ars-detail.tsx b/src/entities/additional-service/ui/ars/detail/ars-detail.tsx index 9befe1c..da95579 100644 --- a/src/entities/additional-service/ui/ars/detail/ars-detail.tsx +++ b/src/entities/additional-service/ui/ars/detail/ars-detail.tsx @@ -10,6 +10,7 @@ import { useExtensionArsDetailMutation } from '@/entities/additional-service/api import { useExtensionArsResendMutation } from '@/entities/additional-service/api/ars/use-extension-ars-resend-mutation'; import { snackBar } from '@/shared/lib'; import { ArsResendSmsBottomSheet } from '../resend-sms-bottom-sheet'; +import { showAlert } from '@/widgets/show-alert'; export interface ArsDetailProps { detailOn: boolean; @@ -39,6 +40,11 @@ export const ArsDetail = ({ }; extensionArsDetail(arsDetailParams).then((rs: ExtensionArsDetailResponse) => { setDetail(rs); + }).catch((e: any) => { + if (e.response?.data?.error?.message) { + showAlert(e.response?.data?.error?.message); + return; + } }); } @@ -101,76 +107,76 @@ export const ArsDetail = ({ >
-
-
- - {t('home.money', { value: new Intl.NumberFormat('en-US').format(Number(detail?.amount) || 0) })} - -
-
{detail?.corpName}
-
{getDate(detail?.paymentDate)}
+
+
+ + {t('home.money', { value: new Intl.NumberFormat('en-US').format(Number(detail?.amount) || 0) })} +
-
-
-
{t('additionalService.ars.transactionInfo')}
-
    -
  • - {t('transaction.fields.mid')} - {detail?.mid} -
  • -
  • - {t('additionalService.ars.paymentMethod')} - {detail?.arsPaymentMethod} -
  • -
  • - {t('additionalService.ars.paymentStatus')} - {getArsPaymentStatusName(t)(detail?.paymentStatus)} -
  • -
  • - {t('additionalService.ars.orderStatus')} - {getArsOrderStatusName(t)(detail?.orderStatus)} -
  • -
  • - {t('additionalService.ars.orderDateTime')} - { - detail?.paymentDate ? moment(detail.paymentDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '-' - } -
  • -
  • - {t('additionalService.ars.productName')} - {detail?.goodsName} -
  • -
  • - {t('additionalService.ars.orderNumber')} - {detail?.tid} -
  • -
  • - {t('additionalService.ars.buyer')} - {detail?.buyerName} -
  • -
  • - {t('additionalService.ars.phoneNumber')} - {detail?.maskPhoneNumber} -
  • -
  • - {t('additionalService.ars.email')} - {detail?.email} -
  • -
  • - {t('additionalService.ars.sendVerificationCode')} - {detail?.smsVerificationCode} -
  • -
+
{detail?.corpName}
+
{getDate(detail?.paymentDate)}
+
+
+
+
{t('additionalService.ars.transactionInfo')}
+
    +
  • + {t('transaction.fields.mid')} + {detail?.mid} +
  • +
  • + {t('additionalService.ars.paymentMethod')} + {detail?.arsPaymentMethod} +
  • +
  • + {t('additionalService.ars.paymentStatus')} + {getArsPaymentStatusName(t)(detail?.paymentStatus)} +
  • +
  • + {t('additionalService.ars.orderStatus')} + {getArsOrderStatusName(t)(detail?.orderStatus)} +
  • +
  • + {t('additionalService.ars.orderDateTime')} + { + detail?.paymentDate ? moment(detail.paymentDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '-' + } +
  • +
  • + {t('additionalService.ars.productName')} + {detail?.goodsName} +
  • +
  • + {t('additionalService.ars.orderNumber')} + {detail?.tid} +
  • +
  • + {t('additionalService.ars.buyer')} + {detail?.buyerName} +
  • +
  • + {t('additionalService.ars.phoneNumber')} + {detail?.maskPhoneNumber} +
  • +
  • + {t('additionalService.ars.email')} + {detail?.email} +
  • +
  • + {t('additionalService.ars.sendVerificationCode')} + {detail?.smsVerificationCode} +
  • +
+
+ {detail?.arsPaymentMethod === ArsPaymentMethod.SMS && ( +
+
- {detail?.arsPaymentMethod === ArsPaymentMethod.SMS && ( -
- -
- )} + )}
{ - const { t } = useTranslation(); - + const { t } = useTranslation(); + const [detail, setDetail] = useState(); const [emailBottomSheetOn, setEmailBottomSheetOn] = useState(false); @@ -43,6 +44,11 @@ export const FundAccountResultDetail = ({ extensionFundAccountResultDetail(params).then((rs: ExtensionFundAccountResultDetailResponse) => { console.log(rs.requestDate) setDetail(rs); + }).catch((e: any) => { + if (e.response?.data?.error?.message) { + showAlert(e.response?.data?.error?.message); + return; + } }); }; @@ -51,7 +57,7 @@ export const FundAccountResultDetail = ({ }; const onSendRequest = (selectedEmail?: string) => { - if(selectedEmail){ + if (selectedEmail) { let params: ExtensionFundAccountDownloadReceiptParams = { mid: mid, tid: tid, @@ -63,107 +69,107 @@ export const FundAccountResultDetail = ({ } setEmailBottomSheetOn(false); }; - + const onClickToClose = () => { setDetailOn(false); }; useEffect(() => { - if(!!mid && !!tid){ + if (!!mid && !!tid) { callDetail(); } }, [mid, tid]); return ( <> -
-
{ t('additionalService.fundAccount.transferDetailTitle') }
+
{t('additionalService.fundAccount.transferDetailTitle')}
-
-
- - {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail?.amount || 0) })} - -
-
{detail?.accountName}({detail?.accountNo})
- {detail?.applicationDate && ( -
{moment(detail?.applicationDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss')}
- )} +
+
+ + {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail?.amount || 0) })} +
- {/* ✅ resultMessage가 "정상"일 때만 표시 */} - {detail?.resultMessage === '정상' && ( -
- -
+
{detail?.accountName}({detail?.accountNo})
+ {detail?.applicationDate && ( +
{moment(detail?.applicationDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss')}
)} -
-
-
{t('additionalService.fundAccount.detailInfo')}
-
    -
  • - {t('additionalService.fundAccount.requestDateTime')} - {moment(detail?.requestDate,'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss')} -
  • -
  • - {t('additionalService.fundAccount.transferDateTime')} - {detail?.applicationDate ? moment(detail?.applicationDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '-'} -
  • -
  • - {t('additionalService.fundAccount.transferResult')} - {detail?.resultMessage || '-'} -
  • -
  • - {t('additionalService.fundAccount.failureReason')} - {detail?.failReason || '-'} -
  • -
  • - {t('additionalService.fundAccount.beneficiaryName')} - {detail?.accountName} -
  • -
  • - {t('additionalService.fundAccount.bank')} - {detail?.bankName} -
  • -
  • - {t('additionalService.fundAccount.accountNumber')} - {detail?.accountNo} -
  • -
  • - MID - {mid} -
  • -
  • - {t('transaction.fields.orderNumber')} - {detail?.moid} -
  • -
  • - TID - {detail?.tid} -
  • -
+
+ {/* ✅ resultMessage가 "정상"일 때만 표시 */} + {detail?.resultMessage === '정상' && ( +
+
+ )} +
+
+
{t('additionalService.fundAccount.detailInfo')}
+
    +
  • + {t('additionalService.fundAccount.requestDateTime')} + {moment(detail?.requestDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss')} +
  • +
  • + {t('additionalService.fundAccount.transferDateTime')} + {detail?.applicationDate ? moment(detail?.applicationDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '-'} +
  • +
  • + {t('additionalService.fundAccount.transferResult')} + {detail?.resultMessage || '-'} +
  • +
  • + {t('additionalService.fundAccount.failureReason')} + {detail?.failReason || '-'} +
  • +
  • + {t('additionalService.fundAccount.beneficiaryName')} + {detail?.accountName} +
  • +
  • + {t('additionalService.fundAccount.bank')} + {detail?.bankName} +
  • +
  • + {t('additionalService.fundAccount.accountNumber')} + {detail?.accountNo} +
  • +
  • + MID + {mid} +
  • +
  • + {t('transaction.fields.orderNumber')} + {detail?.moid} +
  • +
  • + TID + {detail?.tid} +
  • +
+
{ setDetail(rs); - }); + }).catch((e: any) => { + if (e.response?.data?.error?.message) { + showAlert(e.response?.data?.error?.message); + return; + } + });; }; - + const onClickToRequest = () => { let params: ExtensionFundAccountTransferRequestParams = { seq: seq }; extensionFundAccountTransferRequest(params).then((rs: ExtensionFundAccountTransferRequestResponse) => { - if(rs.status){ + if (rs.status) { callDetail(); snackBar(t('additionalService.fundAccount.transferRequestSuccess')) } - else{ + else { const errorMessage = rs.error?.message || t('additionalService.fundAccount.transferRequestFailed'); snackBar(`[${t('common.failed')}] ${errorMessage}`); } }).catch((error) => { - const errorMessage = error?.response?.data?.error?.message || - error?.message || - t('additionalService.fundAccount.transferRequestError'); - snackBar(`[${t('common.failed')}] ${errorMessage}`); + console.log(error); + const errorMessage = error?.response?.data?.error?.message || error?.message || t('additionalService.fundAccount.transferRequestError'); + if (error.response?.data?.error?.root !== "SystemErrorCode") { + snackBar(`[${t('common.failed')}] ${error.response?.data?.error?.message}`) + } else { + showAlert(`[${t('common.failed')}] ${errorMessage}`); + } }); }; @@ -68,92 +77,92 @@ export const FundAccountTransferDetail = ({ }; useEffect(() => { - if(!!seq){ + if (!!seq) { callDetail(); } }, [seq]); return ( <> -
-
{ t('additionalService.fundAccount.transferDetailTitle') }
+
{t('additionalService.fundAccount.transferDetailTitle')}
-
-
- - {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail?.amount || 0) })} +
+
+ + {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail?.amount || 0) })} + +
+
{detail?.accountName}({detail?.accountNo})
+
+ {detail?.registDate ? moment(detail.registDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '-'} +
+
+
+
+
{t('additionalService.fundAccount.detailInfo')}
+
    +
  • + {t('additionalService.fundAccount.registrationDateTime')} + + {detail?.registDate ? moment(detail.registDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '-'} -
-
{detail?.accountName}({detail?.accountNo})
-
- {detail?.registDate ? moment(detail.registDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '-'} -
-
-
-
-
{t('additionalService.fundAccount.detailInfo')}
-
    -
  • - {t('additionalService.fundAccount.registrationDateTime')} - - {detail?.registDate ? moment(detail.registDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '-'} - -
  • -
  • - {t('additionalService.fundAccount.processingResult')} - {getFundAccountStatusName(t)(detail?.resultStatus) || '-'} -
  • -
  • - {t('additionalService.fundAccount.requestDate')} - - {detail?.requestDate ? moment(detail.requestDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD') : '-'} - -
  • -
  • - {t('additionalService.fundAccount.transferResult')} - {detail?.resultMessage || '-'} -
  • -
  • - {t('additionalService.fundAccount.beneficiaryName')} - {detail?.accountName} -
  • -
  • - {t('additionalService.fundAccount.bank')} - {detail?.bankCode || '-'} -
  • -
  • - {t('additionalService.fundAccount.accountNumber')} - {detail?.accountNo} -
  • -
  • - MID - {detail?.mid} -
  • + +
  • + {t('additionalService.fundAccount.processingResult')} + {getFundAccountStatusName(t)(detail?.resultStatus) || '-'} +
  • +
  • + {t('additionalService.fundAccount.requestDate')} + + {detail?.requestDate ? moment(detail.requestDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD') : '-'} + +
  • +
  • + {t('additionalService.fundAccount.transferResult')} + {detail?.resultMessage || '-'} +
  • +
  • + {t('additionalService.fundAccount.beneficiaryName')} + {detail?.accountName} +
  • +
  • + {t('additionalService.fundAccount.bank')} + {detail?.bankCode || '-'} +
  • +
  • + {t('additionalService.fundAccount.accountNumber')} + {detail?.accountNo} +
  • +
  • + MID + {detail?.mid} +
  • -
-
-
- -
+ +
+
+ +
diff --git a/src/entities/additional-service/ui/link-payment/detail/link-payment-history-detail.tsx b/src/entities/additional-service/ui/link-payment/detail/link-payment-history-detail.tsx index 82d0e41..c630a5b 100644 --- a/src/entities/additional-service/ui/link-payment/detail/link-payment-history-detail.tsx +++ b/src/entities/additional-service/ui/link-payment/detail/link-payment-history-detail.tsx @@ -24,6 +24,7 @@ import moment from 'moment'; import { useTranslation } from 'react-i18next'; import { DetailMotionDuration, DetailMotionStyle, DetailMotionVariants } from '@/entities/common/model/constant'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; +import { showAlert } from '@/widgets/show-alert'; export interface LinkPaymentHistoryDetailProps { detailOn: boolean; @@ -66,7 +67,12 @@ export const LinkPaymentHistoryDetail = ({ setDetailInfo(rs.detailInfo) setPaymentInfo(rs.paymentInfo) setDetailExposure(rs.detailExposure ?? false) - }) + }).catch((e: any) => { + if (e.response?.data?.error?.message) { + showAlert(e.response?.data?.error?.message); + return; + } + }); } // Resend API @@ -88,9 +94,15 @@ export const LinkPaymentHistoryDetail = ({ }) .catch((error) => { const errorMessage = error?.response?.data?.error?.message || - error?.message || - t('additionalService.linkPayment.resendError'); - snackBar(`[${t('common.failed')}] ${errorMessage}`); + error?.message || + t('additionalService.linkPayment.resendError'); + console.log(error) + if (error.response?.data?.error?.root !== "SystemErrorCode") { + snackBar(`[${t('common.failed')}] ${errorMessage}`); + } + else { + showAlert(`[${t('common.failed')}] ${errorMessage}`) + } }); } @@ -143,64 +155,64 @@ export const LinkPaymentHistoryDetail = ({ }; useEffect(() => { - if(!!mid && !!requestId){ + if (!!mid && !!requestId) { callDetail(); } }, [mid, requestId, subReqId]); return ( <> -
-
{ t('additionalService.linkPayment.detailTitle') }
+
{t('additionalService.linkPayment.detailTitle')}
-
- -
-
-
- -
- -
-
- -
-
-
+
+ +
+
+
+ +
+ +
+
+ onClick={() => onClickToSeparateApproval()} + disabled={detailExposure} + >{t('additionalService.linkPayment.separateApprovalDetail')}
+
+ +
+
) diff --git a/src/entities/additional-service/ui/link-payment/detail/link-payment-wait-detail.tsx b/src/entities/additional-service/ui/link-payment/detail/link-payment-wait-detail.tsx index 2190859..9aa292d 100644 --- a/src/entities/additional-service/ui/link-payment/detail/link-payment-wait-detail.tsx +++ b/src/entities/additional-service/ui/link-payment/detail/link-payment-wait-detail.tsx @@ -12,6 +12,8 @@ import { snackBar } from '@/shared/lib'; import { useTranslation } from 'react-i18next'; import { DetailMotionDuration, DetailMotionStyle, DetailMotionVariants } from '@/entities/common/model/constant'; import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; +import { showAlert } from '@/widgets/show-alert'; +import { P } from 'node_modules/framer-motion/dist/types.d-Cjd591yU'; export interface LinkPaymentWaitDetailProps { detailOn: boolean; @@ -38,12 +40,15 @@ export const LinkPaymentWaitDetail = ({ mid: mid, requestId: requestId } - linkPayWaitDetail(detailParam).then((rs: DetailResponse) => { setTitleInfo(rs.titleInfo) setPaymentInfo(rs.paymentInfo) - }) - + }).catch((e: any) => { + if (e.response?.data?.error?.message) { + showAlert(e.response?.data?.error?.message); + return; + } + }); } const deletePayment = () => { @@ -53,11 +58,21 @@ export const LinkPaymentWaitDetail = ({ } linkPayWaitDelete(deleteParam) .then((rs) => { - callDetail(); - snackBar(t('additionalService.linkPayment.deleteSuccess')) + if (rs.status) { + callDetail(); + snackBar(t('additionalService.linkPayment.deleteSuccess')) + } else { + const errorMessage = rs.error?.message || t('additionalService.linkPayment.deleteSuccess'); + snackBar(`[${t('common.failed')}] ${errorMessage}`); + } }) .catch((error) => { - snackBar(`[${t('common.failed')}] ${error?.response?.data?.message}`) + console.log(error) + if (error.response?.data?.error?.root !== "SystemErrorCode") { + snackBar(`[${t('common.failed')}] ${error?.response?.data?.error?.message}`) + } else { + showAlert(`[${t('common.failed')}] ${error?.response?.data?.error?.message}`) + } }); } @@ -89,52 +104,52 @@ export const LinkPaymentWaitDetail = ({ }; useEffect(() => { - if(!!mid && !!requestId){ + if (!!mid && !!requestId) { callDetail(); } }, [mid, requestId]); return ( <> -
-
{ t('additionalService.linkPayment.waitDetailTitle') }
+
{t('additionalService.linkPayment.waitDetailTitle')}
-
- -
-
-
- -
+
+
-
- +
+
+
+
+
+ +
) diff --git a/src/entities/additional-service/ui/payout/detail/payout-detail.tsx b/src/entities/additional-service/ui/payout/detail/payout-detail.tsx index 7ede1ca..ad7e3a8 100644 --- a/src/entities/additional-service/ui/payout/detail/payout-detail.tsx +++ b/src/entities/additional-service/ui/payout/detail/payout-detail.tsx @@ -9,6 +9,7 @@ import { DetailMotionDuration, DetailMotionStyle, DetailMotionVariants } from '@ import { FullMenuClose } from '@/entities/common/ui/full-menu-close'; import { DownloadTypeBottomSheet } from '@/entities/common/ui/download-type-bottom-sheet'; import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet'; +import { showAlert } from '@/widgets/show-alert'; export interface PayoutDetailProps { @@ -39,9 +40,13 @@ export const PayoutDetail = ({ tid: tid, mid: mid, }; - extensionPayoutDetail(params).then((rs: ExtensionPayoutDetailResponse) => { setDetail(rs); + }).catch((e: any) => { + if (e.response?.data?.error?.message) { + showAlert(e.response?.data?.error?.message); + return; + } }); } @@ -121,71 +126,71 @@ export const PayoutDetail = ({ >
-
-
- - {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail?.disbursementAmount || 0) })} - -
-
{detail?.companyName}
-
{detail?.settlementDate}
-
- -
+
+
+ + {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail?.disbursementAmount || 0) })} +
-
-
-
{t('additionalService.payout.detailInfo')}
-
    -
  • - {t('additionalService.payout.disbursementStatus')} - {detail?.disbursementStatus} -
  • -
  • - {t('additionalService.payout.transactionType')} - {detail?.transTypeName} -
  • -
  • - {t('common.requestDate')} - {moment(detail?.requestDate).format('YYYY.MM.DD')} -
  • -
  • - {t('additionalService.payout.disbursementDateTime')} - {moment(detail?.settlementDateTime, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss')} -
  • -
  • - {t('additionalService.payout.businessNumber')} - {detail?.companyNo} -
  • -
  • - {t('additionalService.payout.accountHolder')} - {detail?.accountName} -
  • -
  • - {t('additionalService.payout.bank')} - {detail?.bankName} -
  • -
  • - {t('additionalService.payout.accountNumber')} - {detail?.accountNo} -
  • -
  • - {t('additionalService.payout.depositor')} - {detail?.depositName} -
  • -
  • - {t('additionalService.payout.failureReason')} - {detail?.failReason} -
  • -
+
{detail?.companyName}
+
{detail?.settlementDate}
+
+
+
+
+
+
{t('additionalService.payout.detailInfo')}
+
    +
  • + {t('additionalService.payout.disbursementStatus')} + {detail?.disbursementStatus} +
  • +
  • + {t('additionalService.payout.transactionType')} + {detail?.transTypeName} +
  • +
  • + {t('common.requestDate')} + {moment(detail?.requestDate).format('YYYY.MM.DD')} +
  • +
  • + {t('additionalService.payout.disbursementDateTime')} + {moment(detail?.settlementDateTime, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss')} +
  • +
  • + {t('additionalService.payout.businessNumber')} + {detail?.companyNo} +
  • +
  • + {t('additionalService.payout.accountHolder')} + {detail?.accountName} +
  • +
  • + {t('additionalService.payout.bank')} + {detail?.bankName} +
  • +
  • + {t('additionalService.payout.accountNumber')} + {detail?.accountNo} +
  • +
  • + {t('additionalService.payout.depositor')} + {detail?.depositName} +
  • +
  • + {t('additionalService.payout.failureReason')} + {detail?.failReason} +
  • +
+
(mid); const [filterSearchDateType, setFilterSearchDateType] = useState(searchDateType); - const [filterFromDate, setFilterFromDate] = useState(moment(fromDate).format('YYYY.MM.DD')); - const [filterToDate, setFilterToDate] = useState(moment(toDate).format('YYYY.MM.DD')); + const [filterFromDate, setFilterFromDate] = useState(moment(fromDate).format('YYYYMMDD')); + const [filterToDate, setFilterToDate] = useState(moment(toDate).format('YYYYMMDD')); const [filterStatus, setFilterStatus] = useState(status); const [filterMinAmount, setFilterMinAmount] = useState(minAmount); const [filterMaxAmount, setFilterMaxAmount] = useState(maxAmount); diff --git a/src/entities/additional-service/ui/sms-payment/sms-payment-detail-resend.tsx b/src/entities/additional-service/ui/sms-payment/sms-payment-detail-resend.tsx index 9007807..c0a9d58 100644 --- a/src/entities/additional-service/ui/sms-payment/sms-payment-detail-resend.tsx +++ b/src/entities/additional-service/ui/sms-payment/sms-payment-detail-resend.tsx @@ -3,8 +3,8 @@ import { useTranslation } from 'react-i18next'; import { IMAGE_ROOT } from '@/shared/constants/common'; import { SmsPaymentDetailResendProps } from '../../../additional-service/model/sms-payment/types'; import { useExtensionSmsResendMutation } from '../../api/sms-payment/use-extension-sms-resend-mutation'; -import appBridge from '@/shared/lib/appBridge'; import { snackBar } from '@/shared/lib'; +import { showAlert } from '@/widgets/show-alert'; export const SmsPaymentDetailResend = ({ bottomSmsPaymentDetailResendOn, @@ -19,7 +19,7 @@ export const SmsPaymentDetailResend = ({ visible: { y: '0%' }, }; - const {mutateAsync : resendMessage } = useExtensionSmsResendMutation(); + const { mutateAsync: resendMessage } = useExtensionSmsResendMutation(); const onClickResend = () => { // sendMessage가 없으면 재발송 불가 @@ -37,9 +37,13 @@ export const SmsPaymentDetailResend = ({ } else { snackBar(t('additionalService.sms.sendFailed', { message: rs.error?.message })) } - }).catch((error) => { - snackBar(t('additionalService.sms.sendFailed', { message: error?.response?.data?.message || error?.response?.data?.error?.message }) || t('additionalService.sms.sendFailedGeneric')) - setBottomSmsPaymentDetailResendOn(false) + }).catch((e: any) => { + console.log(e) + if (e.response?.data?.error?.message) { + showAlert(e.response?.data?.error?.message); + setBottomSmsPaymentDetailResendOn(false) + return; + } }); } @@ -50,14 +54,14 @@ export const SmsPaymentDetailResend = ({ return ( <> - { bottomSmsPaymentDetailResendOn && + {bottomSmsPaymentDetailResendOn &&
} -
@@ -68,9 +72,9 @@ export const SmsPaymentDetailResend = ({ type="button" > {t('common.close')} onClickToClose() } + onClick={() => onClickToClose()} />
diff --git a/src/pages/additional-service/account-holder-auth/account-holder-auth-page.tsx b/src/pages/additional-service/account-holder-auth/account-holder-auth-page.tsx index 155fcb8..936a8b3 100644 --- a/src/pages/additional-service/account-holder-auth/account-holder-auth-page.tsx +++ b/src/pages/additional-service/account-holder-auth/account-holder-auth-page.tsx @@ -26,6 +26,8 @@ import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet'; import { useExtensionAccessCheck } from '@/shared/lib/hooks/use-extension-access-check'; import useIntersectionObserver from '@/widgets/intersection-observer'; import { AccountHolderAuthDetail } from '@/entities/additional-service/ui/account-holder-auth/detail/account-holder-auth-detail'; +import { showAlert } from '@/widgets/show-alert'; +import { checkGrant } from '@/shared/lib/check-grant'; export const AccountHolderAuthPage = () => { const { navigate } = useNavigate(); @@ -63,18 +65,18 @@ export const AccountHolderAuthPage = () => { const { mutateAsync: downloadExcel } = useExtensionAccountHolderAuthDownloadExcelMutation(); const onIntersect: IntersectionObserverCallback = (entries: Array) => { entries.forEach((entry: IntersectionObserverEntry) => { - if(entry.isIntersecting){ - if(onActionIntersect && !!pageParam.cursor){ + if (entry.isIntersecting) { + if (onActionIntersect && !!pageParam.cursor) { setOnActionIntersect(false); callList('page'); - } + } } }); }; - const { setTarget } = useIntersectionObserver({ - threshold: 1, - onIntersect + const { setTarget } = useIntersectionObserver({ + threshold: 1, + onIntersect }); const callList = (type?: string) => { @@ -88,37 +90,37 @@ export const AccountHolderAuthPage = () => { ...{ sortType: sortType } } }; - if(type !== 'page' && listParams.page){ + if (type !== 'page' && listParams.page) { listParams.page.cursor = null; } accountHolderAuthList(listParams).then((rs) => { - if(type === 'page'){ + if (type === 'page') { setListItems([ ...listItems, ...rs.content ]); } - else{ + else { setListItems(rs.content); } - if(rs.hasNext + if (rs.hasNext && rs.nextCursor !== pageParam.cursor && rs.content.length === DEFAULT_PAGE_PARAM.size - ){ + ) { setPageParam({ ...pageParam, ...{ cursor: rs.nextCursor } }); } - else{ + else { setPageParam({ ...pageParam, ...{ cursor: null } }); } setOnActionIntersect( - !!rs.hasNext + !!rs.hasNext && rs.nextCursor !== pageParam.cursor && rs.content.length === DEFAULT_PAGE_PARAM.size ); @@ -139,10 +141,10 @@ export const AccountHolderAuthPage = () => { }; const setDetailData = (detailData: DetailData) => { setDetailOn(detailData.detailOn); - if(detailData.mid){ + if (detailData.mid) { setDetailMid(detailData.mid); } - if(detailData.tid){ + if (detailData.tid) { setDetailTid(detailData.tid); } }; @@ -154,7 +156,7 @@ export const AccountHolderAuthPage = () => { const onSendRequest = (selectedEmail?: string) => { if (selectedEmail) { - const params: ExtensionAccountHolderAuthDownloadExcelParams = { // 추후 수정필요 + const params: ExtensionAccountHolderAuthDownloadExcelParams = { mid: mid, email: selectedEmail, fromDate: fromDate, @@ -244,12 +246,12 @@ export const AccountHolderAuthPage = () => {
-
+
@@ -266,10 +268,10 @@ export const AccountHolderAuthPage = () => { setAuthStatus={setAuthStatus} > { - const { navigate } = useNavigate(); - const { t } = useTranslation(); - const location = useLocation(); - const { mid, tid } = location.state || {}; - const [detail, setDetail] = useState(); - - useSetHeaderTitle(t('additionalService.accountHolderAuth.detailTitle')); - useSetHeaderType(HeaderType.LeftArrow); - useSetFooterMode(false); - useSetOnBack(() => { - navigate(PATHS.additionalService.accountHolderAuth.list); - }); - - const { mutateAsync: accountHolderAuthDetail } = useExtensionAccountHolderAuthDetailMutation(); - - const callDetail = () => { - let accountHolderAuthDetailParams: ExtensionAccountHolderAuthDetailParams = { - mid: mid, - tid: tid - } - accountHolderAuthDetail(accountHolderAuthDetailParams).then((rs: ExtensionAccountHolderAuthDetailResponse) => { - setDetail(rs); - }); - }; - useEffect(() => { - callDetail(); - }, []); - - const getDate = (date?: string) => { - return (date) ? moment(date, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : ''; - }; - return ( - <> -
-
-
-
-
- {detail?.accountName} -
- {detail?.accountNo} -
{getDate(detail?.requestDate)}
-
-
-
-
{t('transaction.sections.detailInfo')}
-
    -
  • - {t('transaction.fields.companyName')} - {detail?.companyName} -
  • -
  • - {t('transaction.fields.mid')} - {detail?.mid} -
  • -
  • - {t('additionalService.accountHolderAuth.requestDate')} - {getDate(detail?.requestDate)} -
  • -
  • - {t('transaction.fields.bank')} - {detail?.bankName} -
  • -
  • - {t('transaction.fields.accountNo')} - {detail?.accountNo} -
  • -
  • - {t('transaction.fields.accountHolder')} - {detail?.accountName} -
  • -
  • - {t('common.result')} - {getAuthStatusText(t)(detail?.authStatus)} -
  • -
  • - {t('transaction.fields.failureReason')} - {detail?.failReason ? getAuthResultStatusText(t)(detail?.failReason) : '-' } -
  • -
-
-
-
-
- - ) -} \ No newline at end of file diff --git a/src/pages/additional-service/account-holder-search/account-holder-search-page.tsx b/src/pages/additional-service/account-holder-search/account-holder-search-page.tsx index 36b523a..5014e81 100644 --- a/src/pages/additional-service/account-holder-search/account-holder-search-page.tsx +++ b/src/pages/additional-service/account-holder-search/account-holder-search-page.tsx @@ -27,6 +27,8 @@ import { useExtensionAccessCheck } from '@/shared/lib/hooks/use-extension-access 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'; +import { showAlert } from '@/widgets/show-alert'; +import { checkGrant } from '@/shared/lib/check-grant'; export const AccountHolderSearchPage = () => { const { navigate } = useNavigate(); @@ -176,10 +178,10 @@ export const AccountHolderSearchPage = () => { const setDetailData = (detailData: DetailData) => { setDetailOn(detailData.detailOn); - if(detailData.mid){ + if (detailData.mid) { setDetailMid(detailData.mid); } - if(detailData.tid){ + if (detailData.tid) { setDetailTid(detailData.tid); } }; @@ -262,9 +264,9 @@ export const AccountHolderSearchPage = () => {
@@ -289,10 +291,10 @@ export const AccountHolderSearchPage = () => { setResultStatus={setResultStatus} > { - const { navigate } = useNavigate(); - const { t } = useTranslation(); - const location = useLocation(); - - const { mid, tid } = location.state || {}; - - const [detail, setDetail] = useState(); - - useSetHeaderTitle(t('additionalService.accountHolderSearch.detailTitle')); - useSetHeaderType(HeaderType.LeftArrow); - useSetFooterMode(false); - useSetOnBack(() => { - navigate(PATHS.additionalService.accountHolderSearch.list); - }); - - const { mutateAsync: accountHolderSearchDetail } = useExtensionAccountHolderSearchDetailtMutation(); - - const callDetail = () => { - let accountHolderSearchDetailParams: ExtensionAccountHolderSearchDetailParams = { - mid: mid, - tid: tid - } - accountHolderSearchDetail(accountHolderSearchDetailParams).then((rs: ExtensionAccountHolderSearchDetailResponse) => { - setDetail(rs); - }); - }; - - const getDate = (date?: string) => { - return (date) ? moment(date, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : ''; - }; - - useEffect(() => { - callDetail(); - }, []); - return ( - <> -
-
-
-
-
- {detail?.accountNo} -
- {detail?.bankName} -
{getDate(detail?.requestDate)}
-
-
-
-
{t('transaction.sections.detailInfo')}
-
    -
  • - {t('transaction.fields.accountHolder')} - {detail?.accountName} -
  • -
  • - {t('additionalService.accountHolderAuth.requestDate')} - {getDate(detail?.requestDate)} -
  • -
  • - {t('common.result')} - {getAccountHolderStatusText(t)(detail?.resultStatus)} -
  • -
  • - {t('transaction.fields.failureReason')} - {detail?.failReason ? detail?.failReason : '-' } -
  • -
  • - {t('transaction.fields.bank')} - {detail?.bankName} -
  • -
  • - {t('transaction.fields.accountNo')} - {detail?.accountNo} -
  • -
  • - {t('additionalService.accountHolderAuth.requestWay')} - {detail?.requestWay} -
  • -
-
-
-
-
- - ) -} \ No newline at end of file diff --git a/src/pages/additional-service/account-holder-search/request-page.tsx b/src/pages/additional-service/account-holder-search/request-page.tsx index fd64fc9..75a640b 100644 --- a/src/pages/additional-service/account-holder-search/request-page.tsx +++ b/src/pages/additional-service/account-holder-search/request-page.tsx @@ -14,6 +14,7 @@ import { useStore } from '@/shared/model/store'; import { NumericFormat } from 'react-number-format'; import { snackBar } from '@/shared/lib'; import { useTranslation } from 'react-i18next'; +import { showAlert } from '@/widgets/show-alert'; export const AccountHolderSearchRequestPage = () => { const { navigate } = useNavigate(); @@ -73,12 +74,13 @@ export const AccountHolderSearchRequestPage = () => { snackBar(`[${t('common.failed')}] ${errorMessage}`); } }) - .catch((error) => { - console.error("Account holder search request failed: ", error) - const errorMessage = error?.response?.data?.error?.message || - error?.message || - t('common.errorOccurred'); - snackBar(`[${t('common.failed')}] ${errorMessage}`); + .catch((e) => { + const errorMessage = e?.response?.data?.error?.message || e?.message ||t('common.errorOccurred'); + if (e.response?.data?.error?.root !== "SystemErrorCode") { + snackBar(`[${t('common.failed')}] ${errorMessage}`); + } else { + showAlert(`[${t('common.failed')}] ${errorMessage}`) + } }) }; diff --git a/src/pages/additional-service/additional-service-pages.tsx b/src/pages/additional-service/additional-service-pages.tsx index ee6461e..578db12 100644 --- a/src/pages/additional-service/additional-service-pages.tsx +++ b/src/pages/additional-service/additional-service-pages.tsx @@ -3,7 +3,6 @@ import { SentryRoutes } from '@/shared/configs/sentry'; import { ROUTE_NAMES } from '@/shared/constants/route-names'; import { ListPage } from './list-page'; import { ArsListPage } from './ars/list-page'; -import { ArsDetailPage } from './ars/detail-page'; import { ArsRequestPage } from './ars/request-page'; import { ArsRequestSuccessPage } from './ars/request-success-page'; import { KeyInPaymentPage } from './key-in-payment/key-in-payment-page'; @@ -27,8 +26,6 @@ import { PayoutRequestPage } from './payout/request-page'; import { LinkPaymentApplyPage } from './link-payment/apply/link-payment-apply-page'; import { LinkPaymentApplyConfirmPage } from './link-payment/apply/link-payment-apply-confirm-page'; import { LinkPaymentApplySuccessPage } from './link-payment/apply/link-payment-apply-success-page'; -import { LinkPaymentDetailPage } from './link-payment/link-payment-detail-page'; -import { LinkPaymentWaitDetailPage } from './link-payment/link-payment-wait-detail-page'; import { KeyInPaymentRequestPage } from './key-in-payment/requeset-page'; import { KeyInPaymentRequestSuccessPage } from './key-in-payment/request-success-page'; import { AccountHolderSearchRequestPage } from './account-holder-search/request-page'; @@ -63,8 +60,6 @@ export const AdditionalServicePages = () => { } /> } /> } /> - } /> - } /> } /> diff --git a/src/pages/additional-service/alimtalk/setting-page.tsx b/src/pages/additional-service/alimtalk/setting-page.tsx index b2fcdac..b445bf6 100644 --- a/src/pages/additional-service/alimtalk/setting-page.tsx +++ b/src/pages/additional-service/alimtalk/setting-page.tsx @@ -24,6 +24,7 @@ import { AlimTalkSettingServiceRow } from '@/entities/additional-service/ui/alim import { useStore } from '@/shared/model/store'; import { snackBar } from '@/shared/lib'; import { useTranslation } from 'react-i18next'; +import { showAlert } from '@/widgets/show-alert'; export const AlimtalkSettingPage = () => { const { t } = useTranslation(); @@ -79,171 +80,185 @@ export const AlimtalkSettingPage = () => { setUserVirtureAccountDepositCompleteFlag(sendUserInfo?.virtureAccountDepositCompleteFlag || false); setUserVirtureAccountRefundFlag(sendUserInfo?.virtureAccountRefundFlag || false); } - }); - }; - - const callSettingSave = () => { - let params: ExtensionAlimtalkSettingSaveParams = { - mid: mid, - sendMerchantInfo: { - cardApprovalFlag: merchantCardApprovalFlag, - cardCancelFlag: merchantCardCancelFlag, - bankApprovalFlag: merchantBankApprovalFlag, - bankCancelFlag: merchantBankCancelFlag, - virtureAccountDepositRequestFlag: merchantVirtureAccountDepositRequestFlag, - virtureAccountDepositCompleteFlag: merchantVirtureAccountDepositCompleteFlag, - virtureAccountRefundFlag: merchantVirtureAccountRefundFlag - }, - sendUserInfo: { - cardApprovalFlag: userCardApprovalFlag, - cardCancelFlag: userCardCancelFlag, - bankApprovalFlag: userBankApprovalFlag, - bankCancelFlag: userBankCancelFlag, - virtureAccountDepositRequestFlag: userVirtureAccountDepositRequestFlag, - virtureAccountDepositCompleteFlag: userVirtureAccountDepositCompleteFlag, - virtureAccountRefundFlag: userVirtureAccountRefundFlag - }, - }; - alimtalkSettingSave(params) - .then((rs) => { - snackBar(t('additionalService.alimtalk.saveSuccess')); - }) - .catch((error) => { - const failReason = error?.response?.data?.message || error?.message || t('additionalService.alimtalk.unknownError'); - snackBar(`[${t('common.failed')}] ${failReason}`); - }); - }; - - useSetHeaderTitle(t('additionalService.alimtalk.title')); - useSetHeaderType(HeaderType.LeftArrow); - useSetFooterMode(false); - useSetOnBack(() => { - navigate(PATHS.additionalService.alimtalk.list); - }); - - const onClickToSave = () => { - callSettingSave(); - }; - - // MID 초기값 설정 - useEffect(() => { - if (!mid && midOptionsWithoutGids.length > 0) { - // userMid가 옵션에 있으면 userMid 사용, 없으면 첫 번째 옵션 사용 - const midItem = midOptionsWithoutGids.filter((value) => value.value === userMid); - const initialMid = (midItem.length > 0) ? userMid : midOptionsWithoutGids[0]?.value || ''; - if (initialMid) { - setMid(initialMid); + }).catch((e: any) => { + if (e.response?.data.error?.message) { + showAlert(e.response?.data?.error?.message); + return } + }); +}; + +const callSettingSave = () => { + let params: ExtensionAlimtalkSettingSaveParams = { + mid: mid, + sendMerchantInfo: { + cardApprovalFlag: merchantCardApprovalFlag, + cardCancelFlag: merchantCardCancelFlag, + bankApprovalFlag: merchantBankApprovalFlag, + bankCancelFlag: merchantBankCancelFlag, + virtureAccountDepositRequestFlag: merchantVirtureAccountDepositRequestFlag, + virtureAccountDepositCompleteFlag: merchantVirtureAccountDepositCompleteFlag, + virtureAccountRefundFlag: merchantVirtureAccountRefundFlag + }, + sendUserInfo: { + cardApprovalFlag: userCardApprovalFlag, + cardCancelFlag: userCardCancelFlag, + bankApprovalFlag: userBankApprovalFlag, + bankCancelFlag: userBankCancelFlag, + virtureAccountDepositRequestFlag: userVirtureAccountDepositRequestFlag, + virtureAccountDepositCompleteFlag: userVirtureAccountDepositCompleteFlag, + virtureAccountRefundFlag: userVirtureAccountRefundFlag + }, + }; + alimtalkSettingSave(params) + .then((rs) => { + if (rs.status) { + snackBar(t('additionalService.alimtalk.saveSuccess')); + } else { + snackBar(`[${t('common.failed')}] ${rs.error?.message}`) + } + }) + .catch((e) => { + const failReason = e?.response?.data?.message || e?.message || t('additionalService.alimtalk.unknownError'); + console.log(e) + if (e.response?.data?.error?.root !== "SystemErrorCode") { + snackBar(`[${t('common.failed')}] ${failReason}`); + } else { + showAlert(`[${t('common.failed')}] ${failReason}`) + } + }); +}; + +useSetHeaderTitle(t('additionalService.alimtalk.title')); +useSetHeaderType(HeaderType.LeftArrow); +useSetFooterMode(false); +useSetOnBack(() => { + navigate(PATHS.additionalService.alimtalk.list); +}); + +const onClickToSave = () => { + callSettingSave(); +}; + +// MID 초기값 설정 +useEffect(() => { + if (!mid && midOptionsWithoutGids.length > 0) { + // userMid가 옵션에 있으면 userMid 사용, 없으면 첫 번째 옵션 사용 + const midItem = midOptionsWithoutGids.filter((value) => value.value === userMid); + const initialMid = (midItem.length > 0) ? userMid : midOptionsWithoutGids[0]?.value || ''; + if (initialMid) { + setMid(initialMid); } - }, [midOptionsWithoutGids, userMid]); + } +}, [midOptionsWithoutGids, userMid]); - // mid가 설정되면 설정 정보 불러오기 - useEffect(() => { - if (mid) { - callSettingDetail(); - } - }, [mid]); +// mid가 설정되면 설정 정보 불러오기 +useEffect(() => { + if (mid) { + callSettingDetail(); + } +}, [mid]); - return ( - <> -
-
-
-
-
-
-
{t('additionalService.alimtalk.settingNotice1')}
-
{t('additionalService.alimtalk.settingNotice2')}
-
+return ( + <> +
+
+
+
+
+
+
{t('additionalService.alimtalk.settingNotice1')}
+
{t('additionalService.alimtalk.settingNotice2')}
+
-
-
{t('additionalService.alimtalk.merchant')}
-
- - -
-
- -
-
- {t('additionalService.alimtalk.sendToMerchant')} - {t('additionalService.alimtalk.sendToCustomer')} -
-
- -
- - - - - - - +
+
{t('additionalService.alimtalk.merchant')}
+
+ +
-
-
- + +
+
+ {t('additionalService.alimtalk.sendToMerchant')} + {t('additionalService.alimtalk.sendToCustomer')} +
+
+ +
+ + + + + + + +
+
+ +
-
- - ); +
+
+ +); }; \ No newline at end of file diff --git a/src/pages/additional-service/ars/detail-page.tsx b/src/pages/additional-service/ars/detail-page.tsx deleted file mode 100644 index f18cfd3..0000000 --- a/src/pages/additional-service/ars/detail-page.tsx +++ /dev/null @@ -1,181 +0,0 @@ -import { PATHS } from '@/shared/constants/paths'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { useTranslation } from 'react-i18next'; -import { HeaderType } from '@/entities/common/model/types'; -import { - useSetHeaderTitle, - useSetHeaderType, - useSetFooterMode, - useSetOnBack -} from '@/widgets/sub-layout/use-sub-layout'; -import { useLocation } from 'react-router'; -import { useEffect, useState } from 'react'; -import { NumericFormat } from 'react-number-format'; -import { useExtensionArsDetailMutation } from '@/entities/additional-service/api/ars/use-extension-ars-detail-mutation'; -import { - ExtensionArsDetailParams, - ExtensionArsDetailResponse, - ExtensionArsResendParams, - ExtensionArsResendResponse, - ArsPaymentMethod, - OrderStatus -} from '@/entities/additional-service/model/ars/types'; -import moment from 'moment'; -import { ArsResendSmsBottomSheet } from '@/entities/additional-service/ui/ars/resend-sms-bottom-sheet'; -import { useExtensionArsResendMutation } from '@/entities/additional-service/api/ars/use-extension-ars-resend-mutation'; -import { getArsOrderStatusName, getArsPaymentStatusName } from '@/entities/additional-service/model/ars/constant'; -import { snackBar } from '@/shared/lib'; - -export const ArsDetailPage = () => { - const { t, i18n } = useTranslation(); - const { navigate } = useNavigate(); - const location = useLocation(); - - const tid = location.state.tid; - const mid = location.state.mid; - - const [detail, setDetail] = useState(); - const [bottomSheetOn, setBottomSheetOn] = useState(false); - - const { mutateAsync: extensionArsDetail } = useExtensionArsDetailMutation(); - const { mutateAsync: extensionArsResend } = useExtensionArsResendMutation(); - const callDetail = () => { - let params: ExtensionArsDetailParams = { - tid: tid, - mid: mid, - }; - - extensionArsDetail(params).then((rs: ExtensionArsDetailResponse) => { - setDetail(rs); - }); - }; - - useSetHeaderTitle('ARS 결제 상세'); - useSetHeaderType(HeaderType.LeftArrow); - useSetFooterMode(false); - useSetOnBack(() => { - navigate(PATHS.additionalService.ars.list); - }); - - useEffect(() => { - callDetail(); - }, []); - - const onClickToOpenResendBottomSheet = () => { - setBottomSheetOn(true); - }; - - const getDate = (date?: string) => { - return (date)? moment(date.substr(0, 8)).format('YYYY.MM.DD'): ''; - }; - - const callResendSms = () => { - let params: ExtensionArsResendParams = { - mid: mid, - tid: tid - } - extensionArsResend(params).then((rs: ExtensionArsResendResponse) => { - if (rs.status) { - snackBar("SMS 재전송을 성공하였습니다."); - setBottomSheetOn(false); - callDetail(); // 상세 정보 갱신 - } else { - const errorMessage = rs.error?.message || 'SMS 재전송이 실패하였습니다.'; - snackBar(`[실패] ${errorMessage}`); - } - }).catch((error) => { - const errorMessage = error?.response?.data?.error?.message || - error?.message || - 'SMS 재전송 중 오류가 발생했습니다.'; - snackBar(`[실패] ${errorMessage}`); - }); - }; - - return ( - <> -
-
-
-
-
- - {t('home.money', { value: new Intl.NumberFormat('en-US').format(Number(detail?.amount) || 0) })} - -
-
{ detail?.corpName }
-
{ getDate(detail?.paymentDate) }
-
-
-
-
거래 정보
-
    -
  • - MID - { detail?.mid } -
  • -
  • - 결제방식 - { detail?.arsPaymentMethod } -
  • -
  • - 결제상태 - { getArsPaymentStatusName(t)(detail?.paymentStatus) } -
  • -
  • - 주문상태 - { getArsOrderStatusName(t)(detail?.orderStatus) } -
  • -
  • - 주문일시 - { - detail?.paymentDate ? moment(detail.paymentDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '-' - } -
  • -
  • - 상품명 - { detail?.goodsName } -
  • -
  • - 주문번호 - { detail?.tid } -
  • -
  • - 구매자 - { detail?.buyerName } -
  • -
  • - 휴대폰번호 - { detail?.maskPhoneNumber } -
  • -
  • - 이메일 - { detail?.email } -
  • -
  • - 발송 인증번호 - { detail?.smsVerificationCode } -
  • -
-
- {detail?.arsPaymentMethod === ArsPaymentMethod.SMS && ( -
- -
- )} -
-
-
- - - - ); -}; \ No newline at end of file diff --git a/src/pages/additional-service/ars/request-page.tsx b/src/pages/additional-service/ars/request-page.tsx index a849945..01ee2c9 100644 --- a/src/pages/additional-service/ars/request-page.tsx +++ b/src/pages/additional-service/ars/request-page.tsx @@ -17,6 +17,7 @@ import { ArsRequestSuccessPage } from './request-success-page'; import { useStore } from '@/shared/model/store'; import { snackBar } from '@/shared/lib'; import { NumericFormat, PatternFormat } from 'react-number-format'; +import { showAlert } from '@/widgets/show-alert'; export const ArsRequestPage = () => { const { t } = useTranslation(); @@ -69,9 +70,13 @@ export const ArsRequestPage = () => { snackBar(`[${t('common.failed')}] ${errorMessage}`); } }) - .catch((error) => { - const errorMsg = error?.response?.data?.message || error?.response?.data?.error?.message || t('additionalService.ars.requestFailed'); - snackBar(`[${t('common.failed')}] ${errorMsg}`); + .catch((e) => { + const errorMsg = e?.response?.data?.message || e?.response?.data?.error?.message || t('additionalService.ars.requestFailed'); + if (e.response?.data?.error?.root !== "SystemErrorCode") { + snackBar(`[${t('common.failed')}] ${errorMsg}`); + } else { + showAlert(`[${t('common.failed')}] ${errorMsg}`) + } }) }; diff --git a/src/pages/additional-service/fund-account/result-detail-page.tsx b/src/pages/additional-service/fund-account/result-detail-page.tsx deleted file mode 100644 index 756021e..0000000 --- a/src/pages/additional-service/fund-account/result-detail-page.tsx +++ /dev/null @@ -1,168 +0,0 @@ -import { PATHS } from '@/shared/constants/paths'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { useTranslation } from 'react-i18next'; -import { HeaderType } from '@/entities/common/model/types'; -import { - useSetHeaderTitle, - useSetHeaderType, - useSetFooterMode, - useSetOnBack -} from '@/widgets/sub-layout/use-sub-layout'; -import { useLocation } from 'react-router'; -import { useEffect, useState } from 'react'; -import { NumericFormat } from 'react-number-format'; -import { - ExtensionFundAccountDownloadReceiptParams, - ExtensionFundAccountDownloadReceiptResponse, - ExtensionFundAccountResultDetailParams, - ExtensionFundAccountResultDetailResponse, -} from '@/entities/additional-service/model/fund-account/types'; -import moment from 'moment'; -import { useExtensionFundAccountResultDetailMutation } from '@/entities/additional-service/api/fund-account/use-extension-fund-account-result-detail-mutation'; -import { useExtensionFundAccountDownloadReceiptMutation } from '@/entities/additional-service/api/fund-account/use-extension-fund-account-download-certificate-mutation'; -import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet'; - -export const FundAccountResultDetailPage = () => { - const { t, i18n } = useTranslation(); - const { navigate } = useNavigate(); - const location = useLocation(); - - const tid = location.state.tid; - const mid = location.state.mid; - - const [detail, setDetail] = useState(); - const [emailBottomSheetOn, setEmailBottomSheetOn] = useState(false); - - const { mutateAsync: extensionFundAccountResultDetail } = useExtensionFundAccountResultDetailMutation(); - const { mutateAsync: extensionFundAccountDownlaodReceipt } = useExtensionFundAccountDownloadReceiptMutation(); - - const callDetail = () => { - let params: ExtensionFundAccountResultDetailParams = { - mid: mid, - tid: tid, - }; - - extensionFundAccountResultDetail(params).then((rs: ExtensionFundAccountResultDetailResponse) => { - console.log(rs.requestDate) - setDetail(rs); - }); - }; - - const onClickToOpenEmailBottomSheet = () => { - setEmailBottomSheetOn(true); - }; - - const onSendRequest = (selectedEmail?: string) => { - if (selectedEmail) { - let params: ExtensionFundAccountDownloadReceiptParams = { - mid: mid, - tid: tid, - email: selectedEmail - }; - extensionFundAccountDownlaodReceipt(params).then((rs: ExtensionFundAccountDownloadReceiptResponse) => { - console.log('Receipt Download Status:', rs); - }); - } - setEmailBottomSheetOn(false); - }; - - useSetHeaderTitle(t('additionalService.fundAccount.transferDetailTitle')); - useSetHeaderType(HeaderType.LeftArrow); - useSetFooterMode(false); - useSetOnBack(() => { - navigate(PATHS.additionalService.fundAccount.resultList); - }); - - useEffect(() => { - callDetail(); - console.log(detail?.requestDate) - }, []); - - return ( - <> -
-
-
-
-
- - {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail?.amount || 0) })} - -
-
{detail?.accountName}({detail?.accountNo})
- {detail?.applicationDate && ( -
{moment(detail?.applicationDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss')}
- )} -
- {/* ✅ resultMessage가 "정상"일 때만 표시 */} - {detail?.resultMessage === '정상' && ( -
- -
- )} -
-
-
{t('additionalService.fundAccount.detailInfo')}
-
    -
  • - {t('additionalService.fundAccount.requestDateTime')} - {moment(detail?.requestDate,'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss')} -
  • -
  • - {t('additionalService.fundAccount.transferDateTime')} - {detail?.applicationDate ? moment(detail?.applicationDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '-'} -
  • -
  • - {t('additionalService.fundAccount.transferResult')} - {detail?.resultMessage || '-'} -
  • -
  • - {t('additionalService.fundAccount.failureReason')} - {detail?.failReason || '-'} -
  • -
  • - {t('additionalService.fundAccount.beneficiaryName')} - {detail?.accountName} -
  • -
  • - {t('additionalService.fundAccount.bank')} - {detail?.bankName} -
  • -
  • - {t('additionalService.fundAccount.accountNumber')} - {detail?.accountNo} -
  • -
  • - MID - {mid} -
  • -
  • - {t('transaction.fields.orderNumber')} - {detail?.moid} -
  • -
  • - TID - {detail?.tid} -
  • -
-
-
-
-
- - - ); -}; \ No newline at end of file diff --git a/src/pages/additional-service/fund-account/transfer-detail-page.tsx b/src/pages/additional-service/fund-account/transfer-detail-page.tsx deleted file mode 100644 index 3abed34..0000000 --- a/src/pages/additional-service/fund-account/transfer-detail-page.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import { PATHS } from '@/shared/constants/paths'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { useTranslation } from 'react-i18next'; -import { HeaderType } from '@/entities/common/model/types'; -import { - useSetHeaderTitle, - useSetHeaderType, - useSetFooterMode, - useSetOnBack -} from '@/widgets/sub-layout/use-sub-layout'; -import { useLocation } from 'react-router'; -import { useEffect, useState } from 'react'; -import { NumericFormat } from 'react-number-format'; -import { useExtensionFundAccountTransferDetailMutation } from '@/entities/additional-service/api/fund-account/use-extension-fund-account-transfer-detail-mutation'; -import { ExtensionFundAccountTransferDetailParams, ExtensionFundAccountTransferDetailResponse, ExtensionFundAccountTransferRegistParams, ExtensionFundAccountTransferRequestParams, ExtensionFundAccountTransferRequestResponse, FundAccountStatus } from '@/entities/additional-service/model/fund-account/types'; -import { getFundAccountStatusName } from '@/entities/additional-service/model/fund-account/constant'; -import moment from 'moment'; -import { snackBar } from '@/shared/lib'; -import { useExtensionFundAccountTransferRequestMutation } from '@/entities/additional-service/api/fund-account/use-extension-fund-account-transfer-request-mutation'; - -export const FundAccountTransferDetailPage = () => { - const { t, i18n } = useTranslation(); - const { navigate } = useNavigate(); - const location = useLocation(); - - const seq = location.state.seq; - - const [detail, setDetail] = useState(); - - const { mutateAsync: extensionFundAccountTransferDetail } = useExtensionFundAccountTransferDetailMutation(); - const { mutateAsync: extensionFundAccountTransferRequest } = useExtensionFundAccountTransferRequestMutation(); - - const callDetail = () => { - let params: ExtensionFundAccountTransferDetailParams = { - seq: seq - }; - - extensionFundAccountTransferDetail(params).then((rs: ExtensionFundAccountTransferDetailResponse) => { - setDetail(rs); - }); - }; - - useSetHeaderTitle(t('additionalService.fundAccount.transferDetailTitle')); - useSetHeaderType(HeaderType.LeftArrow); - useSetFooterMode(false); - useSetOnBack(() => { - navigate(PATHS.additionalService.fundAccount.transferList); - }); - - useEffect(() => { - callDetail(); - }, []); - - const onClickToRequest = () => { - let params: ExtensionFundAccountTransferRequestParams = { - seq: seq - }; - extensionFundAccountTransferRequest(params).then((rs: ExtensionFundAccountTransferRequestResponse) => { - if (rs.status) { - callDetail(); - snackBar(t('additionalService.fundAccount.transferRequestSuccess')) - } else { - const errorMessage = rs.error?.message || t('additionalService.fundAccount.transferRequestFailed'); - snackBar(`[${t('common.failed')}] ${errorMessage}`); - } - }).catch((error) => { - const errorMessage = error?.response?.data?.error?.message || - error?.message || - t('additionalService.fundAccount.transferRequestError'); - snackBar(`[${t('common.failed')}] ${errorMessage}`); - }); - }; - - return ( - <> -
-
-
-
-
- - {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail?.amount || 0) })} - -
-
{detail?.accountName}({detail?.accountNo})
-
- {detail?.registDate ? moment(detail.registDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '-'} -
-
-
-
-
{t('additionalService.fundAccount.detailInfo')}
-
    -
  • - {t('additionalService.fundAccount.registrationDateTime')} - - {detail?.registDate ? moment(detail.registDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss') : '-'} - -
  • -
  • - {t('additionalService.fundAccount.processingResult')} - {getFundAccountStatusName(t)(detail?.resultStatus) || '-'} -
  • -
  • - {t('additionalService.fundAccount.requestDate')} - - {detail?.requestDate ? moment(detail.requestDate, 'YYYYMMDDHHmmss').format('YYYY.MM.DD') : '-'} - -
  • -
  • - {t('additionalService.fundAccount.transferResult')} - {detail?.resultMessage || '-'} -
  • -
  • - {t('additionalService.fundAccount.beneficiaryName')} - {detail?.accountName} -
  • -
  • - {t('additionalService.fundAccount.bank')} - {detail?.bankCode || '-'} -
  • -
  • - {t('additionalService.fundAccount.accountNumber')} - {detail?.accountNo} -
  • -
  • - MID - {detail?.mid} -
  • - -
-
-
- -
-
-
-
- - ); -}; \ No newline at end of file diff --git a/src/pages/additional-service/fund-account/transfer-request-page.tsx b/src/pages/additional-service/fund-account/transfer-request-page.tsx index 33b45d9..86594c1 100644 --- a/src/pages/additional-service/fund-account/transfer-request-page.tsx +++ b/src/pages/additional-service/fund-account/transfer-request-page.tsx @@ -15,6 +15,7 @@ import { snackBar } from '@/shared/lib'; import { useExtensionFundAccountTransferRegistMutation } from '@/entities/additional-service/api/fund-account/use-extension-fund-account-transfer-regist-mutation'; import { NumericFormat } from 'react-number-format'; import { useExtensionFundAccountTransferRequestMutation } from '@/entities/additional-service/api/fund-account/use-extension-fund-account-transfer-request-mutation'; +import { showAlert } from '@/widgets/show-alert'; export const FundAccountTransferRequestPage = () => { @@ -80,11 +81,14 @@ export const FundAccountTransferRequestPage = () => { const errorMessage = rs.error?.message || t('additionalService.fundAccount.registrationFailed'); snackBar(`[${t('common.failed')}] ${errorMessage}`); } - }).catch((error) => { - const errorMessage = error?.response?.data?.error?.message || - error?.message || - t('additionalService.fundAccount.registrationError'); - snackBar(`[${t('common.failed')}] ${errorMessage}`); + }).catch((e) => { + console.log(e) + const errorMessage = e?.response?.data?.error?.message || e?.message || t('additionalService.fundAccount.registrationError'); + if (e.response?.data?.error?.root !== "SystemErrorCode") { + snackBar(`[${t('common.failed')}] ${errorMessage}`); + } else { + showAlert(`[${t('common.failed')}] ${errorMessage}`) + } }); }; diff --git a/src/pages/additional-service/key-in-payment/requeset-page.tsx b/src/pages/additional-service/key-in-payment/requeset-page.tsx index 4d12132..aaa7e20 100644 --- a/src/pages/additional-service/key-in-payment/requeset-page.tsx +++ b/src/pages/additional-service/key-in-payment/requeset-page.tsx @@ -17,6 +17,7 @@ import { useStore } from '@/shared/model/store'; import { snackBar } from '@/shared/lib'; import { NumericFormat, PatternFormat } from 'react-number-format'; import { useTranslation } from 'react-i18next'; +import { showAlert } from '@/widgets/show-alert'; export const KeyInPaymentRequestPage = () => { const { t } = useTranslation(); @@ -94,21 +95,25 @@ export const KeyInPaymentRequestPage = () => { } else { // 실패: 화면 유지 & 입력 내용 유지 const errorMessage = rs.data?.resultMessage || - rs.error?.message || - rs.resultMessage|| - t('additionalService.keyIn.requestFailed'); + rs.error?.message || + rs.resultMessage || + t('additionalService.keyIn.requestFailed'); console.log('최종 errorMessage:', errorMessage); // HTML 태그 제거 const cleanMessage = errorMessage.replace(//gi, ' ').trim(); snackBar(`[${t('common.failed')}] ${cleanMessage}`); } }).catch((error) => { - console.error('결제 실패:', error); + console.error(error); const errorMessage = error?.response?.data?.data?.resultMessage || - error?.response?.data?.error?.message || - error?.message || - t('additionalService.keyIn.requestError'); - snackBar(`[${t('common.failed')}] ${errorMessage}`); + error?.response?.data?.error?.message || + error?.message || + t('additionalService.keyIn.requestError'); + if (error.response?.data?.error?.root !== "SystemErrorCode") { + snackBar(`[${t('common.failed')}] ${errorMessage}`); + } else { + showAlert(`[${t('common.failed')}] ${errorMessage}`) + } }); }; @@ -199,8 +204,8 @@ export const KeyInPaymentRequestPage = () => { allowNegative={false} displayType="input" onValueChange={(values) => { - const { floatValue} = values; - setAmount( floatValue ?? 0); + const { floatValue } = values; + setAmount(floatValue ?? 0); }} > diff --git a/src/pages/additional-service/link-payment/apply/link-payment-apply-confirm-page.tsx b/src/pages/additional-service/link-payment/apply/link-payment-apply-confirm-page.tsx index 59d17b0..0fc21c3 100644 --- a/src/pages/additional-service/link-payment/apply/link-payment-apply-confirm-page.tsx +++ b/src/pages/additional-service/link-payment/apply/link-payment-apply-confirm-page.tsx @@ -8,6 +8,7 @@ import { PATHS } from '@/shared/constants/paths'; import { useExtensionLinkPayRequestMutation } from '@/entities/additional-service/api/link-payment/use-extension-link-pay-request-mutation'; import { ExtensionLinkPayRequestParams, ExtensionLinkPayRequestResponse, LinkPaymentFormData } from '@/entities/additional-service/model/link-pay/types'; import { snackBar } from '@/shared/lib'; +import { showAlert } from '@/widgets/show-alert'; export const LinkPaymentApplyConfirmPage = () => { const { t } = useTranslation(); @@ -60,11 +61,14 @@ export const LinkPaymentApplyConfirmPage = () => { } }) .catch((error) => { - // 네트워크 에러 등 예외 상황 const errorMessage = error?.response?.data?.error?.message || error?.message || t('additionalService.linkPayment.requestError'); - snackBar(`[${t('common.failed')}] ${errorMessage}`); + if (error.response?.data?.error?.root !== "SystemErrorCode") { + snackBar(`[${t('common.failed')}] ${errorMessage}`); + } else { + showAlert(`[${t('common.failed')}] ${errorMessage}`) + } }); }; diff --git a/src/pages/additional-service/link-payment/link-payment-detail-page.tsx b/src/pages/additional-service/link-payment/link-payment-detail-page.tsx deleted file mode 100644 index 4cc0139..0000000 --- a/src/pages/additional-service/link-payment/link-payment-detail-page.tsx +++ /dev/null @@ -1,179 +0,0 @@ -import { useEffect, useState } from 'react'; -import { PATHS } from '@/shared/constants/paths'; -import { useLocation } from 'react-router'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { HeaderType } from '@/entities/common/model/types'; -import { - useSetOnBack, - useSetHeaderTitle, - useSetHeaderType, - useSetFooterMode -} from '@/widgets/sub-layout/use-sub-layout'; -import { overlay } from 'overlay-kit'; -import { Dialog } from '@/shared/ui/dialogs/dialog'; -import { useExtensionLinkPayHistoryDetailMutation } from '@/entities/additional-service/api/link-payment/use-extension-link-pay-history-detail-mutation'; -import { AdditionalServiceCategory, DetailInfo, DetailResponse, PaymentInfo, TitleInfo } from '@/entities/additional-service/model/types'; -import { TitleInfoWrap } from '@/entities/additional-service/ui/info-wrap/title-info-wrap'; -import { PaymentInfoWrap } from '@/entities/additional-service/ui/info-wrap/payment-info-wrap'; -import { DetailInfoWrap } from '@/entities/additional-service/ui/info-wrap/detail-info-wrap'; -import { useExtensionLinkPayHistoryResendMutation } from '@/entities/additional-service/api/link-payment/use-extension-link-pay-history-resend-mutation'; -import { ExtensionLinkPayHistoryDetailParams, ExtensionLinkPayHistoryResendParams } from '@/entities/additional-service/model/link-pay/types'; -import { snackBar } from '@/shared/lib'; -import moment from 'moment'; -import { useTranslation } from 'react-i18next'; - -export const LinkPaymentDetailPage = () => { - const { t } = useTranslation(); - const { navigate } = useNavigate(); - const location = useLocation(); - - const { mid, tid, requestId, subReqId } = location.state || {}; - - const [titleInfo, setTitleInfo] = useState(); - const [detailInfo, setDetailInfo] = useState(); - const [paymentInfo, setPaymentInfo] = useState(); - const [detailExposure, setDetailExposure] = useState(false); - const [showPayment, setShowPayment] = useState(false); - - useSetHeaderTitle(t('additionalService.linkPayment.detailTitle')); - useSetHeaderType(HeaderType.RightClose); - useSetOnBack(() => { - navigate(-1); // Go back using browser history - }); - useSetFooterMode(false); - - const { mutateAsync: linkPayHistoryDetail } = useExtensionLinkPayHistoryDetailMutation(); - const { mutateAsync: linkPayHistoryResend } = useExtensionLinkPayHistoryResendMutation(); - - // Query detail information - const callDetail = () => { - let detailParam: ExtensionLinkPayHistoryDetailParams = { - mid: mid, - requestId: requestId, - subReqId: subReqId - } - linkPayHistoryDetail(detailParam).then((rs: DetailResponse) => { - console.log("Detail Info: ", rs) - setTitleInfo(rs.titleInfo) - setDetailInfo(rs.detailInfo) - setPaymentInfo(rs.paymentInfo) - setDetailExposure(rs.detailExposure ?? false) - }) - } - - // Resend API - const resendPayment = () => { - let resendParam: ExtensionLinkPayHistoryResendParams = { - mid: mid, - requestId: requestId, - sendMethod: paymentInfo?.sendMethod - } - linkPayHistoryResend(resendParam) - .then((response) => { - if (response.status) { - snackBar(t('additionalService.linkPayment.resendSuccess')); - callDetail(); - } else { - const errorMessage = response.error?.message || t('additionalService.linkPayment.resendFailed'); - snackBar(`[${t('common.failed')}] ${errorMessage}`); - } - }) - .catch((error) => { - const errorMessage = error?.response?.data?.error?.message || - error?.message || - t('additionalService.linkPayment.resendError'); - snackBar(`[${t('common.failed')}] ${errorMessage}`); - }); - } - - const onClickToResend = () => { - let msg = t('additionalService.linkPayment.resendConfirm'); - - overlay.open(({ - isOpen, - close, - unmount - }) => { - return ( - resendPayment()} - message={msg} - buttonLabel={[t('common.cancel'), t('common.confirm')]} - /> - ); - }); - }; - - const onClickToSeparateApproval = () => { - navigate(PATHS.additionalService.linkPayment.separateApproval, { - state: { mid, requestId } - }); - }; - - // Check if resend button should be enabled - const isResendEnabled = () => { - // paymentStatus must be "ACTIVE" - if (paymentInfo?.paymentStatus !== 'ACTIVE') { - return false; - } - - // paymentLimitDate must not have passed today's date - if (paymentInfo?.paymentLimitDate) { - const limitDate = moment(paymentInfo.paymentLimitDate, 'YYYYMMDD'); - const today = moment().startOf('day'); - return limitDate.isSameOrAfter(today); - } - - return false; - }; - - useEffect(() => { - callDetail(); - }, []); - return ( - <> -
-
-
-
- -
-
-
- -
- -
-
- -
-
-
- -
-
-
-
- - ) -}; \ No newline at end of file diff --git a/src/pages/additional-service/link-payment/link-payment-wait-detail-page.tsx b/src/pages/additional-service/link-payment/link-payment-wait-detail-page.tsx deleted file mode 100644 index 5843c17..0000000 --- a/src/pages/additional-service/link-payment/link-payment-wait-detail-page.tsx +++ /dev/null @@ -1,124 +0,0 @@ -import { useEffect, useState } from 'react'; -import { PATHS } from '@/shared/constants/paths'; -import { useLocation } from 'react-router'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { HeaderType } from '@/entities/common/model/types'; -import { - useSetOnBack, - useSetHeaderTitle, - useSetHeaderType, - useSetFooterMode -} from '@/widgets/sub-layout/use-sub-layout'; -import { overlay } from 'overlay-kit'; -import { Dialog } from '@/shared/ui/dialogs/dialog'; -import { TitleInfoWrap } from '@/entities/additional-service/ui/info-wrap/title-info-wrap'; -import { AdditionalServiceCategory, DetailResponse, PaymentInfo, TitleInfo } from '@/entities/additional-service/model/types'; -import { useExtensionLinkPayWaitDetailMutation, } from '@/entities/additional-service/api/link-payment/use-extension-link-pay-wait-detail-mutation'; -import { PaymentInfoWrap } from '@/entities/additional-service/ui/info-wrap/payment-info-wrap'; -import { useExtensionLinkPayWaitDeleteMutation } from '@/entities/additional-service/api/link-payment/use-extension-link-pay-wait-delete-mutation'; -import { ExtensionLinkPayWaitDeleteParams, ExtensionLinkPayWaitDetailParams, LinkPaymentProcessStatus } from '@/entities/additional-service/model/link-pay/types'; -import { snackBar } from '@/shared/lib'; -import { useTranslation } from 'react-i18next'; - -export const LinkPaymentWaitDetailPage = () => { - const { t } = useTranslation(); - const { navigate } = useNavigate(); - const location = useLocation(); - const { mid, requestId } = location.state || {}; - const [titleInfo, setTitleInfo] = useState(); - const [paymentInfo, setPaymentInfo] = useState(); - - useSetHeaderTitle(t('additionalService.linkPayment.waitDetailTitle')); - useSetHeaderType(HeaderType.RightClose); - useSetOnBack(() => { - navigate(PATHS.additionalService.linkPayment.pendingSend); - }); - useSetFooterMode(false); - - const { mutateAsync: linkPayWaitDetail } = useExtensionLinkPayWaitDetailMutation(); - const { mutateAsync: linkPayWaitDelete } = useExtensionLinkPayWaitDeleteMutation(); - - const callDetail = () => { - let detailParam: ExtensionLinkPayWaitDetailParams = { - mid: mid, - requestId: requestId - } - - linkPayWaitDetail(detailParam).then((rs: DetailResponse) => { - setTitleInfo(rs.titleInfo) - setPaymentInfo(rs.paymentInfo) - }) - - } - - const deletePayment = () => { - let deleteParam: ExtensionLinkPayWaitDeleteParams = { - mid: mid, - requestId: requestId - } - linkPayWaitDelete(deleteParam) - .then((rs) => { - callDetail(); - snackBar(t('additionalService.linkPayment.deleteSuccess')) - }) - .catch((error) => { - snackBar(`[${t('common.failed')}] ${error?.response?.data?.message}`) - }); - } - - const onClickToCancel = () => { - let msg = t('additionalService.linkPayment.deleteConfirm'); - - overlay.open(({ - isOpen, - close, - unmount - }) => { - return ( - deletePayment()} - message={msg} - buttonLabel={[t('common.cancel'), t('common.confirm')]} - /> - ); - }); - }; - - useEffect(() => { - callDetail(); - }, []); - - return ( - <> -
-
-
-
- -
-
-
- -
-
-
- -
-
-
- - ) -}; \ No newline at end of file diff --git a/src/pages/additional-service/payout/detail-page.tsx b/src/pages/additional-service/payout/detail-page.tsx deleted file mode 100644 index 795424a..0000000 --- a/src/pages/additional-service/payout/detail-page.tsx +++ /dev/null @@ -1,190 +0,0 @@ -import { PATHS } from '@/shared/constants/paths'; -import { useNavigate } from '@/shared/lib/hooks/use-navigate'; -import { useTranslation } from 'react-i18next'; -import { HeaderType } from '@/entities/common/model/types'; -import { - useSetHeaderTitle, - useSetHeaderType, - useSetFooterMode, - useSetOnBack -} from '@/widgets/sub-layout/use-sub-layout'; -import { useExtensionPayoutDetailMutation } from '@/entities/additional-service/api/payout/use-extension-payout-detail-mutation'; -import { useLocation } from 'react-router'; -import { ExtensionPayoutDetailDownloadCertificateParams, ExtensionPayoutDetailDownloadCertificateResponse, ExtensionPayoutDetailParams, ExtensionPayoutDetailResponse } from '@/entities/additional-service/model/payout/types'; -import { useEffect, useState } from 'react'; -import { NumericFormat } from 'react-number-format'; -import { useExtensionPayoutDetailDownloadCertificateMutation } from '@/entities/additional-service/api/payout/use-extension-payout-detail-download-cetificate-mutation'; -import moment from 'moment'; -import { EmailBottomSheet } from '@/entities/common/ui/email-bottom-sheet'; -import { DownloadTypeBottomSheet } from '@/entities/common/ui/download-type-bottom-sheet'; - -export const PayoutDetailPage = () => { - const { t, i18n } = useTranslation(); - const { navigate } = useNavigate(); - const location = useLocation(); - - const tid = location.state.tid; - const mid = location.state.mid; - - const [detail, setDetail] = useState(); - const [downloadTypeBottomSheetOn, setDownloadTypeBottomSheetOn] = useState(false); - const [emailBottomSheetOn, setEmailBottomSheetOn] = useState(false); - - const { mutateAsync: extensionPayoutDetail } = useExtensionPayoutDetailMutation(); - const { mutateAsync: extensionPayoutDetailDownloadCertification } = useExtensionPayoutDetailDownloadCertificateMutation(); - - const callDetail = () => { - let params: ExtensionPayoutDetailParams = { - tid: tid, - mid: mid, - }; - - extensionPayoutDetail(params).then((rs: ExtensionPayoutDetailResponse) => { - setDetail(rs); - }); - }; - - useSetHeaderTitle(t('additionalService.payout.detailTitle')); - useSetHeaderType(HeaderType.LeftArrow); - useSetFooterMode(false); - useSetOnBack(() => { - navigate(PATHS.additionalService.payout.list); - }); - - const onClickToDownload = () => { - setDownloadTypeBottomSheetOn(true); - }; - - const onSelectDownloadType = (type: 'IMAGE' | 'EMAIL') => { - if (type === 'IMAGE') { - // Save image directly - const params: ExtensionPayoutDetailDownloadCertificateParams = { - mid: mid, - tid: tid, - requestType: 'IMAGE', - email: '' - }; - extensionPayoutDetailDownloadCertification(params) - .then((rs: ExtensionPayoutDetailDownloadCertificateResponse) => { - console.log('Certificate Download Status:', rs); - }) - .catch((error) => { - console.error('Certificate Download Failed:', error); - }); - } else { - // Open EmailBottomSheet for email option - setEmailBottomSheetOn(true); - } - }; - - const onSendRequest = (selectedEmail?: string) => { - if (selectedEmail) { - const params: ExtensionPayoutDetailDownloadCertificateParams = { - mid: mid, - tid: tid, - requestType: 'EMAIL', - email: selectedEmail - }; - extensionPayoutDetailDownloadCertification(params) - .then((rs: ExtensionPayoutDetailDownloadCertificateResponse) => { - console.log('Certificate Download Status:', rs); - }) - .catch((error) => { - console.error('Certificate Download Failed:', error); - }); - } - setEmailBottomSheetOn(false); - }; - - useEffect(() => { - callDetail(); - }, []); - - return ( - <> -
-
-
-
-
- - {t('home.money', { value: new Intl.NumberFormat('en-US').format(detail?.disbursementAmount || 0) })} - -
-
{detail?.companyName}
-
{detail?.settlementDate}
-
- -
-
-
-
-
{t('additionalService.payout.detailInfo')}
-
    -
  • - {t('additionalService.payout.disbursementStatus')} - { detail?.disbursementStatus } -
  • -
  • - {t('additionalService.payout.transactionType')} - { detail?.transTypeName } -
  • -
  • - {t('common.requestDate')} - { moment(detail?.requestDate).format('YYYY.MM.DD') } -
  • -
  • - {t('additionalService.payout.disbursementDateTime')} - {moment(detail?.settlementDateTime,'YYYYMMDDHHmmss').format('YYYY.MM.DD HH:mm:ss')} -
  • -
  • - {t('additionalService.payout.businessNumber')} - { detail?.companyNo } -
  • -
  • - {t('additionalService.payout.accountHolder')} - { detail?.accountName } -
  • -
  • - {t('additionalService.payout.bank')} - { detail?.bankName } -
  • -
  • - {t('additionalService.payout.accountNumber')} - { detail?.accountNo } -
  • -
  • - {t('additionalService.payout.depositor')} - { detail?.depositName } -
  • -
  • - {t('additionalService.payout.failureReason')} - { detail?.failReason } -
  • -
-
-
-
-
- - - - ); -}; \ No newline at end of file diff --git a/src/pages/additional-service/payout/request-page.tsx b/src/pages/additional-service/payout/request-page.tsx index 486a385..e22c47e 100644 --- a/src/pages/additional-service/payout/request-page.tsx +++ b/src/pages/additional-service/payout/request-page.tsx @@ -17,6 +17,7 @@ import moment from 'moment'; import { NumericFormat } from "react-number-format"; import { snackBar } from "@/shared/lib"; import { useTranslation } from 'react-i18next'; +import { showAlert } from "@/widgets/show-alert"; export const PayoutRequestPage = () => { const { t } = useTranslation(); @@ -53,10 +54,15 @@ export const PayoutRequestPage = () => { snackBar(`[${t('common.failed')}] ${rs.error?.message}`) } }) - .catch((error) => { - snackBar(`[${t('common.failed')}] ${error?.response?.data?.message} ` || `[${t('common.failed')}] ${t('additionalService.payout.requestFailed')}`) - }) - ; + .catch((e) => { + console.log(e) + if (e.response?.data?.error?.root !== "SystemErrorCode") { + snackBar(`[${t('common.failed')}] ${e.response?.data?.error?.message}`) + } else { + showAlert(`[${t('common.failed')}] ${e?.response?.data?.error?.message} ` || `[${t('common.failed')}] ${t('additionalService.payout.requestFailed')}`); + return; + } + }); }; const isFormValid = () => {