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()