修复切换实时通话失败:增加 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:
parent
96d95e9ef8
commit
141f984772
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user