From f327171e9be00edbd0cfe856c717c02b6c28339f Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Sat, 29 Aug 2026 17:36:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(voice):=20=E4=BF=AE=E5=A4=8D=E5=85=8B?= =?UTF-8?q?=E9=9A=86=E9=9F=B3=E8=89=B2=E5=BC=B9=E7=AA=97=E3=80=8C=E9=80=89?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=97=A0=E5=8F=8D=E5=BA=94=E3=80=8D=E6=AD=BB?= =?UTF-8?q?=E9=94=81=EF=BC=88isSubmittingRef=20=E4=B8=89=E5=A4=84=E8=AF=AF?= =?UTF-8?q?=E7=94=A8=EF=BC=89=20(#1541)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: xiaoxia Co-committed-by: xiaoxia --- apps/web/src/components/voice/CloneModal/index.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/web/src/components/voice/CloneModal/index.tsx b/apps/web/src/components/voice/CloneModal/index.tsx index 28f2beee9..be564f067 100644 --- a/apps/web/src/components/voice/CloneModal/index.tsx +++ b/apps/web/src/components/voice/CloneModal/index.tsx @@ -57,8 +57,8 @@ const CloneModal: React.FC = ({ open, onClose, onSuccess }) => setVoiceDescription("") setSelectedFile(null) setDragActive(false) - if (isSubmittingRef.current) return - isSubmittingRef.current = true + // 注意:resetState 不得触碰 isSubmittingRef——提交锁仅属于 handleSubmit; + // 此前在此上锁且无复位路径,弹窗打开即死锁 setErrorMessage("") resetRecorder() }, [getNextDefaultName, resetRecorder]) @@ -99,8 +99,8 @@ const CloneModal: React.FC = ({ open, onClose, onSuccess }) => setErrorMessage(error) setSelectedFile(null) } else { - if (isSubmittingRef.current) return - isSubmittingRef.current = true + // 文件选择为纯同步 state 设置,无异步竞态;防重入只属于提交动作, + // 由 handleSubmit 的 isSubmittingRef + isProcessing 保证,此处不设锁 setErrorMessage("") setSelectedFile(file) resetRecorder() @@ -132,8 +132,8 @@ const CloneModal: React.FC = ({ open, onClose, onSuccess }) => setErrorMessage(error) setSelectedFile(null) } else { - if (isSubmittingRef.current) return - isSubmittingRef.current = true + // 文件选择为纯同步 state 设置,无异步竞态;防重入只属于提交动作, + // 由 handleSubmit 的 isSubmittingRef + isProcessing 保证,此处不设锁 setErrorMessage("") setSelectedFile(file) resetRecorder()