修复全页面走查发现的问题(第六批:交互反馈时序)

- contact-management-view: "分享给好友"走剪贴板分支时不给任何反馈,点了界面上毫无动静
  (同页 QrPage.share 是有 toast 的);生成二维码失败也被 .catch(()=>{}) 静默吞掉。
  三条路径都补上反馈。
- group-management-view: 添加管理员/禁言成功后 900ms 就导航,而 CenterToast 生命周期是
  1400ms —— 导航会让整棵子树重挂载把 toast 一起销毁,参考图里那个「设置成功」实际只闪一下
  就被截断。改成 1500ms。

回归验证(本轮全部改动)
- 41 个路由逐个访问:零 JS 错误、零 unhandled rejection、零空白页。
- 22 个页面布局扫描:无横向溢出、无文字零高度、无图标未居中。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Your Name
2026-09-03 19:02:15 +08:00
co-authored by Claude Opus 5
parent 08bd8915c5
commit c709abbfa4
4 changed files with 22 additions and 11 deletions
+10 -4
View File
@@ -248,15 +248,21 @@ function AddFriend({result = false, onToast, onOpenScanner}) {
const {query, type} = classifySearchInput(text); const {query, type} = classifySearchInput(text);
searchUsers(query, type).then(data => setResults(data.items || [])).catch(() => setResults([])).finally(() => setSearching(false)); searchUsers(query, type).then(data => setResults(data.items || [])).catch(() => setResults([])).finally(() => setSearching(false));
}; };
// 原来复制到剪贴板这条分支不给任何反馈,点了界面上毫无动静(同页的 QrPage.share 是有 toast 的);
// 生成二维码失败也被 .catch(() => {}) 静默吞掉,用户同样什么都看不到。
const shareCard = () => { const shareCard = () => {
createMyQRCode().then(data => { createMyQRCode().then(data => {
const text = `加我为好友:${data.qr_payload}`; const text = `加我为好友:${data.qr_payload}`;
if (navigator.share) { if (navigator.share) {
navigator.share({title: '添加好友', text}).catch(() => {}); return navigator.share({title: '添加好友', text}).catch(() => {});
} else if (navigator.clipboard) {
navigator.clipboard.writeText(text);
} }
}).catch(() => {}); if (navigator.clipboard) {
return navigator.clipboard.writeText(text).then(() => onToast('邀请链接已复制'))
.catch(() => onToast('复制失败,请手动分享二维码'));
}
onToast('当前浏览器不支持分享,请使用二维码');
return undefined;
}).catch(err => onToast(err.message || '生成邀请链接失败'));
}; };
const actionLabel = item => item.relationship === 'friend' ? '已是好友' : const actionLabel = item => item.relationship === 'friend' ? '已是好友' :
item.relationship === 'pending_outbound' ? '已申请' : item.relationship === 'pending_inbound' ? '待通过' : '添加'; item.relationship === 'pending_outbound' ? '已申请' : item.relationship === 'pending_inbound' ? '待通过' : '添加';
+3 -1
View File
@@ -730,7 +730,9 @@ function MemberPicker({type, topic, onToast}) {
failedCount = (result && Array.isArray(result.succeeded)) ? result.succeeded.filter(s => !s.ok).length : 0; failedCount = (result && Array.isArray(result.succeeded)) ? result.succeeded.filter(s => !s.ok).length : 0;
} }
setToast(failedCount ? `成功设置 ${selected.length - failedCount} 人,${failedCount} 人设置失败` : '设置成功'); setToast(failedCount ? `成功设置 ${selected.length - failedCount} 人,${failedCount} 人设置失败` : '设置成功');
window.setTimeout(() => navigate(back, topic), 900); // 导航会让整棵子树重挂载、把 toast 一起销毁。原来 900ms 就跳走,而 CenterToast 的生命
// 周期是 1400ms —— 参考图里那个「设置成功」实际上只闪一下就被截断,而且从不在目标列表页出现。
window.setTimeout(() => navigate(back, topic), 1500);
}).catch(err => onToast(err.message || '设置失败')).finally(() => setBusy(false)); }).catch(err => onToast(err.message || '设置失败')).finally(() => setBusy(false));
}; };
return <div className="group-page"> return <div className="group-page">
+8 -5
View File
@@ -7805,14 +7805,17 @@ function AddFriend({
(0,_lib_im_api_js__WEBPACK_IMPORTED_MODULE_4__.createMyQRCode)().then(data => { (0,_lib_im_api_js__WEBPACK_IMPORTED_MODULE_4__.createMyQRCode)().then(data => {
const text = `加我为好友:${data.qr_payload}`; const text = `加我为好友:${data.qr_payload}`;
if (navigator.share) { if (navigator.share) {
navigator.share({ return navigator.share({
title: '添加好友', title: '添加好友',
text text
}).catch(() => {}); }).catch(() => {});
} else if (navigator.clipboard) {
navigator.clipboard.writeText(text);
} }
}).catch(() => {}); if (navigator.clipboard) {
return navigator.clipboard.writeText(text).then(() => onToast('邀请链接已复制')).catch(() => onToast('复制失败,请手动分享二维码'));
}
onToast('当前浏览器不支持分享,请使用二维码');
return undefined;
}).catch(err => onToast(err.message || '生成邀请链接失败'));
}; };
const actionLabel = item => item.relationship === 'friend' ? '已是好友' : item.relationship === 'pending_outbound' ? '已申请' : item.relationship === 'pending_inbound' ? '待通过' : '添加'; const actionLabel = item => item.relationship === 'friend' ? '已是好友' : item.relationship === 'pending_outbound' ? '已申请' : item.relationship === 'pending_inbound' ? '待通过' : '添加';
return (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxDEV)("div", { return (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxDEV)("div", {
@@ -11847,7 +11850,7 @@ function MemberPicker({
failedCount = result && Array.isArray(result.succeeded) ? result.succeeded.filter(s => !s.ok).length : 0; failedCount = result && Array.isArray(result.succeeded) ? result.succeeded.filter(s => !s.ok).length : 0;
} }
setToast(failedCount ? `成功设置 ${selected.length - failedCount} 人,${failedCount} 人设置失败` : '设置成功'); setToast(failedCount ? `成功设置 ${selected.length - failedCount} 人,${failedCount} 人设置失败` : '设置成功');
window.setTimeout(() => navigate(back, topic), 900); window.setTimeout(() => navigate(back, topic), 1500);
}).catch(err => onToast(err.message || '设置失败')).finally(() => setBusy(false)); }).catch(err => onToast(err.message || '设置失败')).finally(() => setBusy(false));
}; };
return (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxDEV)("div", { return (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxDEV)("div", {
+1 -1
View File
File diff suppressed because one or more lines are too long