修复补额度反馈自相矛盾及订阅状态未就绪兜底显式化
This commit is contained in:
+35
-5
@@ -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' })
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user