Skip to content

Commit 3c8aba1

Browse files
kojiraclaude
andcommitted
カウントダウンを絶対時刻から計算する
残り秒を1秒ずつ引いていたため、タブが背面にあると setInterval が間引かれて (止まることもある)実際より長い残り時間を表示していた。戻ってきたときに 「引けるのに引けないと見える」ことになり、今回直したかった症状そのものが 再発する。 - おみくじページ: 明ける時刻を決めて毎tickそこから計算する - トップページ: 保存済みの「次に引ける時刻」から毎tick計算し直す - 残り時間の整形を omikujiCooldown.js に一本化し、両ページで同じ表記にする Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent d78892c commit 3c8aba1

2 files changed

Lines changed: 20 additions & 13 deletions

File tree

web/pages/index.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,10 @@ export default {
182182
mounted() {
183183
this.pickLabomiLine();
184184
this.refreshOmikuji();
185-
// 1秒ごとに減らす。0になったらボタンの文言が「おみくじを引く」に戻る。
186-
this.omikujiTimerId = setInterval(() => {
187-
if (this.omikujiRemaining > 0) this.omikujiRemaining -= 1;
188-
}, 1000);
185+
// 1秒ごとに保存済みの「次に引ける時刻」から計算し直す。残り秒を引き算で
186+
// 減らすと、タブが背面のとき setInterval が間引かれて実際より長い残り時間を
187+
// 表示してしまい、引けるのに「前回のおみくじ」のままになる。
188+
this.omikujiTimerId = setInterval(this.refreshOmikuji, 1000);
189189
},
190190
beforeDestroy() {
191191
if (this.omikujiTimerId) clearInterval(this.omikujiTimerId);

web/pages/omikuji.vue

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,11 @@ import { getAuth, onAuthStateChanged } from "firebase/auth";
8787
import { mapGetters } from "vuex";
8888
import ResultCard from "@/components/OmikujiResult";
8989
import OmikujiScene from "@/components/OmikujiScene";
90-
import { saveOmikujiState, loadOmikujiState } from "@/utils/omikujiCooldown";
90+
import {
91+
saveOmikujiState,
92+
loadOmikujiState,
93+
formatOmikujiRemaining,
94+
} from "@/utils/omikujiCooldown";
9195
9296
function resolveCurrentUser(auth) {
9397
return new Promise((resolve) => {
@@ -254,8 +258,16 @@ export default {
254258
},
255259
startTimer() {
256260
if (this.timerId) clearInterval(this.timerId);
261+
// 残り秒を1秒ずつ引くのではなく、明ける時刻を決めて毎回そこから計算する。
262+
// タブが背面にあると setInterval は間引かれる(止まることもある)ため、
263+
// 引き算だと戻ってきたときに実際より長い残り時間を表示してしまい、
264+
// 「引けるのに引けないと見える」という直したかった症状が再発する。
265+
const deadline = Date.now() + this.remaining * 1000;
257266
this.timerId = setInterval(() => {
258-
this.remaining -= 1;
267+
this.remaining = Math.max(
268+
0,
269+
Math.ceil((deadline - Date.now()) / 1000)
270+
);
259271
if (this.remaining <= 0) {
260272
clearInterval(this.timerId);
261273
this.timerId = null;
@@ -275,13 +287,8 @@ export default {
275287
computed: {
276288
...mapGetters(["user"]),
277289
remainingText() {
278-
const s = Math.max(0, this.remaining);
279-
const h = Math.floor(s / 3600);
280-
const m = Math.floor((s % 3600) / 60);
281-
const sec = s % 60;
282-
if (h > 0) return `${h}時間${m}`;
283-
if (m > 0) return `${m}${sec}`;
284-
return `${sec}`;
290+
// トップページと同じ表記にする(整形は omikujiCooldown.js に一本化)。
291+
return formatOmikujiRemaining(this.remaining);
285292
},
286293
shareUrl() {
287294
return this.$config.baseUrl;

0 commit comments

Comments
 (0)