diff --git a/app/middleware/coming-soon.global.js b/app/middleware/coming-soon.global.js index dc6c342..4a102b1 100644 --- a/app/middleware/coming-soon.global.js +++ b/app/middleware/coming-soon.global.js @@ -1,4 +1,4 @@ -export default defineNuxtRouteMiddleware((to, from) => { +export default defineNuxtRouteMiddleware(async (to, from) => { const config = useRuntimeConfig(); const isComingSoonMode = config.public.comingSoon === "true" || config.public.comingSoon === true; @@ -13,6 +13,25 @@ export default defineNuxtRouteMiddleware((to, from) => { return; } + // Allow authenticated users to bypass coming-soon + const authToken = useCookie("auth-token"); + if (authToken.value) { + // On the server, verify the JWT is actually valid + if (import.meta.server) { + try { + const { jwtSecret } = useRuntimeConfig(); + const jwt = await import("jsonwebtoken").then((m) => m.default); + jwt.verify(authToken.value, jwtSecret); + return; + } catch { + // Invalid/expired token — fall through to coming-soon redirect + } + } else { + // Client-side: trust the cookie (SSR already validated on initial load) + return; + } + } + // Redirect all other routes to coming-soon return navigateTo("/coming-soon"); }); diff --git a/app/pages/coming-soon.vue b/app/pages/coming-soon.vue index a52a3dc..26a5954 100644 --- a/app/pages/coming-soon.vue +++ b/app/pages/coming-soon.vue @@ -1,9 +1,16 @@ @@ -11,4 +18,6 @@ definePageMeta({ layout: "coming-soon", }); + +const { openLoginModal } = useLoginModal();