修复补额度反馈自相矛盾及订阅状态未就绪兜底显式化
This commit is contained in:
+35
-5
@@ -168,11 +168,14 @@ Page({
|
|||||||
/**
|
/**
|
||||||
* 拉取额度风险,拼成给用户看的文案
|
* 拉取额度风险,拼成给用户看的文案
|
||||||
* 说「谁的提醒有风险」而不是「还剩几次额度」——用户理解不了额度这种抽象概念
|
* 说「谁的提醒有风险」而不是「还剩几次额度」——用户理解不了额度这种抽象概念
|
||||||
|
* @returns {Promise<boolean>} 本次刷新是否成功拿到了最新数据。
|
||||||
|
* 失败时不清空/覆盖 atRiskText——网络抖动时清空反而会掩盖真实存在的风险,
|
||||||
|
* 比"文案没更新"更糟;调用方需要这个返回值来判断该给用户什么反馈(见 onTopUp)。
|
||||||
*/
|
*/
|
||||||
async refreshQuota() {
|
async refreshQuota() {
|
||||||
try {
|
try {
|
||||||
const res = await api.subscribe('get')
|
const res = await api.subscribe('get')
|
||||||
if (!res || !res.success) return
|
if (!res || !res.success) return false
|
||||||
const names = res.atRiskNames || []
|
const names = res.atRiskNames || []
|
||||||
let text = ''
|
let text = ''
|
||||||
if (names.length > 0 && names.length <= 3) {
|
if (names.length > 0 && names.length <= 3) {
|
||||||
@@ -181,9 +184,11 @@ Page({
|
|||||||
text = names.slice(0, 3).join('、') + ' 等 ' + names.length + ' 人'
|
text = names.slice(0, 3).join('、') + ' 等 ' + names.length + ' 人'
|
||||||
}
|
}
|
||||||
this.setData({ atRiskText: text })
|
this.setData({ atRiskText: text })
|
||||||
|
return true
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// 查询失败就不显示提示,静默处理,不打扰用户
|
// 查询失败就不显示提示,静默处理,不打扰用户;atRiskText 保留旧值不清空(理由见上)
|
||||||
console.warn('[index] 额度查询失败', e)
|
console.warn('[index] 额度查询失败', e)
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -198,14 +203,39 @@ Page({
|
|||||||
wx.openSetting({ withSubscriptions: true })
|
wx.openSetting({ withSubscriptions: true })
|
||||||
return
|
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 => {
|
subscribe.requestAndReport().then(accepted => {
|
||||||
if (accepted) {
|
if (!accepted) {
|
||||||
this.refreshQuota()
|
wx.showToast({ title: '未开启提醒', icon: 'none' })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 补额度这步已经成功(微信侧确实同意了),但下面刷新风险文案是另一次独立请求,
|
||||||
|
// 可能失败;两者不能混为一谈,否则会出现"已补充"toast 和纹丝不动的风险卡片
|
||||||
|
// 同时出现的自相矛盾画面。用刷新结果决定 toast 措辞,不对刷新结果做绝对断言。
|
||||||
|
this.refreshQuota().then(refreshed => {
|
||||||
|
if (refreshed) {
|
||||||
wx.showToast({ title: '已补充提醒次数', icon: 'success' })
|
wx.showToast({ title: '已补充提醒次数', icon: 'success' })
|
||||||
} else {
|
} else {
|
||||||
wx.showToast({ title: '未开启提醒', icon: 'none' })
|
wx.showToast({ title: '已补充,稍后自动更新', icon: 'none' })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user