import { ChangeEvent, useState } from 'react'; import { useTranslation } from 'react-i18next'; 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'; import { NumericFormat, PatternFormat } from 'react-number-format'; import { showAlert } from '@/widgets/show-alert'; import { useKeyboardAware } from '@/shared/lib/hooks/use-keyboard-aware'; export const ArsRequestPage = () => { const { t } = useTranslation(); 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(''); const { handleInputFocus, keyboardAwarePadding } = useKeyboardAware(); useSetHeaderTitle(t('additionalService.ars.paymentRequest')); 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) { setSuccessPageOn(true); } else { const errorMessage = rs.error?.message || t('additionalService.ars.requestFailed'); snackBar(`[${t('common.failed')}] ${errorMessage}`); } }) .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}`) } }) }; 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 isValidEmail = (email: string) => { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); }; const isFormValid = () => { return ( mid.trim() !== '' && moid.trim() !== '' && goodsName.trim() !== '' && amount > 0 && buyerName.trim() !== '' && isValidPhoneNumber(phoneNumber) ); }; const getArsPaymentMethodBtns = () => { let rs = []; rs.push(
); return rs; }; return ( <>
{t('additionalService.ars.merchant')} *
{t('additionalService.ars.orderNumber')} *
) => setMoid(e.target.value)} onFocus={handleInputFocus} />
{t('additionalService.ars.productName')} *
) => setGoodsName(e.target.value)} onFocus={handleInputFocus} />
{t('additionalService.ars.amount')} *
{ const { floatValue } = values; setAmount(floatValue ?? 0); }} onFocus={handleInputFocus} >
{t('additionalService.ars.installmentPeriod')} *
{t('additionalService.ars.buyerName')} *
) => setBuyerName(e.target.value)} onFocus={handleInputFocus} />
{t('additionalService.ars.phoneNumber')} *
) => { const onlyNumbers = e.target.value.replace(/[^0-9]/g, ''); setPhoneNumber(onlyNumbers); }} className={phoneNumber && !isValidPhoneNumber(phoneNumber) ? 'error' : ''} inputMode="numeric" pattern="[0-9]*" maxLength={11} onFocus={handleInputFocus} />
{t('additionalService.ars.email')}
) => setEamil(e.target.value)} className={email && !isValidEmail(email) ? 'error' : ''} onFocus={handleInputFocus} />
{t('additionalService.ars.paymentMethod')} *
{getArsPaymentMethodBtns()}
); };