修复补额度反馈自相矛盾及订阅状态未就绪兜底显式化

This commit is contained in:
yuming
2026-08-16 09:41:52 +08:00
parent 7f420762ef
commit 233a872c89
+35 -5
View File
@@ -168,11 +168,14 @@ Page({
/**
* 拉取额度风险,拼成给用户看的文案
* 说「谁的提醒有风险」而不是「还剩几次额度」——用户理解不了额度这种抽象概念
* @returns {Promise<boolean>} 本次刷新是否成功拿到了最新数据。
* 失败时不清空/覆盖 atRiskText——网络抖动时清空反而会掩盖真实存在的风险,
* 比"文案没更新"更糟;调用方需要这个返回值来判断该给用户什么反馈(见 onTopUp)。
*/
async refreshQuota() {
try {
const res = await api.subscribe('get')
if (!res || !res.success) return
if (!res || !res.success) return false
const names = res.atRiskNames || []
let text = ''
if (names.length > 0 && names.length <= 3) {
@@ -181,9 +184,11 @@ Page({
text = names.slice(0, 3).join('、') + ' 等 ' + names.length + ' 人'
}
this.setData({ atRiskText: text })
return true
} catch (e) {
// 查询失败就不显示提示,静默处理,不打扰用户
// 查询失败就不显示提示,静默处理,不打扰用户atRiskText 保留旧值不清空(理由见上)
console.warn('[index] 额度查询失败', e)
return false
}
},
@@ -198,14 +203,39 @@ Page({
wx.openSetting({ withSubscriptions: true })
return
}
// 显式处理 status === undefined,不让它靠"没匹配上第一个 if"隐式落地:
// undefined 出现在 onShow 里 subscribe.getStatus() 还没返回、用户就点了卡片的情况;
// 这里没法现查状态兜底——getStatus() 是异步的,哪怕 await 一下也会丢失手势上下文,
// 所以有意让 undefined 和 unknown(查询失败)一样,都保守地按 willPrompt 处理,
// 与 utils/subscribe.js 里「unknown 按 willPrompt 保守处理」的取向一致。
// 代价:如果用户真实状态其实是 mainSwitchOff(通知总开关关了),这里不会拦截去设置页,
// 只会静默调用 wx.requestSubscribeMessage,微信不弹窗、直接判定未同意,
// 用户只会看到下面「未开启提醒」的兜底提示,不会被引导去设置页——
// 这是已知且可接受的体验降级,不在本次修复范围内。
const isConservativeFallback = status === undefined || status === 'unknown'
if (isConservativeFallback) {
// 不阻断流程,只留一条日志方便排查——命中这条分支时用户体验会比正常
// 情况弱一点(见上面的注释),出问题时能在控制台里定位到具体是哪种取舍
console.warn('[index] onTopUp 命中保守兜底分支,status =', status)
}
subscribe.requestAndReport().then(accepted => {
if (accepted) {
this.refreshQuota()
if (!accepted) {
wx.showToast({ title: '未开启提醒', icon: 'none' })
return
}
// 补额度这步已经成功(微信侧确实同意了),但下面刷新风险文案是另一次独立请求,
// 可能失败;两者不能混为一谈,否则会出现"已补充"toast 和纹丝不动的风险卡片
// 同时出现的自相矛盾画面。用刷新结果决定 toast 措辞,不对刷新结果做绝对断言。
this.refreshQuota().then(refreshed => {
if (refreshed) {
wx.showToast({ title: '已补充提醒次数', icon: 'success' })
} else {
wx.showToast({ title: '未开启提醒', icon: 'none' })
wx.showToast({ title: '已补充,稍后自动更新', icon: 'none' })
}
})
})
},
/**