Files
MailUI4Agents/client/harmony
JianFeeeee ab1c856ffe 跨端: 鸿蒙顶栏 —— 兜底改品牌名、一言只留句子、整批轮播(修"轮播不转")
用户三条裁定,逐条落地:

① 兜底文案「暂无待办」→「AgentMail」
   触发条件只是"三个计数为零",而"暂无待办"读起来像"没事可做"——
   是在**替用户下结论**,结论与事实不等价。品牌名不带判断。

② 一言**只显示句子,不显示出处**
   原来 `quote + ' —— ' + source`。出处占近 1/3 宽度、把句子本身
   挤到省略号;且 hitokoto 的出处格式杂(动漫角色/诗词/网名),
   窄带上排起来脏。⇒ 与签名对齐:都是"当前状态的一句话"。
   `topQuoteSource` 状态随之删除(只写不读的死字段)。

③ ★★ 修一个**不报错、不崩溃**的静默 bug:轮播根本不转
   `this.topQuote = content.quotes[0].text` —— 注释还振振有词
   「批次的意义是少请求,不是一次全显示」。那句话本身没错,
   但**只取第一句** ⇒ 本地永远只有 1 句 ⇒
   `startTopbarRotation` 里 `texts.length <= 1` 的守卫直接 `return`。
   实测:连拍 6 张(18 秒)**全是同一句**。

   ★ 更坏的是它先前是**假象**:看着"在转",靠的是兜底占了轮播位
     (一言 ↔ 暂无待办 交替)。等 ① 把兜底改成不占轮播位,真相立刻暴露。
     ⇒ 教训:**"看起来在工作"可能是另一个东西在工作**。
       做 ① 时顺手连拍验证,才撞出这个真 bug。

   修法:整批存进本地状态、本地在批内逐句轮。服务端一批给 10 句
   (每次顺序还随机),这正好落实用户最初那句「app 本地缓存一部分」
   ——缓存的是**一批**,不是一个。

   ★ 顺带:兜底**不占轮播位**(它只做"唯一候选")
     摘要要有真计数(unread/pending/contacts 至少一个 > 0)才占位。
     实测四张连拍得到 `一言 → 兜底 → 兜底 → 一言`,
     等于用户看到的内容里一半是废话。

实测凭据(2in1 模拟器 3120×2080)
  · 连拍 7 张(21s):6 句不同一言,全不带出处
  · 连拍 5 张(15s):4 句不同,无兜底占位
  · 顶栏文案与三键垂直中心差 0.0px(上一提交已校准)

判据(harmony-2in1,共 23 条)
  · 兜底必须存在(退回空串会让整块消失),且**不含判断词**
    ("暂无/没有/无"开头——正则断言,改回「暂无待办」即判红)
  · 兜底不占轮播位:`summaryIsReal` 守卫 + `out.length === 0` 才 push(两半都钉)
  · 一言存**整批**、逐句进候选、不许有单句形态 `topQuote`
  · 出处不许出现在代码里

★ 判据自己踩的坑,记下来免得重犯:
  一言那条我第一版写成反向正则 `/this\.topQuote \+ ' —+ ' \+ this\.topQuoteSource/`
  —— **只匹配单引号**。变异时我把拼接写成双引号 `" —— "`,正则没命中
  ⇒ **假绿**。变异验证当场抓到。改成**正向断言**
  `out.push(this.topQuote);`(必须原样推进、不许在此处拼接):
  正向比反向窄,且不依赖引号风格。

全量:577/577 绿。
2026-09-25 19:09:48 +08:00
..