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' + }) }