JianFeeeee
1869924507
跨端: 接上聚合失败横幅(数据一直在收集,界面从来没读过 —— 安全网是断的)
逐页对齐 WebUI 时发现的**不是观感问题,是安全网断线**。
## 事实
`MailStore` 一直在收集"聚合模式下哪个账号取失败了":
MailStore.ets:142 const failed: AccountError[] = [];
MailStore.ets:208 failed.push(AccountError.of(acct.displayName, reason));
MailStore.ets:226 snap.accountErrors = failed;
(收件箱与发件箱两处 load 都写)
而**界面一次都没读过 `snap.accountErrors`**(`MainPage` 里 grep 为 0 处)。
⇒ 后果:某个账号拉不到邮件时,列表**静默少一整份**,界面看起来完全正常。
用户会据此得出错误结论 —— "没人给我发信"。
WebUI 把这条写成了显式警告(`MailList.tsx:85-91` 原注释):
「聚合时**某个账号取不到**必须说出来:静默丢掉它,列表会少一整份邮件,
而界面看起来完全正常 —— 这正是『聚合』最容易骗人的失败方式」
## 改动
· `InboxTab` 加 `@State accountErrors`,在 `applyStoreSnapshot` 里接上 `snap.accountErrors`;
· 卡片下方渲染琥珀色横幅,文案照 WebUI:
「有 {n} 个账号没取到:{账号}({原因});…」
(`bg-amber-50 border-amber-200 text-amber-800` → `warnBg` / `warnFgDark` / 11 号字);
· 新增 `accountErrorText()` 做拼接(`「a(原因);b(原因)」`)。
★ 只接了**收件箱**那一处。发件箱 `SentTab` 有自己的 `applyStoreSnapshot`,
本轮不动它 —— 它的聚合语义与收件箱不同(见 `SentTab.load`),
要不要显示同一张横幅需要单独判断,不顺手加(顺手加是本仓反复出现的错法)。
## 设备验证(如实)
✓ 收件箱正常渲染(`9 组 · 9 封`),进程存活(22242),无新 jscrash
✓ 横幅**正确不出现** —— 当前所有账号都取得到(这是应该的行为)
✗ **横幅"出现"的那条路径没能实测到**:要触发它需要一个取失败的账号,
而本机没有可用的失败账号构造。逻辑与 WebUI 逐条对齐、编译通过,
但"真的会显示成那样"我不声称已验 —— 与"动画中间帧看不到"同样的诚实口径。