diff --git a/utils/timer.js b/utils/timer.js index c0d1c41..312d2c6 100644 --- a/utils/timer.js +++ b/utils/timer.js @@ -12,6 +12,17 @@ class Timer { this._running = false this._paused = false this._completed = false + this._appShowBound = false + + // WeChat freezes setInterval while the mini-program is in background. + // When the user returns, force an immediate tick so the UI jumps to + // the actual elapsed time (instead of staying on the last pre-background + // frame) and any missed halfway / 30s / 10s reminders can still fire. + this._onAppShow = () => { + if (this._running && !this._paused) { + this._tick() + } + } } start(duration) { @@ -24,6 +35,15 @@ class Timer { this._startTime = Date.now() this._tick() this._intervalId = setInterval(() => { this._tick() }, 1000) + + // Register foreground listener (idempotent — we keep a flag so we don't + // double-register if start() is called multiple times in one session) + if (!this._appShowBound && typeof wx.onAppShow === 'function') { + try { + wx.onAppShow(this._onAppShow) + this._appShowBound = true + } catch (e) {} + } } pause() {