From dbb146247465d883c6d82d8c650dafdb29cb5e0e Mon Sep 17 00:00:00 2001 From: Jason Chuang Date: Sat, 7 Mar 2026 01:04:32 +0800 Subject: [PATCH] avoid double click to submit in application form --- .../ApplyForm/PublicNoticeApplyForm.js | 59 +++++++++++++------ 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/src/pages/PublicNotice/ApplyForm/PublicNoticeApplyForm.js b/src/pages/PublicNotice/ApplyForm/PublicNoticeApplyForm.js index 7154c94..9905a9a 100644 --- a/src/pages/PublicNotice/ApplyForm/PublicNoticeApplyForm.js +++ b/src/pages/PublicNotice/ApplyForm/PublicNoticeApplyForm.js @@ -7,7 +7,8 @@ import { RadioGroup, Checkbox, Dialog, DialogTitle, DialogContent, DialogActions, - Stack, Box + Stack, Box, + CircularProgress } from '@mui/material'; import { useFormik } from 'formik'; import * as yup from 'yup'; @@ -30,9 +31,7 @@ import { notifyActionSuccess } from 'utils/CommonFunction'; import { PNSPS_LONG_BUTTON_THEME } from "../../../themes/buttonConst"; import { ThemeProvider } from "@emotion/react"; import { FormattedMessage, useIntl } from "react-intl"; -import Loadable from 'components/Loadable'; -import { useState, useEffect, lazy } from 'react'; -const LoadingComponent = Loadable(lazy(() => import('../../extra-pages/LoadingComponent'))); +import { useState, useEffect, useRef } from 'react'; import { checkPaymentSuspension } from "utils/Utils"; // ==============================|| DASHBOARD - DEFAULT ||============================== // @@ -50,6 +49,7 @@ const PublicNoticeApplyForm = ({ loadedData, _selections, gazetteIssueList }) => const [val, setVal] = useState({}); const [reloadPage, setReloadPage] = useState(false); const [isSubmitting, setSubmitting] = useState(false); + const submittingRef = useRef(false); const [tickAccept, setTickAccept] = useState(false); const [issueId, setIssueId] = useState(loadedData.issueId); @@ -139,23 +139,30 @@ const PublicNoticeApplyForm = ({ loadedData, _selections, gazetteIssueList }) => }), }), onSubmit: values => { + if (submittingRef.current) return; + submittingRef.current = true; + if (!values.issueId) { + submittingRef.current = false; setWarningTitle(intl.formatMessage({ id: "attention" })) setWarningText(intl.formatMessage({ id: 'requireTargetVol' })); setIsWarningPopUp(true); return; } if (!attachment) { + submittingRef.current = false; setWarningTitle(intl.formatMessage({ id: "attention" })) setWarningText(intl.formatMessage({ id: 'requireFile' })); setIsWarningPopUp(true); return; } else if (!attachment.size || attachment.size <= 0) { + submittingRef.current = false; setWarningTitle(intl.formatMessage({ id: "attention" })) setWarningText(intl.formatMessage({ id: 'requireValidFile' })); setIsWarningPopUp(true); return; } else if (attachment.size >= (10 * 1024 * 1034)) { + submittingRef.current = false; setWarningTitle(intl.formatMessage({ id: "attention" })) setWarningText(intl.formatMessage({ id: 'fileSizeWarning' })); setIsWarningPopUp(true); @@ -166,6 +173,7 @@ const PublicNoticeApplyForm = ({ loadedData, _selections, gazetteIssueList }) => url: UrlUtils.CHECK_OVERDUE, onSuccess: (responData) => { if (responData.haveOverdue) { + submittingRef.current = false; setVal(values); setWarningTitle(intl.formatMessage({ id: "attention" })) setWarningText(intl.formatMessage({ id: 'dnOverdueWarning' })); @@ -173,6 +181,14 @@ const PublicNoticeApplyForm = ({ loadedData, _selections, gazetteIssueList }) => } else { apply(values); } + }, + onFail: () => { + submittingRef.current = false; + setSubmitting(false); + }, + onError: () => { + submittingRef.current = false; + setSubmitting(false); } }); } else { @@ -214,6 +230,8 @@ const PublicNoticeApplyForm = ({ loadedData, _selections, gazetteIssueList }) => files: [attachment], onSuccess: function (responData) { if (responData.msg) { + submittingRef.current = false; + setSubmitting(false); setVal({}); setReloadPage(true); setWarningTitle(intl.formatMessage({ id: "attention" })) @@ -221,10 +239,19 @@ const PublicNoticeApplyForm = ({ loadedData, _selections, gazetteIssueList }) => setIsWarningPopUp(true); return; } - setSubmitting(false) + submittingRef.current = false; + setSubmitting(false); notifyActionSuccess(intl.formatMessage({ id: 'submissionSuccess' }) + '!') navigate("/publicNotice"); // location.reload(); + }, + onFail: () => { + submittingRef.current = false; + setSubmitting(false); + }, + onError: () => { + submittingRef.current = false; + setSubmitting(false); } }); } @@ -273,18 +300,12 @@ const PublicNoticeApplyForm = ({ loadedData, _selections, gazetteIssueList }) => {/* 申請公共啟事 */} - { - isSubmitting ? - - - - : - - + + - {hasOptions ? ( + {hasOptions ? ( -
+ { isDummyLoggedIn()? @@ -619,7 +640,8 @@ const PublicNoticeApplyForm = ({ loadedData, _selections, gazetteIssueList }) => aria-label={intl.formatMessage({ id: 'applyPublicNotice' })} variant="contained" type="submit" - disabled={!tickAccept} + disabled={!tickAccept || isSubmitting} + startIcon={isSubmitting ? : null} > @@ -636,9 +658,8 @@ const PublicNoticeApplyForm = ({ loadedData, _selections, gazetteIssueList }) =>
) : null} -
-
- } +
+