修复切换实时通话失败:增加 pendingCallMode 防重入保护

上一个 commit 将 chatMode 赋值延迟到连接之后,导致连接期间 chatMode
仍为 'none',guard 检查 isInCall || chatMode === 'call' 两个都为
false,用户重复点击会再次进入新建通话分支造成竞态。

增加 pendingCallMode 标记:进入连接前设为 true,连接完成(成功或失败)
后在 finally 中清 false。guard 检查中加入 pendingCallMode,连接期间
重复点击直接 return;同时简化错误处理,始终在 finally/catch 中调用
resetToDefaultMode 确保状态可靠清理。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
wsb1224 2026-06-07 11:25:29 +08:00
parent 96d95e9ef8
commit 141f984772

View File

@ -1811,14 +1811,20 @@ export default {
isRecording.value = false
}
let pendingCallMode = false
const toggleCallMode = async () => {
if (isInCall.value || chatMode.value === 'call') {
await stopCallRecording()
await forceStopVoiceAndCall()
await resetToDefaultMode()
if (pendingCallMode || isInCall.value || chatMode.value === 'call') {
// 退
if (!pendingCallMode) {
await stopCallRecording()
await forceStopVoiceAndCall()
await resetToDefaultMode()
}
return
}
pendingCallMode = true
try {
const hasPermission = await chatStore.requestMicrophonePermission()
if (!hasPermission) {
@ -1845,9 +1851,7 @@ export default {
if (success) {
await chatStore.exitRealtimeCallMode()
}
if (chatMode.value === 'none') {
await resetToDefaultMode()
}
await resetToDefaultMode()
return
}
@ -1859,9 +1863,9 @@ export default {
} catch (error) {
console.error('Enter call mode error:', error)
ElMessage.error('连接实时语音服务失败')
if (chatMode.value === 'none') {
await resetToDefaultMode()
}
await resetToDefaultMode()
} finally {
pendingCallMode = false
}
}