修复发送好友申请后个人资料页仍显示可点击的"添加好友"按钮

现象:搜索陌生人->进入资料页->点"添加好友"->发送验证留言成功后,
无论是验证页800ms后的自动跳转、还是手动点返回,回到这个人的资料页时
仍然显示"添加好友"主按钮(本应显示"好友申请正在等待验证"提示文案),
且这个按钮此时仍可点击,会打开验证页再次发起一次申请(配合后端
好友申请不去重的缺口——新增44——实际造成同一个人收到多条重复申请)。

根因:发送成功后 Verification 组件把 profile-seed 缓存的 relationship
patch 成了 pending_outbound,但没有同步更新 capabilities.can_add_friend
——Profile 组件判断是否展示"添加好友"按钮的 canAdd 变量读的是
profile.capabilities.can_add_friend,不是 relationship 本身,遗留的
can_add_friend:true(原样来自发送前的搜索结果种子缓存)导致按钮继续显示。

修复:发送成功后 patch 缓存时把 capabilities.can_add_friend 一并设为
false,和 relationship 保持同步。

验证:真实浏览器操作,两个全新注册账号之间,搜索->进入资料页->添加好友
->发送验证留言,自动跳转回资料页后正确显示"好友申请正在等待验证",
"添加好友"按钮消失,无法重复发起申请。

第14+轮最小粒度测试 Ch3-4 发现(好友申请气泡状态机场景)。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Your Name
2026-09-06 15:35:50 +08:00
co-authored by Claude Sonnet 5
parent 552c891cc3
commit 51e0fc420f
+11 -1
View File
@@ -366,7 +366,17 @@ function Verification({uid, onToast}) {
// Patch the seed Profile will re-read on remount -- its own background getUserProfile refresh
// can't do this for us, since a stranger-turned-pending peer still fails that gated endpoint
// the exact same way a stranger does (server only exempts an established "friend").
writeCachedData('profile-seed:' + uid, {...(readCachedData('profile-seed:' + uid) || {}), relationship: 'pending_outbound'});
// Must also flip capabilities.can_add_friend to false here, not just relationship: Profile's
// canAdd render check (contact-management-view.jsx ~line 444) reads capabilities.can_add_friend,
// not relationship, directly. Leaving the stale can_add_friend:true (copied verbatim from the
// pre-request search-result seed) meant Profile kept showing an active "添加好友" button after
// a request was already sent -- confirmed live: send request, navigate back to this profile
// (the verification screen's own auto-redirect 800ms later, or its back button, both land here),
// and the button was still clickable, capable of firing a second, backend-undeduped request
// (see 新增44 in the backend issue list) purely because of this front-end staleness.
const priorSeed = readCachedData('profile-seed:' + uid) || {};
writeCachedData('profile-seed:' + uid, {...priorSeed, relationship: 'pending_outbound',
capabilities: {...priorSeed.capabilities, can_add_friend: false}});
window.setTimeout(() => navigate('group-member-profile', uid), 800);
}).catch(err => onToast(err.message || '发送失败')).finally(() => setSending(false));
};