From 8f1b53130bb119423e09db852bc7e3164518a549 Mon Sep 17 00:00:00 2001 From: "bert.hausmans" Date: Mon, 13 Apr 2026 08:55:38 +0200 Subject: [PATCH] fix(portal): separate login from navigation error handling Move router.replace() outside the login try/catch so navigation failures (e.g. stale Vite HMR dynamic imports) don't mask a successful login. Falls back to window.location on nav error. Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/portal/src/pages/login.vue | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/portal/src/pages/login.vue b/apps/portal/src/pages/login.vue index f31a082c..b7191d1b 100644 --- a/apps/portal/src/pages/login.vue +++ b/apps/portal/src/pages/login.vue @@ -57,8 +57,6 @@ async function onSubmit(): Promise { try { await authStore.login(form.value.email.trim(), form.value.password) await portalStore.hydrateAfterAuth() - const redirect = typeof route.query.to === 'string' ? route.query.to : '/dashboard' - await router.replace(redirect || '/dashboard') } catch (error: unknown) { if (error instanceof Error && error.message === 'Sessie kon niet worden gestart.') { @@ -68,10 +66,20 @@ async function onSubmit(): Promise { } const ax = error as { response?: { data?: { message?: string } } } errorMessage.value = mapLoginErrorMessage(ax.response?.data?.message) + + return } finally { isSubmitting.value = false } + + // Navigate after login — outside try/catch so navigation errors + // (e.g. stale dynamic imports) don't mask a successful login. + const redirect = typeof route.query.to === 'string' ? route.query.to : '/dashboard' + router.replace(redirect || '/dashboard').catch(() => { + // Dynamic import can fail after Vite HMR; a full reload recovers. + window.location.href = redirect || '/dashboard' + }) }