diff --git a/src/entities/additional-service/model/account-holder-search/types.ts b/src/entities/additional-service/model/account-holder-search/types.ts index b33c912..3dd9699 100644 --- a/src/entities/additional-service/model/account-holder-search/types.ts +++ b/src/entities/additional-service/model/account-holder-search/types.ts @@ -84,6 +84,17 @@ export interface ExtensionAccountHolderSearchRequestParams extends ExtensionRequ export interface ExtensionAccountHolderSearchRequestResponse { status: boolean; + data?: string; + error?: { + root?: string; + errKey?: string; + code?: string; + message?: string; + timestamp?: string; + details?: { + [key: string]: string; + }; + }; } export interface ExtensionAccountHolderSearchDownloadExcelParams extends ExtensionRequestParams { // Request diff --git a/src/entities/additional-service/model/fund-account/types.ts b/src/entities/additional-service/model/fund-account/types.ts index 9214370..d03e968 100644 --- a/src/entities/additional-service/model/fund-account/types.ts +++ b/src/entities/additional-service/model/fund-account/types.ts @@ -32,6 +32,17 @@ export interface ExtensionFundAccountTransferRegistParams { export interface ExtensionFundAccountTransferRegistResponse { status: boolean; + data?: string; + error?: { + root?: string; + errKey?: string; + code?: string; + message?: string; + timestamp?: string; + details?: { + [key: string]: string; + }; + }; }; export interface ExtensionFundAccountTransferRequestParams { @@ -39,7 +50,18 @@ export interface ExtensionFundAccountTransferRequestParams { } export interface ExtensionFundAccountTransferRequestResponse { - status: boolean + status: boolean; + data?: string; + error?: { + root?: string; + errKey?: string; + code?: string; + message?: string; + timestamp?: string; + details?: { + [key: string]: string; + }; + }; } export enum FundAccountSearchCl { diff --git a/src/entities/additional-service/model/key-in/types.ts b/src/entities/additional-service/model/key-in/types.ts index a0edac0..1b1e144 100644 --- a/src/entities/additional-service/model/key-in/types.ts +++ b/src/entities/additional-service/model/key-in/types.ts @@ -105,4 +105,30 @@ export interface ExtensionKeyinApplyParams extends ExtensionRequestParams { export interface ExtensionKeyinApplyResponse { status: boolean; + data?: { + tid?: string | null; + approvalNumber?: string | null; + approvalDateTime?: string | null; + resultCode?: string; + resultMessage?: string; + cardName?: string | null; + cardCode?: string | null; + amount?: number | null; + installmentMonth?: string | null; + merchantNumber?: string | null; + acquirerCode?: string | null; + acquirerName?: string | null; + slipNumber?: string | null; + success?: boolean; + } + error?: { + root?: string; + errKey?: string; + code?: string; + resultMessage?: string; + timestamp?: string; + details?: { + path?: string; + }; + }; } \ No newline at end of file diff --git a/src/entities/additional-service/model/link-pay/types.ts b/src/entities/additional-service/model/link-pay/types.ts index c97b715..a961605 100644 --- a/src/entities/additional-service/model/link-pay/types.ts +++ b/src/entities/additional-service/model/link-pay/types.ts @@ -198,7 +198,19 @@ export interface ExtensionLinkPayRequestParams extends ExtensionRequestParams { } export interface ExtensionLinkPayRequestResponse { - status: boolean + status: boolean; + error?: { + root?: string; + errKey?: string; + code?: string; + message?: string; + timestamp?: string; + details?: { + validationErrors?: { + [key: string]: string; + } + } + } } export interface LinkPaymentFormData { diff --git a/src/entities/additional-service/model/payout/types.ts b/src/entities/additional-service/model/payout/types.ts index 56c7a8a..b0c7c10 100644 --- a/src/entities/additional-service/model/payout/types.ts +++ b/src/entities/additional-service/model/payout/types.ts @@ -8,6 +8,10 @@ export interface ExtensionPayoutRequestParams { }; export interface ExtensionPayoutRequestResponse { status: boolean; + + error?: { + message?: string + } }; export enum PayoutSearchDateType { REQUEST_DATE = 'REQUEST_DATE', diff --git a/src/entities/additional-service/ui/link-payment/apply/link-payment-step1.tsx b/src/entities/additional-service/ui/link-payment/apply/link-payment-step1.tsx index 2c5c5e8..06df058 100644 --- a/src/entities/additional-service/ui/link-payment/apply/link-payment-step1.tsx +++ b/src/entities/additional-service/ui/link-payment/apply/link-payment-step1.tsx @@ -3,6 +3,8 @@ import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { useSetOnBack } from '@/widgets/sub-layout/use-sub-layout'; import { SingleDatePicker } from '@/shared/ui/filter/single-date-picker'; import { LinkPaymentFormData, LinkPaymentSendMethod } from '@/entities/additional-service/model/link-pay/types'; +import { NumericFormat } from 'react-number-format'; +import { ChangeEvent } from 'react'; interface LinkPaymentStep1Props { formData: LinkPaymentFormData; @@ -25,9 +27,7 @@ export const LinkPaymentStep1 = ({ formData, setFormData }: LinkPaymentStep1Prop }; const handleAmountChange = (value: string) => { - // 숫자만 추출 const onlyNumbers = value.replace(/[^0-9]/g, ''); - // 빈 문자열이면 0, 아니면 숫자로 변환 (앞의 0 제거됨) const numericValue = onlyNumbers === '' ? 0 : parseInt(onlyNumbers, 10); setFormData({ ...formData, amount: numericValue }); }; @@ -93,13 +93,15 @@ export const LinkPaymentStep1 = ({ formData, setFormData }: LinkPaymentStep1Prop
상품가격
- handleAmountChange(e.target.value)} - inputMode="numeric" - pattern="[0-9]*" + { + const { floatValue } = values; + setFormData({...formData, amount: floatValue ?? 0}); + }} />
diff --git a/src/entities/additional-service/ui/link-payment/apply/link-payment-step2.tsx b/src/entities/additional-service/ui/link-payment/apply/link-payment-step2.tsx index fa5b4fc..15edb0f 100644 --- a/src/entities/additional-service/ui/link-payment/apply/link-payment-step2.tsx +++ b/src/entities/additional-service/ui/link-payment/apply/link-payment-step2.tsx @@ -1,7 +1,8 @@ -import {ProcessStep} from "@/entities/transaction/model/types"; -import {useSetOnBack} from "@/widgets/sub-layout/use-sub-layout"; +import { ProcessStep } from "@/entities/transaction/model/types"; +import { useSetOnBack } from "@/widgets/sub-layout/use-sub-layout"; import { IdentityType, Language } from '@/entities/additional-service/model/types' import { LinkContentType, LinkPaymentFormData } from "@/entities/additional-service/model/link-pay/types"; +import { PatternFormat } from 'react-number-format'; export interface LinkPaymentStep2Props { setProcessStep: ((processStep: ProcessStep) => void); @@ -18,6 +19,7 @@ export const LinkPaymentStep2 = ({ setProcessStep(ProcessStep.One); }); + const handleInputChange = (field: string, value: string) => { setFormData({ ...formData, [field]: value }); }; @@ -53,34 +55,39 @@ export const LinkPaymentStep2 = ({ -
-
구매자 이메일
-
- handleInputChange('email', e.target.value)} - /> + {formData.sendMethod === 'EMAIL' && +
+
구매자 이메일
+
+ handleInputChange('email', e.target.value)} + /> +
-
+ } -
-
구매자
휴대폰 번호
-
- handleInputChange('phoneNumber', e.target.value)} - /> + {(formData.sendMethod === 'SMS' || formData.sendMethod === 'KAKAO') && +
+
구매자
휴대폰 번호
+
+ handleInputChange('phoneNumber', e.target.value)} + /> +
-
+ } +
구매자 정보 대조
@@ -89,14 +96,16 @@ export const LinkPaymentStep2 = ({
handleIdendityTypeChange(IdentityType.INDIVIDUAL)} + className={`keyword-tag flex-1 ${formData.identityType === IdentityType.INDIVIDUAL ? 'active' : ''} ${!formData.isIdentity ? 'disabled' : ''}`} + onClick={() => formData.isIdentity && handleIdendityTypeChange(IdentityType.INDIVIDUAL)} + style={!formData.isIdentity ? { opacity: 0.5, cursor: 'not-allowed' } : {}} > 개인 handleIdendityTypeChange(IdentityType.CORPORATE)} + className={`keyword-tag flex-1 ${formData.identityType === IdentityType.CORPORATE ? 'active' : ''} ${!formData.isIdentity ? 'disabled' : ''}`} + onClick={() => formData.isIdentity && handleIdendityTypeChange(IdentityType.CORPORATE)} + style={!formData.isIdentity ? { opacity: 0.5, cursor: 'not-allowed' } : {}} > 법인 @@ -107,12 +116,31 @@ export const LinkPaymentStep2 = ({
- handleInputChange('identityValue', e.target.value)} - /> + {formData.identityType === IdentityType.CORPORATE ? ( + { + const { value } = values; + handleInputChange('identityValue', value); + }} + disabled={!formData.isIdentity} + /> + ) : ( + { + const { value } = values; + handleInputChange('identityValue', value); + }} + disabled={!formData.isIdentity} + /> + )}
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 f3da068..e156fd6 100644 --- a/src/pages/additional-service/account-holder-search/request-page.tsx +++ b/src/pages/additional-service/account-holder-search/request-page.tsx @@ -11,6 +11,8 @@ import { import { useExtensionAccountHolderSearchRequestMutation } from '@/entities/additional-service/api/account-holder-search/use-extension-account-holder-search-reqeust-mutation'; import { ExtensionAccountHolderSearchRequestParams } from '@/entities/additional-service/model/account-holder-search/types'; import { useStore } from '@/shared/model/store'; +import { NumericFormat } from 'react-number-format'; +import { snackBar } from '@/shared/lib'; export const AccountHolderSearchRequestPage = () => { const { navigate } = useNavigate(); @@ -48,11 +50,21 @@ export const AccountHolderSearchRequestPage = () => { accountHolderSearchRequest(reuqestParams) .then((response) => { - console.log("계좌성명 조회 조회 신청 성공 응답: ", response.status) - navigate(PATHS.additionalService.accountHolderSearch.list); + if (response.status) { + console.log("계좌성명 조회 조회 신청 성공 응답: ", response.status) + snackBar("계좌성명 조회 신청을 성공하였습니다.") + navigate(PATHS.additionalService.accountHolderSearch.list); + } else { + const errorMessage = response.error?.message || '계좌성명 조회 신청이 실패하였습니다.'; + snackBar(`[실패] ${errorMessage}`); + } }) .catch((error) => { console.error("계좌성명 조회 조회 신청 실패: ", error) + const errorMessage = error?.response?.data?.error?.message || + error?.message || + '계좌성명 조회 신청 중 오류가 발생했습니다.'; + snackBar(`[실패] ${errorMessage}`); }) }; @@ -109,12 +121,19 @@ export const AccountHolderSearchRequestPage = () => {
계좌번호
- handleInputChange('accountNo', e.target.value)} - > + valueIsNumericString + allowNegative={false} + decimalScale={0} + isAllowed={(values) => { + const { value } = values; + return !value || value.length <= 14; + }} + onValueChange={(values) => { + setFormData({ ...formData, accountNo: values.value }); + }} + />
diff --git a/src/pages/additional-service/ars/request-page.tsx b/src/pages/additional-service/ars/request-page.tsx index 2313827..7c4e6f7 100644 --- a/src/pages/additional-service/ars/request-page.tsx +++ b/src/pages/additional-service/ars/request-page.tsx @@ -15,6 +15,7 @@ import { ArsPaymentMethod, ExtensionArsApplyParams, ExtensionArsApplyResponse } import { ArsRequestSuccessPage } from './request-success-page'; import { useStore } from '@/shared/model/store'; import { snackBar } from '@/shared/lib'; +import { NumericFormat, PatternFormat } from 'react-number-format'; export const ArsRequestPage = () => { const { navigate } = useNavigate(); @@ -58,17 +59,17 @@ export const ArsRequestPage = () => { arsPaymentMethod: arsPaymentMethod, }; arsApply(arsApplyParams) - .then((rs: ExtensionArsApplyResponse) => { - if (rs.status === true) { - setSuccessPageOn(true); - } else { - const errorMessage = rs.error?.message || '신청을 실패하였습니다.'; - snackBar(`[실패] ${errorMessage}`); - } - }) - .catch((error) => { - snackBar(`[실패] ${error?.response?.data?.message || error?.response?.data?.error?.message}` || '[실패] 신청을 실패하였습니다.') - }) + .then((rs: ExtensionArsApplyResponse) => { + if (rs.status === true) { + setSuccessPageOn(true); + } else { + const errorMessage = rs.error?.message || '신청을 실패하였습니다.'; + snackBar(`[실패] ${errorMessage}`); + } + }) + .catch((error) => { + snackBar(`[실패] ${error?.response?.data?.message || error?.response?.data?.error?.message}` || '[실패] 신청을 실패하였습니다.') + }) }; @@ -82,6 +83,11 @@ export const ArsRequestPage = () => { return phoneRegex.test(phone); }; + const isValidEmail = (email: string) => { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailRegex.test(email); + }; + const isFormValid = () => { return ( mid.trim() !== '' && @@ -164,16 +170,12 @@ export const ArsRequestPage = () => {
금액 *
- ) => { - const onlyNumbers = e.target.value.replace(/[^0-9]/g, ''); // 숫자만 남김 - setAmount(onlyNumbers === '' ? 0 : parseInt(onlyNumbers)); - }} - inputMode="numeric" // 모바일 키보드 숫자 전용 - pattern="[0-9]*" // 브라우저 기본 숫자만 유효하도록 - /> + allowNegative={false} + displayType="input" + onChange={(e: ChangeEvent) => setAmount(parseInt(e.target.value))} + >
@@ -228,6 +230,8 @@ export const ArsRequestPage = () => { value={email} placeholder='test@nicepay.co.kr' onChange={(e: ChangeEvent) => setEamil(e.target.value)} + className={email && !isValidEmail(email) ? 'error' : ''} + />
diff --git a/src/pages/additional-service/fund-account/transfer-detail-page.tsx b/src/pages/additional-service/fund-account/transfer-detail-page.tsx index f5e69ef..c6b243f 100644 --- a/src/pages/additional-service/fund-account/transfer-detail-page.tsx +++ b/src/pages/additional-service/fund-account/transfer-detail-page.tsx @@ -54,8 +54,18 @@ export const FundAccountTransferDetailPage = () => { seq: seq }; extensionFundAccountTransferRequest(params).then((rs: ExtensionFundAccountTransferRequestResponse) => { - callDetail(); - snackBar("이체요청을 성공하였습니다.") + if (rs.status) { + callDetail(); + snackBar("이체요청을 성공하였습니다.") + } else { + const errorMessage = rs.error?.message || '이체요청이 실패하였습니다.'; + snackBar(`[실패] ${errorMessage}`); + } + }).catch((error) => { + const errorMessage = error?.response?.data?.error?.message || + error?.message || + '이체요청 중 오류가 발생했습니다.'; + snackBar(`[실패] ${errorMessage}`); }); }; 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 2948874..7e0ab6c 100644 --- a/src/pages/additional-service/fund-account/transfer-request-page.tsx +++ b/src/pages/additional-service/fund-account/transfer-request-page.tsx @@ -31,7 +31,7 @@ export const FundAccountTransferRequestPage = () => { const [depositParameter, setDepositParameter] = useState(''); const { mutateAsync: extensionFundAccountRegist } = useExtensionFundAccountTransferRegistMutation(); - + useSetHeaderTitle('자금이체 이체등록'); useSetHeaderType(HeaderType.RightClose); useSetFooterMode(false); @@ -63,8 +63,14 @@ export const FundAccountTransferRequestPage = () => { snackBar("이체등록을 성공하였습니다.") resetForm(); } else { - snackBar("이체등록이 실패하였습니다.") + const errorMessage = rs.error?.message || '이체등록이 실패하였습니다.'; + snackBar(`[실패] ${errorMessage}`); } + }).catch((error) => { + const errorMessage = error?.response?.data?.error?.message || + error?.message || + '이체등록 중 오류가 발생했습니다.'; + snackBar(`[실패] ${errorMessage}`); }); }; @@ -128,6 +134,10 @@ export const FundAccountTransferRequestPage = () => { valueIsNumericString allowNegative={false} decimalScale={0} + isAllowed={(values) => { + const { value } = values; + return !value || value.length <= 14; + }} onValueChange={(values) => setAccountNo(values.value)} />
@@ -138,7 +148,7 @@ export const FundAccountTransferRequestPage = () => { ) => setAccountName(e.target.value) } + onChange={(e: ChangeEvent) => setAccountName(e.target.value)} /> @@ -148,8 +158,12 @@ export const FundAccountTransferRequestPage = () => { ) => setAmount(parseInt(e.target.value))} + onValueChange={(values) => { + const { floatValue } = values; + setAmount(floatValue ?? 0); + }} > 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 4a0df26..4ab392e 100644 --- a/src/pages/additional-service/key-in-payment/requeset-page.tsx +++ b/src/pages/additional-service/key-in-payment/requeset-page.tsx @@ -15,12 +15,14 @@ import { overlay } from 'overlay-kit'; import { Dialog } from '@/shared/ui/dialogs/dialog'; import { useStore } from '@/shared/model/store'; import { snackBar } from '@/shared/lib'; +import { NumericFormat, PatternFormat } from 'react-number-format'; export const KeyInPaymentRequestPage = () => { const { navigate } = useNavigate(); const location = useLocation(); const userMid = useStore.getState().UserStore.mid; + const midOptions = useStore.getState().UserStore.selectOptionsMids const [mid, setMid] = useState(userMid || ''); const [productName, setProductName] = useState(''); @@ -79,50 +81,24 @@ export const KeyInPaymentRequestPage = () => { }; keyInApply(keyInApplyParams).then((rs) => { - console.log('결제 응답:', rs); - if (rs.status) { + if (rs.data?.success) { // 성공: 화면 유지 & 입력 내용 초기화 snackBar("KEY-IN 결제 신청을 성공하였습니다.") resetForm(); } else { // 실패: 화면 유지 & 입력 내용 유지 - showErrorDialog('결제에 실패했습니다. 입력 내용을 확인해주세요.'); + const errorMessage = rs.data?.resultMessage || rs.error?.resultMessage || '결제 신청에 실패했습니다.'; + // HTML 태그 제거 + const cleanMessage = errorMessage.replace(//gi, ' ').trim(); + snackBar(`[실패] ${cleanMessage}`); } }).catch((error) => { console.error('결제 실패:', error); - showErrorDialog(error?.message || '결제 요청 중 오류가 발생했습니다'); + const errorMessage = error?.response?.data?.error?.resultMessage || error?.message || '결제 요청 중 오류가 발생했습니다'; + snackBar(`[실패] ${errorMessage}`); }); }; - const showSuccessDialog = () => { - overlay.open(({ isOpen, close, unmount }) => { - return ( - - ); - }); - }; - - const showErrorDialog = (errorMessage: string) => { - overlay.open(({ isOpen, close, unmount }) => { - return ( - - ); - }); - }; const isValidPhoneNumber = (phone: string) => { const phoneRegex = /^01[0|1|6|7|8|9][0-9]{7,8}$/; @@ -139,24 +115,17 @@ export const KeyInPaymentRequestPage = () => { cardNo3.length === 4 && cardNo4.length === 4; }; - const isValidCardExpiration = () => { - if (expMon.length !== 2 || expYear.length !== 2) { - return false; - } - const month = parseInt(expMon); - return month >= 1 && month <= 12; - }; - const isFormValid = () => { return ( mid.trim() !== '' && productName.trim() !== '' && amount > 0 && customerName.trim() !== '' && + expMon.trim() !== '' && + expYear.trim() !== '' && isValidEmail(email) && isValidPhoneNumber(phoneNumber) && - isValidCardNumber() && - isValidCardExpiration() + isValidCardNumber() ); }; @@ -174,11 +143,19 @@ export const KeyInPaymentRequestPage = () => {
가맹점 *
- + onChange={(e: ChangeEvent) => setMid(e.target.value)} + > + { + midOptions.map((value) => ( + + )) + } +
@@ -196,17 +173,16 @@ export const KeyInPaymentRequestPage = () => {
상품가격 *
- ) => { - const onlyNumbers = e.target.value.replace(/[^0-9]/g, ''); // 숫자만 남김 - setAmount(onlyNumbers === '' ? 0 : parseInt(onlyNumbers, 10)); + { + const { floatValue} = values; + setAmount( floatValue ?? 0); }} - inputMode="numeric" // 모바일 키보드 숫자 전용 - pattern="[0-9]*" // 브라우저 기본 숫자만 유효하도록 - /> + >
@@ -227,7 +203,6 @@ export const KeyInPaymentRequestPage = () => { ) => setEmail(e.target.value)} className={email && !isValidEmail(email) ? 'error' : ''} /> @@ -240,7 +215,7 @@ export const KeyInPaymentRequestPage = () => { ) => { const onlyNumbers = e.target.value.replace(/[^0-9]/g, ''); setPhoneNumber(onlyNumbers); @@ -256,92 +231,85 @@ export const KeyInPaymentRequestPage = () => {
카드번호 *
- ) => { - const onlyNumbers = e.target.value.replace(/[^0-9]/g, ''); - if (onlyNumbers.length <= 4) setCardNo1(onlyNumbers); - }} - inputMode="numeric" - pattern="[0-9]*" - maxLength={4} - placeholder="1234" - /> + allowEmptyFormatting + valueIsNumericString + format="####" + onChange={(e: ChangeEvent) => setCardNo1(e.target.value)} + > +
- ) => { - const onlyNumbers = e.target.value.replace(/[^0-9]/g, ''); - if (onlyNumbers.length <= 4) setCardNo2(onlyNumbers); - }} - inputMode="numeric" - pattern="[0-9]*" - maxLength={4} - placeholder="5678" - /> + allowEmptyFormatting + valueIsNumericString + format="####" + onChange={(e: ChangeEvent) => setCardNo2(e.target.value)} + > +
- ) => { - const onlyNumbers = e.target.value.replace(/[^0-9]/g, ''); - if (onlyNumbers.length <= 4) setCardNo3(onlyNumbers); - }} - inputMode="numeric" - pattern="[0-9]*" - maxLength={4} - placeholder="9012" - /> + allowEmptyFormatting + valueIsNumericString + format="####" + onChange={(e: ChangeEvent) => setCardNo3(e.target.value)} + > +
- ) => { - const onlyNumbers = e.target.value.replace(/[^0-9]/g, ''); - if (onlyNumbers.length <= 4) setCardNo4(onlyNumbers); - }} - inputMode="numeric" - pattern="[0-9]*" - maxLength={4} - placeholder="3456" - /> + allowEmptyFormatting + valueIsNumericString + format="####" + onChange={(e: ChangeEvent) => setCardNo4(e.target.value)} + > +
유효기간(월/년)*
- ) => { - const onlyNumbers = e.target.value.replace(/[^0-9]/g, ''); - if (onlyNumbers.length <= 2) setExpMon(onlyNumbers); - }} - inputMode="numeric" - pattern="[0-9]*" - maxLength={2} + { + const { value } = values; + if (!value) return true; + const numValue = parseInt(value); + return numValue >= 1 && numValue <= 12; + }} + onValueChange={(values) => { + const { value } = values; + setExpMon(value); + }} + onBlur={() => { + if (expMon.length === 1 && parseInt(expMon) >= 1 && parseInt(expMon) <= 9) { + setExpMon(expMon.padStart(2, '0')); + } + }} style={{ flex: 1 }} + inputMode="numeric" /> / - ) => { - const onlyNumbers = e.target.value.replace(/[^0-9]/g, ''); - if (onlyNumbers.length <= 2) setExpYear(onlyNumbers); - }} - inputMode="numeric" - pattern="[0-9]*" - maxLength={2} + { + const { value } = values; + setExpYear(value); + }} style={{ flex: 1 }} + inputMode="numeric" />
@@ -354,8 +322,8 @@ export const KeyInPaymentRequestPage = () => { value={instmnt} onChange={(e: ChangeEvent) => setInstmnt(e.target.value)} > - - {amount >= 50000 && ( + + {/* {amount >= 50000 && ( <> @@ -369,7 +337,7 @@ export const KeyInPaymentRequestPage = () => { - )} + )} */} 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 1f3ae21..d637b5d 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 @@ -5,7 +5,8 @@ import { useLocation } from 'react-router'; import { IMAGE_ROOT } from "@/shared/constants/common"; import { PATHS } from '@/shared/constants/paths'; import { useExtensionLinkPayRequestMutation } from '@/entities/additional-service/api/link-payment/use-extension-link-pay-request-mutation'; -import { ExtensionLinkPayRequestParams, LinkPaymentFormData } from '@/entities/additional-service/model/link-pay/types'; +import { ExtensionLinkPayRequestParams, ExtensionLinkPayRequestResponse, LinkPaymentFormData } from '@/entities/additional-service/model/link-pay/types'; +import { snackBar } from '@/shared/lib'; export const LinkPaymentApplyConfirmPage = () => { const { navigate } = useNavigate(); @@ -40,17 +41,30 @@ export const LinkPaymentApplyConfirmPage = () => { language: formData.language, linkContentType: formData.linkContentType }; - - console.log("Link Payment 요청 파라미터: ", requestParams); - linkPayRequest(requestParams) - .then((response) => { - console.log("Link Payment 성공 응답: ", response); - navigate(PATHS.additionalService.linkPayment.confirmSuccess); + .then((rs: ExtensionLinkPayRequestResponse) => { + if (rs.status) { + navigate(PATHS.additionalService.linkPayment.confirmSuccess); + } else { + // 응답은 성공했지만 status가 false인 경우 + const validationErrors = rs.error?.details?.validationErrors; + if (validationErrors) { + // validation 에러 메시지들을 수집 + const errorMessages = Object.values(validationErrors).join('\n'); + snackBar(`[실패] ${errorMessages}`); + } else { + // 일반 에러 메시지 + const errorMessage = rs.error?.message || '요청을 처리할 수 없습니다.'; + snackBar(`[실패] ${errorMessage}`); + } + } }) .catch((error) => { - console.error("Link Payment 실패: ", error); - // 에러 처리 로직 추가 가능 + // 네트워크 에러 등 예외 상황 + const errorMessage = error?.response?.data?.error?.message || + error?.message || + '요청 중 오류가 발생했습니다'; + snackBar(`[실패] ${errorMessage}`); }); }; @@ -66,18 +80,18 @@ export const LinkPaymentApplyConfirmPage = () => { -

발송 메시지를
최종 확인하세요

+

발송 메시지를
최종 확인하세요

- TEST 고객님, 안녕하세요?
- 나이스페이먼츠 주식회사에서
- 결제하실 내역 안내드립니다.
- 아래 URL로 접속하시면 상세 내역 확인과 결제 진행이 가능합니다.

- !${pay_url}

+ {formData.buyerName} 고객님, 안녕하세요?
+ 나이스페이먼츠 주식회사에서
+ 결제하실 내역 안내드립니다.
+ 아래 URL로 접속하시면 상세 내역 확인과 결제 진행이 가능합니다.

+ !${pay_url}

- 가맹점 상호 : 나이스페이먼츠 주식회사
- 상품명 : {formData.goodsName}
- 금액 : {formData.amount}원 + 가맹점 상호 : 나이스페이먼츠 주식회사
+ 상품명 : {formData.goodsName}
+ 금액 : {formData.amount.toLocaleString()}원

diff --git a/src/pages/additional-service/link-payment/apply/link-payment-apply-page.tsx b/src/pages/additional-service/link-payment/apply/link-payment-apply-page.tsx index 92cb394..7d9718f 100644 --- a/src/pages/additional-service/link-payment/apply/link-payment-apply-page.tsx +++ b/src/pages/additional-service/link-payment/apply/link-payment-apply-page.tsx @@ -1,11 +1,11 @@ -import {useState} from 'react'; -import {LinkPaymentStep1} from '@/entities/additional-service/ui/link-payment/apply/link-payment-step1'; -import {LinkPaymentStep2} from '@/entities/additional-service/ui/link-payment/apply/link-payment-step2'; -import {HeaderType} from '@/entities/common/model/types'; -import {ProcessStep} from '@/entities/transaction/model/types'; -import {useSetFooterMode, useSetHeaderTitle, useSetHeaderType} from '@/widgets/sub-layout/use-sub-layout'; -import {useNavigate} from '@/shared/lib/hooks/use-navigate'; -import {PATHS} from "@/shared/constants/paths"; +import { useState } from 'react'; +import { LinkPaymentStep1 } from '@/entities/additional-service/ui/link-payment/apply/link-payment-step1'; +import { LinkPaymentStep2 } from '@/entities/additional-service/ui/link-payment/apply/link-payment-step2'; +import { HeaderType } from '@/entities/common/model/types'; +import { ProcessStep } from '@/entities/transaction/model/types'; +import { useSetFooterMode, useSetHeaderTitle, useSetHeaderType } from '@/widgets/sub-layout/use-sub-layout'; +import { useNavigate } from '@/shared/lib/hooks/use-navigate'; +import { PATHS } from "@/shared/constants/paths"; import { IdentityType, Language } from '@/entities/additional-service/model/types'; import { LinkContentType, LinkPaymentFormData, LinkPaymentSendMethod } from '@/entities/additional-service/model/link-pay/types'; import { useStore } from '@/shared/model/store'; @@ -14,25 +14,25 @@ import moment from 'moment'; export const LinkPaymentApplyPage = () => { - const { navigate } = useNavigate(); - const userMid = useStore.getState().UserStore.mid; - const [processStep, setProcessStep] = useState(ProcessStep.One); - const [formData, setFormData] = useState({ - mid: userMid, - sendMethod: LinkPaymentSendMethod.SMS, - goodsName: '', - amount: 0, - moid: '', - paymentLimitDate: moment().format('YYYY.MM.DD'), - buyerName: '', - email: '', - phoneNumber: '', - isIdentity: false, - identityType: IdentityType.INDIVIDUAL, - identityValue: '', - language: Language.KR, - linkContentType: LinkContentType.BASIC - }); + const { navigate } = useNavigate(); + const userMid = useStore.getState().UserStore.mid; + const [processStep, setProcessStep] = useState(ProcessStep.One); + const [formData, setFormData] = useState({ + mid: userMid, + sendMethod: LinkPaymentSendMethod.SMS, + goodsName: '', + amount: 0, + moid: '', + paymentLimitDate: moment().format('YYYY.MM.DD'), + buyerName: '', + email: '', + phoneNumber: '', + isIdentity: false, + identityType: IdentityType.INDIVIDUAL, + identityValue: '', + language: Language.KR, + linkContentType: LinkContentType.BASIC + }); useSetHeaderTitle('링크결제 신청'); useSetHeaderType(HeaderType.LeftArrow); @@ -64,15 +64,11 @@ export const LinkPaymentApplyPage = () => { // Step2 필수 필드 검증 const isStep2Valid = () => { - const basicFieldsValid = ( - formData.buyerName.trim() !== '' && - formData.email.trim() !== '' && - isValidEmail(formData.email) && - formData.phoneNumber.trim() !== '' && - isValidPhoneNumber(formData.phoneNumber) - ); - // isIdentity가 true면 identityValue도 필수 + const basicFieldsValid = formData.sendMethod === 'EMAIL' + ? formData.email.trim() !== '' && isValidEmail(formData.email) + : formData.buyerName.trim() !== '' && formData.phoneNumber.trim() !== '' && isValidPhoneNumber(formData.phoneNumber); + if (formData.isIdentity) { return basicFieldsValid && formData.identityValue.trim() !== ''; } @@ -85,14 +81,14 @@ export const LinkPaymentApplyPage = () => { }; const onClickToChangeTab = () => { - if(processStep === ProcessStep.One) { - setProcessStep(ProcessStep.Two); - } - else if(processStep === ProcessStep.Two) { - navigate(PATHS.additionalService.linkPayment.requestConfirm, { - state: { formData } - }); - } + if (processStep === ProcessStep.One) { + setProcessStep(ProcessStep.Two); + } + else if (processStep === ProcessStep.Two) { + navigate(PATHS.additionalService.linkPayment.requestConfirm, { + state: { formData } + }); + } }; return ( @@ -103,62 +99,62 @@ export const LinkPaymentApplyPage = () => {
- {(processStep === ProcessStep.One) && -
- } - {(processStep === ProcessStep.Two) && -
- } + {(processStep === ProcessStep.One) && +
+ } + {(processStep === ProcessStep.Two) && +
+ }
- {(processStep === ProcessStep.One) && - - } - { (processStep === ProcessStep.Two) && - - } - -
{(processStep === ProcessStep.One) && -
- -
+ } {(processStep === ProcessStep.Two) && -
- - -
+ } + + + {(processStep === ProcessStep.One) && +
+ +
+ } + {(processStep === ProcessStep.Two) && +
+ + +
+ } - + ); }; \ 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 index 832b2c8..908d261 100644 --- 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 @@ -26,7 +26,7 @@ export const LinkPaymentWaitDetailPage = () => { const [titleInfo, setTitleInfo] = useState(); const [paymentInfo, setPaymentInfo] = useState(); - useSetHeaderTitle('링크결제 상세_발송대기'); + useSetHeaderTitle('링크결제 상세 발송대기'); useSetHeaderType(HeaderType.RightClose); useSetOnBack(() => { navigate(PATHS.additionalService.linkPayment.pendingSend); @@ -56,23 +56,14 @@ export const LinkPaymentWaitDetailPage = () => { } linkPayWaitDelete(deleteParam) .then((rs) => { - onClickToNavigate(PATHS.additionalService.linkPayment.pendingSend) + callDetail(); snackBar("삭제를 성공하였습니다.") }) .catch((error) => { - console.error("Resend 실패: ", error); snackBar(`[실패] ${error?.response?.data?.message}`) }); } - const onClickToNavigate = (path: string) => { - let timeout = setTimeout(() => { - clearTimeout(timeout); - navigate(PATHS.additionalService.linkPayment.pendingSend, { - }); - }, 10) - }; - const onClickToCancel = () => { let msg = '삭제 하시겠습니까?'; diff --git a/src/pages/additional-service/payout/list-page.tsx b/src/pages/additional-service/payout/list-page.tsx index af7fb8a..97e42c6 100644 --- a/src/pages/additional-service/payout/list-page.tsx +++ b/src/pages/additional-service/payout/list-page.tsx @@ -50,8 +50,8 @@ export const PayoutListPage = () => { const [fromDate, setFromDate] = useState(moment().format('YYYYMMDD')); const [toDate, setToDate] = useState(moment().format('YYYYMMDD')); const [status, setStatus] = useState(PayoutDisbursementStatus.ALL); - const [minAmount, setMinAmount] = useState(0); - const [maxAmount, setMaxAmount] = useState(50000000); + const [minAmount, setMinAmount] = useState(); + const [maxAmount, setMaxAmount] = useState(); const [emailBottomSheetOn, setEmailBottomSheetOn] = useState(false); const { mutateAsync: extensionPayoutList } = useExtensionPayoutListMutation(); diff --git a/src/pages/additional-service/payout/request-page.tsx b/src/pages/additional-service/payout/request-page.tsx index 9ce9f38..6902423 100644 --- a/src/pages/additional-service/payout/request-page.tsx +++ b/src/pages/additional-service/payout/request-page.tsx @@ -44,13 +44,17 @@ export const PayoutRequestPage = () => { settlementDate: settlementDate, }; extensionPayoutRequest(params) - .then((rs) => { - snackBar("신청을 성공하였습니다.") - }) - .catch((error) => { - snackBar(`[실패] ${error?.response?.data?.message} `|| '[실패] 신청을 실패하였습니다.') - }) - ; + .then((rs) => { + if (rs.status) { + snackBar("신청을 성공하였습니다.") + } else { + snackBar(`[실패] ${rs.error?.message}`) + } + }) + .catch((error) => { + snackBar(`[실패] ${error?.response?.data?.message} ` || '[실패] 신청을 실패하였습니다.') + }) + ; }; const isFormValid = () => { @@ -90,9 +94,13 @@ export const PayoutRequestPage = () => { ) => setDisbursementAmount(parseInt(e.target.value))} - > + onValueChange={(values) => { + const { floatValue } = values; + setDisbursementAmount(floatValue ?? 0); + }} + />
@@ -102,8 +110,7 @@ export const PayoutRequestPage = () => {