Files
MailUI4Agents/client
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 逐条对齐、编译通过,
  但"真的会显示成那样"我不声称已验 —— 与"动画中间帧看不到"同样的诚实口径。
2026-09-21 16:32:49 +08:00
..