fix(timer): 完成页圆环覆盖弹窗 + 自定义确认 modal 替代 wx.showModal

训练完成的三个相关 bug:
1. progress-ring 圆环覆盖完成页弹窗 → @tap ring wx:if 让完成态时直接 unmount
2. 完成弹窗内按钮需要点 2 次才能响应 → completion-mask 加 catchtouchmove 拦截 touchmove
3. wx.showModal "结束训练" 系统弹窗在 stacking context 下 hit-test 不稳

根因: .timer-page.page-enter 永久保留 transform: translateY(0),
创建永久 stacking context,影响 native modal 的 WebView 部分 hit-test。

修法:
- 新增自定义 stop-confirm modal (catchtouchmove + 内部 catchtap + bindtap),
  与 ui-modal/settings.plan-editor-mask 同模式,行为可靠
- completion-mask 用相同模式拦截 touchmove
- 顺便修 overtime-badge 暗色 (rgba(var(--success-rgb)))
This commit is contained in:
2026-07-08 15:21:46 +08:00
parent 503f01f6e9
commit 326bc013fe
3 changed files with 119 additions and 11 deletions
+20 -8
View File
@@ -25,6 +25,7 @@ Page({
confettiPieces: [],
// Completion modal (full-screen summary after training ends)
showCompletion: false,
showStopConfirm: false, // 自定义"结束训练"确认弹窗,替代 wx.showModal
completionElapsed: 0,
completionTarget: 0,
completionOvertime: 0,
@@ -260,13 +261,19 @@ Page({
},
onStop() {
wx.showModal({
title: '结束训练',
content: '确定要结束本次训练吗?',
success: (res) => {
if (res.confirm) this.finishTraining()
}
})
// 用自定义确认弹窗替代 wx.showModal:
// 系统原生 modal 在 WebView stacking context 下 hit-test 偶发不稳,
// 自定义 modal + catchtouchmove 与现有 completion-mask 同模式,行为更可靠。
this.setData({ showStopConfirm: true })
},
onStopCancel() {
this.setData({ showStopConfirm: false })
},
onStopConfirm() {
this.setData({ showStopConfirm: false })
this.finishTraining()
},
finishTraining() {
@@ -381,5 +388,10 @@ Page({
// Re-init countUp so the big number rolls again on next start
_countUpTask: null
})
}
},
// No-op handler for catchtouchmove. Swallows move events that would
// otherwise bubble to underlying timer page controls (causing missed
// taps on the completion modal).
onNoop() { /* swallow */ }
})