diff --git a/src/components/StartTask.vue b/src/components/StartTask.vue index c7fd56e..7d15d43 100644 --- a/src/components/StartTask.vue +++ b/src/components/StartTask.vue @@ -1,11 +1,15 @@ - diff --git a/src/components/Study.vue b/src/components/Study.vue index 001c4e4..ba17c3a 100644 --- a/src/components/Study.vue +++ b/src/components/Study.vue @@ -1,28 +1,48 @@ diff --git a/src/components/composables/useTimer.ts b/src/components/composables/useTimer.ts index 242acbb..cd13a1c 100644 --- a/src/components/composables/useTimer.ts +++ b/src/components/composables/useTimer.ts @@ -18,6 +18,14 @@ export function useTimer(audioUrl: string = '/resource/notification.mp3') { timerRunning.value = false; }; + const syncDisplay = (durationMs: number) => { + const safeDuration = Math.max(durationMs, 0); + remainingTime.value = safeDuration; + timerMinutes.value = Math.floor(safeDuration / 1000 / 60); + timerSeconds.value = Math.floor((safeDuration / 1000) % 60); + timerIsOver.value = safeDuration === 0; + }; + const handleCountdownComplete = () => { audio.loop = true; audio.play(); @@ -91,6 +99,7 @@ export function useTimer(audioUrl: string = '/resource/notification.mp3') { timerRunning, timerIsOver, runCountdown, + syncDisplay, clear, checkAudioPermission, requestAudioPermission, diff --git a/src/router/index.ts b/src/router/index.ts index 96415cb..5d86067 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,4 +1,5 @@ import { createRouter, createWebHistory, type RouteRecordRaw } from "vue-router"; +import StartTask from "@/components/StartTask.vue"; const routes: RouteRecordRaw[] = [ { @@ -17,6 +18,7 @@ const routes: RouteRecordRaw[] = [ }, { path: "/study", + name: "study", component: () => import("@/components/Study.vue"), meta: { requiresAuth: true }, }, @@ -28,7 +30,7 @@ const routes: RouteRecordRaw[] = [ { path: "/start-task/:taskNum", name: "start-task", - component: () => import("@/components/StartTask.vue"), + component: StartTask, meta: { requiresAuth: true }, }, { @@ -58,6 +60,17 @@ const router = createRouter({ routes, }); +router.onError((error, to) => { + const message = String((error as Error)?.message || ""); + const isChunkLoadError = + message.includes("Failed to fetch dynamically imported module") || + message.includes("Importing a module script failed") || + message.includes("Loading chunk"); + if (isChunkLoadError && typeof window !== "undefined") { + window.location.assign(to.fullPath); + } +}); + router.beforeEach((to) => { if (to.meta.requiresAuth === false) return true; const isLoggedIn = localStorage.getItem("isLoggedIn") === "true";