From 81fac3a6e86945bcfe4d1d5d0b01f7b52faa2987 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Sat, 29 Aug 2026 17:25:54 +0800 Subject: [PATCH] =?UTF-8?q?docs(voice):=20CloneModal=20=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E9=94=81=E8=BE=B9=E7=95=8C=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=EF=BC=88=E5=9B=9E=E5=BA=94=20AI=20review=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 文件选择/拖拽/弹窗重置均为同步 state 操作无异步竞态,防重入只属于 handleSubmit(isSubmittingRef + isProcessing 双保险); resetState 此前上锁且无复位路径导致弹窗打开即死锁,故不设锁。 --- apps/web/src/components/voice/CloneModal/index.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/web/src/components/voice/CloneModal/index.tsx b/apps/web/src/components/voice/CloneModal/index.tsx index d86e7d34f..be564f067 100644 --- a/apps/web/src/components/voice/CloneModal/index.tsx +++ b/apps/web/src/components/voice/CloneModal/index.tsx @@ -57,6 +57,8 @@ const CloneModal: React.FC = ({ open, onClose, onSuccess }) => setVoiceDescription("") setSelectedFile(null) setDragActive(false) + // 注意:resetState 不得触碰 isSubmittingRef——提交锁仅属于 handleSubmit; + // 此前在此上锁且无复位路径,弹窗打开即死锁 setErrorMessage("") resetRecorder() }, [getNextDefaultName, resetRecorder]) @@ -97,6 +99,8 @@ const CloneModal: React.FC = ({ open, onClose, onSuccess }) => setErrorMessage(error) setSelectedFile(null) } else { + // 文件选择为纯同步 state 设置,无异步竞态;防重入只属于提交动作, + // 由 handleSubmit 的 isSubmittingRef + isProcessing 保证,此处不设锁 setErrorMessage("") setSelectedFile(file) resetRecorder() @@ -128,6 +132,8 @@ const CloneModal: React.FC = ({ open, onClose, onSuccess }) => setErrorMessage(error) setSelectedFile(null) } else { + // 文件选择为纯同步 state 设置,无异步竞态;防重入只属于提交动作, + // 由 handleSubmit 的 isSubmittingRef + isProcessing 保证,此处不设锁 setErrorMessage("") setSelectedFile(file) resetRecorder()