第七轮深度测试:修复7个agent发现的12处前端问题,重点是列表分页截断与呼叫/播放状态机
- 通话状态机(Ch8):canStartCall 补齐通话中重复发起的防护,callShouldStart 补齐放弃/失败路径的清理 - 分页截断(Ch5-6):新增 fetchAllPages 辅助函数,修复通讯录/黑名单/好友申请/群成员/管理员/禁言等 11 处列表只读首页导致真实成员被遗漏的问题;群角色判断改用不受分页影响的 getGroup().my_role - 消息与媒体(Ch3-4/Ch7/Ch9):录音超时污染时长、手动重试丢失 head 导致消息被错误分类、批量删除 未取消上传中附件、语音播放器补齐同时只能播一条、workplace-collaboration-view 冗余重试请求 - 独立密码/青少年模式(Ch10-11):设置密码后按调用来源判断是否应自动开启青少年模式,避免关闭流程 中途"忘记密码"被误当成开启;注销账号确认文案补充群主后果说明 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
f42b8536e5
commit
bede45fd7f
@@ -2053,6 +2053,15 @@ class TinodeWeb extends React.Component {
|
||||
// (send-message.jsx) can gate on exactly the same real-world availability check as the existing
|
||||
// "..." menu items, instead of re-deriving (and risking drifting from) the same three conditions.
|
||||
canStartCall(topicName) {
|
||||
// Never checked whether a call was already in progress -- the "..." menu entry and
|
||||
// send-message.jsx's attachment-panel shortcut stayed clickable for the whole (very normal,
|
||||
// product-supported) duration of a minimized call. A second click re-arms
|
||||
// handleStartVideoCall/handleStartAudioCall's 60s ring timeout and forces callState back to
|
||||
// CALL_STATE_OUTGOING_INITATED with no visible effect (the already-mounted CallPanel doesn't
|
||||
// react to that prop), silently hanging up the real, healthy call a full minute later.
|
||||
if (this.state.callState != CALL_STATE_NONE) {
|
||||
return false;
|
||||
}
|
||||
const topic = this.tinode.getTopic(topicName);
|
||||
if (!topic || topic._deleted || !Tinode.isP2PTopicName(topicName)) {
|
||||
return false;
|
||||
@@ -2524,7 +2533,15 @@ class TinodeWeb extends React.Component {
|
||||
// arrives (or armCallRingTimeout's hang-up firing before it) leaves this call's callSeq
|
||||
// pointing at whatever the *previous* call's seq was, and the next outgoing call could read
|
||||
// that stale value for the brief window before its own ack lands.
|
||||
callSeq: undefined
|
||||
callSeq: undefined,
|
||||
// handleCallAccept's "topic not subscribed yet" branch (below) sets this and waits for
|
||||
// handleNewTopicCreated to both flip callState to CALL_STATE_IN_PROGRESS and clear this flag
|
||||
// once that subscription succeeds -- but a call closed/abandoned (rejected, or the subscribe
|
||||
// itself failing) before that ever happens left this stuck at true with no owner left to clear
|
||||
// it. It would then get read by the *next*, entirely unrelated topic subscription that happens
|
||||
// to succeed, incorrectly forcing callState to CALL_STATE_IN_PROGRESS for a call that was
|
||||
// already given up on.
|
||||
callShouldStart: false
|
||||
});
|
||||
}
|
||||
|
||||
@@ -2567,7 +2584,10 @@ class TinodeWeb extends React.Component {
|
||||
callTopic: null,
|
||||
callState: CALL_STATE_NONE,
|
||||
callSeq: null,
|
||||
callAudioOnly: undefined
|
||||
callAudioOnly: undefined,
|
||||
// Same stuck-flag risk handleCallClose() guards against -- this call is being given up
|
||||
// on here just as much as a local close/reject would, so it needs the same cleanup.
|
||||
callShouldStart: false
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user