import { ChangeEvent, useState } from 'react'; import { PATHS } from '@/shared/constants/paths'; import { useLocation } from 'react-router'; import { useNavigate } from '@/shared/lib/hooks/use-navigate'; import { IMAGE_ROOT } from '@/shared/constants/common'; import { HeaderType } from '@/entities/common/model/types'; import { useExtensionKeyinApplyMutation } from '@/entities/additional-service/api/use-extension-keyin-apply-mutation'; import { useSetHeaderTitle, useSetHeaderType, useSetFooterMode, useSetOnBack } from '@/widgets/sub-layout/use-sub-layout'; 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(''); const [amount, setAmount] = useState(0); const [customerName, setCustomerName] = useState(''); const [email, setEmail] = useState(''); const [phoneNumber, setPhoneNumber] = useState(''); const [cardNo1, setCardNo1] = useState(''); const [cardNo2, setCardNo2] = useState(''); const [cardNo3, setCardNo3] = useState(''); const [cardNo4, setCardNo4] = useState(''); const [expMon, setExpMon] = useState(''); const [expYear, setExpYear] = useState(''); const [instmnt, setInstmnt] = useState('00'); const [orderNumber, setOrderNumber] = useState(''); const { mutateAsync: keyInApply } = useExtensionKeyinApplyMutation(); useSetHeaderTitle('KEY-IN 결제'); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => { navigate(PATHS.additionalService.keyInPayment.list); }); const resetForm = () => { setProductName(''); setAmount(0); setCustomerName(''); setEmail(''); setPhoneNumber(''); setCardNo1(''); setCardNo2(''); setCardNo3(''); setCardNo4(''); setExpMon(''); setExpYear(''); setInstmnt('00'); setOrderNumber(''); }; const callKeyInPaymentRequest = () => { const cardNo = `${cardNo1}${cardNo2}${cardNo3}${cardNo4}`; const cardExpire = `${expMon}${expYear}` let keyInApplyParams = { mid: mid, cardNo: cardNo, cardExpire: cardExpire, instmnt: instmnt, amount: amount, productName: productName, orderNumber: orderNumber, customerName: customerName, phoneNumber: phoneNumber, email: email, }; keyInApply(keyInApplyParams).then((rs) => { console.log('KEY-IN 결제 응답:', rs); console.log('rs.data:', rs.data); console.log('rs.data?.resultMessage:', rs.data?.resultMessage); if (rs.status && rs.data?.success) { // 성공: 화면 유지 & 입력 내용 초기화 snackBar("KEY-IN 결제 신청을 성공하였습니다.") resetForm(); } else { // 실패: 화면 유지 & 입력 내용 유지 const errorMessage = rs.data?.resultMessage || rs.error?.message || '결제 신청에 실패했습니다.'; console.log('최종 errorMessage:', errorMessage); // HTML 태그 제거 const cleanMessage = errorMessage.replace(//gi, ' ').trim(); snackBar(`[실패] ${cleanMessage}`); } }).catch((error) => { console.error('결제 실패:', error); const errorMessage = error?.response?.data?.data?.resultMessage || error?.response?.data?.error?.message || error?.message || '결제 요청 중 오류가 발생했습니다'; snackBar(`[실패] ${errorMessage}`); }); }; const isValidPhoneNumber = (phone: string) => { const phoneRegex = /^01[0|1|6|7|8|9][0-9]{7,8}$/; return phoneRegex.test(phone); }; const isValidEmail = (email: string) => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); }; const isValidCardNumber = () => { return cardNo1.length === 4 && cardNo2.length === 4 && cardNo3.length === 4 && cardNo4.length === 4; }; const isFormValid = () => { return ( mid.trim() !== '' && productName.trim() !== '' && amount > 0 && customerName.trim() !== '' && expMon.trim() !== '' && expYear.trim() !== '' && orderNumber.trim() !== '' && isValidEmail(email) && isValidPhoneNumber(phoneNumber) && isValidCardNumber() ); }; const onClickToRequest = () => { callKeyInPaymentRequest(); }; return ( <>
가맹점 *
상품명 *
) => setProductName(e.target.value)} />
상품가격 *
{ const { floatValue} = values; setAmount( floatValue ?? 0); }} >
구매자명 *
) => setCustomerName(e.target.value)} />
구매자 이메일 *
) => setEmail(e.target.value)} className={email && !isValidEmail(email) ? 'error' : ''} />
구매자 전화번호 *
) => { const onlyNumbers = e.target.value.replace(/[^0-9]/g, ''); setPhoneNumber(onlyNumbers); }} className={phoneNumber && !isValidPhoneNumber(phoneNumber) ? 'error' : ''} inputMode="numeric" pattern="[0-9]*" maxLength={11} />
카드번호 *
) => setCardNo1(e.target.value)} >
) => setCardNo2(e.target.value)} >
) => setCardNo3(e.target.value)} >
) => setCardNo4(e.target.value)} >
유효기간(월/년)*
{ 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 { value } = values; setExpYear(value); }} style={{ flex: 1 }} inputMode="numeric" />
할부 기간*
주문번호*
) => setOrderNumber(e.target.value)} />
) }