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 { useExtensionArsApplyMutation } from '@/entities/additional-service/api/ars/use-extension-ars-apply-mutation'; import { HeaderType } from '@/entities/common/model/types'; import { useSetHeaderTitle, useSetHeaderType, useSetFooterMode, useSetOnBack } from '@/widgets/sub-layout/use-sub-layout'; import { ArsPaymentMethod, ExtensionArsApplyParams, ExtensionArsApplyResponse } from '@/entities/additional-service/model/ars/types'; import { ArsRequestSuccessPage } from './request-success-page'; import { useStore } from '@/shared/model/store'; import { snackBar } from '@/shared/lib'; export const ArsRequestPage = () => { const { navigate } = useNavigate(); const location = useLocation(); const midOptions = useStore.getState().UserStore.selectOptionsMids const { mid: receivedMid } = location.state || {}; const { mutateAsync: arsApply } = useExtensionArsApplyMutation(); const [mid, setMid] = useState(receivedMid || ''); const [moid, setMoid] = useState(''); const [goodsName, setGoodsName] = useState(''); const [amount, setAmount] = useState(0); const [instmntMonth, setInstmntMonth] = useState('00'); const [buyerName, setBuyerName] = useState(''); const [phoneNumber, setPhoneNumber] = useState(''); const [email, setEamil] = useState(''); const [arsPaymentMethod, setArsPaymentMethod] = useState(ArsPaymentMethod.SMS); const [successPageOn, setSuccessPageOn] = useState(false); const [resultMessage, setResultMessage] = useState(''); useSetHeaderTitle('결제 신청'); useSetHeaderType(HeaderType.LeftArrow); useSetFooterMode(false); useSetOnBack(() => { navigate(PATHS.additionalService.ars.list); }); const callArsApply = () => { let arsApplyParams: ExtensionArsApplyParams = { mid: mid, moid: moid, goodsName: goodsName, amount: amount, instmntMonth: instmntMonth, buyerName: buyerName, phoneNumber: phoneNumber, email: email, 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}` || '[실패] 신청을 실패하였습니다.') }) }; const onClickToRequest = () => { callArsApply(); }; const isValidPhoneNumber = (phone: string) => { // 한국 휴대폰 번호: 010, 011, 016, 017, 018, 019로 시작, 10-11자리 const phoneRegex = /^01[0|1|6|7|8|9][0-9]{7,8}$/; return phoneRegex.test(phone); }; const isFormValid = () => { return ( mid.trim() !== '' && moid.trim() !== '' && goodsName.trim() !== '' && amount > 0 && buyerName.trim() !== '' && isValidPhoneNumber(phoneNumber) ); }; const getArsPaymentMethodBtns = () => { let rs = []; rs.push(
); return rs; }; return ( <>
가맹점 *
주문번호 *
) => setMoid(e.target.value)} />
상품명 *
) => setGoodsName(e.target.value)} />
금액 *
) => { const onlyNumbers = e.target.value.replace(/[^0-9]/g, ''); // 숫자만 남김 setAmount(onlyNumbers === '' ? 0 : parseInt(onlyNumbers)); }} inputMode="numeric" // 모바일 키보드 숫자 전용 pattern="[0-9]*" // 브라우저 기본 숫자만 유효하도록 />
할부기간 *
구매자명 *
) => setBuyerName(e.target.value)} />
휴대폰 번호 *
) => { const onlyNumbers = e.target.value.replace(/[^0-9]/g, ''); setPhoneNumber(onlyNumbers); }} className={phoneNumber && !isValidPhoneNumber(phoneNumber) ? 'error' : ''} inputMode="numeric" pattern="[0-9]*" maxLength={11} />
이메일
) => setEamil(e.target.value)} />
결제 방식 *
{getArsPaymentMethodBtns()}
); };