fix(首页): 来信卡数据源改为 laixin,与底 tab 红点统一(修两套数据不一致)(v26092004)

问题:底 tab 早已改跳 laixin、红点读 /api/mp/public/laixin/unread,但首页那张
「宝宝来信」卡仍由 pushLatestToHome() 按 LETTERS(box_app /mama-box/letters)驱动,
而那条线对多数用户是 0 封 —— 同一屏上会出现「红点说有新信、卡里什么都没有」。

改法(两者共用一个 laixin 未读结果):
- 新增 hideLetterCard() + applyLaixinReminder(r):unread>0 才显示,文案按
  「N 封新信 / M 条新回信」组装并附「最近一封 <时间>」;归零收起;上游降级(ok:false)、
  访客态、未建档一律收起(与角标同一套判据)
- syncLaixinBadge() → syncLaixinReminder():一次 fetch 同时落红点与首页卡(owner 唯一)
- 删除 pushLatestToHome() / lettersResolved / state.homeLetter / openDetail():
  内置来信屏(#screen-letter)与其 /letters 数据仍在,但不再往首页推卡
- 首页卡点击改走 openLetterApp()(跳 laixin),与底 tab 同落点;卡不再打开内置详情
- 卡仍默认 .hide + #homeBody 默认 .no-letter(保住 §9 的不闪规则)

验证(本地四态 mock + 浏览器):
- laixin 未读=2 → 接口回来前 hidden,回来后显示「小汤圆来信 / 有 1 封新信、1 条新回信 ·
  最近一封 今天 9:00」,红点同亮(同一次请求)
- 未读=0 → 全程收起;上游 ok:false → 冷启动收起、已显示则保持显示
- 访客(无 openid)→ 收起
- **box_app 来信有 1 封未读但 laixin 未读=0 → 首页卡仍收起**(内置屏照常渲染,互不影响)
- 点卡 → https://mp.yizhezhe.com/laixin/?openid=…&unionid=…;内置列表点开详情仍正常;errors 空
This commit is contained in:
2026-09-20 02:31:19 +08:00
parent e29052f107
commit ee04a26ba3
2 changed files with 94 additions and 131 deletions

View File

@@ -7,7 +7,7 @@
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<title>兜爸心选 · 孕育陪伴</title>
<!-- V:26092003 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<!-- V:26092004 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
<link rel="stylesheet" href="mama-box.css">
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<!-- 共享助手:授权/跳商城/位置上报(分享卡片同步,见 docs/h5-auth-standard.md 第四节) -->
@@ -119,24 +119,25 @@
</div>
</div>
<!-- 宝宝一有新回信,pushLatestToHome() 会把这张卡换成那条回信,
并加上 .has-new(信封右上角冒一个小红点)。
没有未读、也没有新回信时,同一个函数会给它挂 .hide 整张收起来。
<!-- 宝宝来信提醒卡。**数据源是 laixin(第三方「宝宝来信」应用)**,
由 js 里的 syncLaixinReminder() → applyLaixinReminder() 唯一负责显隐与文案
(拉 /api/mp/public/laixin/unread,unread > 0 才显示、带 .has-new 小红点)。
点击 = 跳 laixin,与底 tab「宝宝来信」同落点(app.js 里绑的是 openLetterApp)。
⚠️ 2026-09-20:这张卡**默认就是收起的**(标记里直接带 .hide,
#homeBody 直接带 .no-letter)。原因:卡的最终显隐要等 /letters
回来才知道,而首屏渲染远早于它 —— 默认显示的话,就会出现
「先冒出一张(用内置样例/本地队列拼出来的)来信卡,数据回来发现
没有未读,再缩回去」的闪一下(商城↔首页来回切时特别明显)。
所以规则改成:**没确定之前一律不显示,确认有未读/新回信才显示**。
pushLatestToHome() 里的 lettersResolved 就是这个「已确定」开关,
别把这里的 .hide / .no-letter 去掉 —— 去掉就退回闪烁版。 -->
<button class="letter-card ripple hide" id="homeLetter" data-goto="letter-detail">
#homeBody 直接带 .no-letter)。卡的显隐要等未读接口回来才知道,
而首屏渲染远早于它 —— 默认显示的话会「先冒出一张假卡、数据回来再缩回去」
(商城↔首页来回切时特别明显)。
⚠️ 别把这里的 .hide / .no-letter 去掉,去掉就退回闪烁版。
⚠️ 这张卡 2026-09-20 之前读的是 box_app 自己的 /mama-box/letters(多数用户 0 封),
而底 tab 早已跳 laixin —— 两套数据导致「红点说有新信、卡里什么都没有」。
改数据源就是修这个,**别再把它接回 LETTERS**(内置来信屏仍在,但不再往首页推卡)。 -->
<button class="letter-card ripple hide" id="homeLetter">
<span class="lc-envwrap"><img class="lc-env" src="assets/img/02cf420f0d07.png" alt="" aria-hidden="true"></span>
<div class="lc-body">
<!-- ⚠️ 这句只是**没填小名时的兜底**,屏幕上实际由 pushLatestToHome()
改写成「小汤圆来信」/「小汤圆回信啦」。改这句必须连着改那边,
否则会出现「HTML 里写着一套、屏幕上是另一套」。
<!-- ⚠️ 这段只是**兜底**(正常情况下用户看不到:卡默认 .hide,
有未读时由 applyLaixinReminder() 改写成「小汤圆来信」+ 通用提醒文案)。
改这几行时连着那边一起看,否则会出现「HTML 里写着一套、屏幕上是另一套」。
⚠️ 上一批这里短暂叫过「宝宝的新消息」,本批随整条线退回「来信」。 -->
<div class="lc-title" id="lcTitle">宝宝来信</div>
<div class="lc-desc" id="lcDesc">妈妈,今天我在你肚子里翻了个身……</div>