From 1024a80731c260b1686f57d289cbd50dfe2a24bd Mon Sep 17 00:00:00 2001 From: Jennie Robinson Faber Date: Thu, 19 Mar 2026 11:01:03 +0000 Subject: [PATCH] Add login form to coming-soon page and allow admin routes through Coming-soon page now shows a magic link login form for unauthenticated visitors and a wiki link + sign out for logged-in members. The coming-soon middleware allows /admin routes through (still protected by admin middleware). A /login redirect page ensures invite email links work. --- app/middleware/coming-soon.global.js | 10 ++- app/pages/coming-soon.vue | 122 +++++++++++++++++++++++++-- app/pages/login.vue | 3 + 3 files changed, 127 insertions(+), 8 deletions(-) create mode 100644 app/pages/login.vue diff --git a/app/middleware/coming-soon.global.js b/app/middleware/coming-soon.global.js index 3176935..11dc3cc 100644 --- a/app/middleware/coming-soon.global.js +++ b/app/middleware/coming-soon.global.js @@ -8,11 +8,15 @@ export default defineNuxtRouteMiddleware(async (to, from) => { return; } - // Allow access to the coming-soon page and OIDC login - if (to.path === "/coming-soon" || to.path === "/auth/wiki-login") { + // Allow access to the coming-soon page, OIDC login, and admin routes + if ( + to.path === "/coming-soon" || + to.path === "/auth/wiki-login" || + to.path.startsWith("/admin") + ) { return; } - // Redirect all other routes to coming-soon — no exceptions + // 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 13ad706..19041b5 100644 --- a/app/pages/coming-soon.vue +++ b/app/pages/coming-soon.vue @@ -1,9 +1,79 @@ @@ -11,4 +81,46 @@ definePageMeta({ layout: "coming-soon", }); + +const { isAuthenticated, memberData, checkMemberStatus, logout } = useAuth(); + +const email = ref(""); +const isLoggingIn = ref(false); +const loginSuccess = ref(false); +const loginError = ref(""); + +const isFormValid = computed(() => email.value && email.value.includes("@")); + +await checkMemberStatus(); + +const handleLogin = async () => { + if (isLoggingIn.value) return; + + isLoggingIn.value = true; + loginError.value = ""; + + try { + const response = await $fetch("/api/auth/login", { + method: "POST", + body: { email: email.value }, + }); + + if (response.success) { + loginSuccess.value = true; + } + } catch (err) { + if (err.statusCode === 500) { + loginError.value = "Failed to send login email. Please try again later."; + } else { + loginError.value = + err.statusMessage || "Something went wrong. Please try again."; + } + } finally { + isLoggingIn.value = false; + } +}; + +const handleLogout = async () => { + await logout(); +}; diff --git a/app/pages/login.vue b/app/pages/login.vue new file mode 100644 index 0000000..5fe8d82 --- /dev/null +++ b/app/pages/login.vue @@ -0,0 +1,3 @@ +