From 51e0fc420f609c297ac127ff2ac4cc56e0fd7d80 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 6 Sep 2026 15:35:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=91=E9=80=81=E5=A5=BD?= =?UTF-8?q?=E5=8F=8B=E7=94=B3=E8=AF=B7=E5=90=8E=E4=B8=AA=E4=BA=BA=E8=B5=84?= =?UTF-8?q?=E6=96=99=E9=A1=B5=E4=BB=8D=E6=98=BE=E7=A4=BA=E5=8F=AF=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E7=9A=84"=E6=B7=BB=E5=8A=A0=E5=A5=BD=E5=8F=8B"?= =?UTF-8?q?=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 现象:搜索陌生人->进入资料页->点"添加好友"->发送验证留言成功后, 无论是验证页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 --- src/views/contact-management-view.jsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/views/contact-management-view.jsx b/src/views/contact-management-view.jsx index 6d5585e8..3578c44e 100644 --- a/src/views/contact-management-view.jsx +++ b/src/views/contact-management-view.jsx @@ -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)); };