From d2509e5ff4c3b3e9b0317c8a5634a19883276445 Mon Sep 17 00:00:00 2001 From: Jason Chuang Date: Thu, 27 Aug 2026 13:55:29 +0800 Subject: [PATCH] pay button protection --- src/pages/Payment/MultiPaymentWindow.js | 46 ++++++++++++++++++++----- src/pages/Payment/index.js | 12 +++++++ 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/pages/Payment/MultiPaymentWindow.js b/src/pages/Payment/MultiPaymentWindow.js index cf0315b0..a53f8ac6 100644 --- a/src/pages/Payment/MultiPaymentWindow.js +++ b/src/pages/Payment/MultiPaymentWindow.js @@ -58,6 +58,8 @@ const MultiPaymentWindow = (props) => { const [paymentHoldedErrText, setPaymentHoldedErrText] = React.useState(""); const [paymentHoldedErr, setPaymentHoldedErr] = React.useState(false); + const [isPaying, setIsPaying] = React.useState(false); + const payingRef = React.useRef(false); const mobileBrowser = "Mobile"; @@ -144,7 +146,13 @@ const MultiPaymentWindow = (props) => { }, [paymentMethod]); + const releasePayLock = () => { + payingRef.current = false; + setIsPaying(false); + }; + const selectedPaymentMethodHandle = (method) => () =>{ + if (payingRef.current) return; if (method != paymentMethod){ resetForm() let totalAmount = props.totalAmount; @@ -198,6 +206,10 @@ const MultiPaymentWindow = (props) => { }; const handlePaymentCheck = () => { + if (payingRef.current) return; + payingRef.current = true; + setIsPaying(true); + let appIdList = props.appIds // console.log(props.appIds) // console.log(appIdList) @@ -207,6 +219,8 @@ const MultiPaymentWindow = (props) => { appIds: appIdList }, onSuccess: (responseData) => { + if (!payingRef.current) return; + const latestData = {}; responseData.forEach(item => { @@ -235,13 +249,21 @@ const MultiPaymentWindow = (props) => { const resultString = HoldingApplication.map(item => item.appNo).join(' , '); setPaymentHoldedErrText(resultString); // setPaymentHoldedErrText(intl.formatMessage({ id: 'MSG.paymentHolded' }, { appNo: record.appNo })); + releasePayLock(); setPaymentHoldedErr(true); } + }, + onFail: () => { + releasePayLock(); + }, + onError: () => { + releasePayLock(); } }); }; const closeHandle = () => () =>{ + releasePayLock(); resetForm() props.setOpen(false) }; @@ -261,6 +283,12 @@ const MultiPaymentWindow = (props) => { } }, [availableMethodData]); + useEffect(() => { + if (!props.confirmPayment) { + releasePayLock(); + } + }, [props.confirmPayment]); + const formik = useFormik({ initialValues: ({ username: '', @@ -272,7 +300,7 @@ const MultiPaymentWindow = (props) => { return ( props.setOpen(false)} + onClose={closeHandle()} fullWidth={true} maxWidth={'xl'} fullScreen={props.isFullScreen} @@ -318,27 +346,27 @@ const MultiPaymentWindow = (props) => { - - - - - @@ -346,7 +374,7 @@ const MultiPaymentWindow = (props) => { {props.browserType==mobileBrowser? null : - } @@ -447,10 +475,10 @@ const MultiPaymentWindow = (props) => { { - props.onPayment? + props.onPayment || isPaying? : - } diff --git a/src/pages/Payment/index.js b/src/pages/Payment/index.js index e42a81e2..02789d16 100644 --- a/src/pages/Payment/index.js +++ b/src/pages/Payment/index.js @@ -435,6 +435,7 @@ const Index = () => { // const confirmPaymentHandle = () => () => { useEffect(() => { if (confirmPayment){ + setOnPayment(true); HttpUtils.post({ url: UrlUtils.POST_CHECK_APP_EXPRITY_DATE, params: { @@ -445,12 +446,22 @@ const Index = () => { setAfterConfirmPayment(true); return; } + setOnPayment(false); + setConfirmPayment(false); let str = ""; responData.msg.forEach((item) => { str += "App: " + item.appNo + ", 到期日: " + DateUtils.datetimeStr_Cht(item.expiryDate) + "\n"; }); setExpiryDateErrText(str.split('\n').map(str => <>{str}
)); setExpiryDateErr(true); + }, + onFail: () => { + setOnPayment(false); + setConfirmPayment(false); + }, + onError: () => { + setOnPayment(false); + setConfirmPayment(false); } }); } @@ -551,6 +562,7 @@ const Index = () => { setSelectedPaymentMethod={setSelectedPaymentMethod} selectedPaymentMethod={selectedPaymentMethod} setConfirmPayment={setConfirmPayment} + confirmPayment={confirmPayment} getMethodImgClass = {getMethodImgClass} onReady = {onReady} locale = {locale}