From caa0942fed0d80f62b1103c9628fc153a1b382f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=C4=8Do?= Date: Wed, 1 Apr 2026 16:31:46 +0300 Subject: [PATCH 01/15] Login errors show after unsuccessful logging in --- webui/src/routes/home/+page.server.ts | 15 ++++++++++++-- webui/src/routes/home/+page.svelte | 28 ++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/webui/src/routes/home/+page.server.ts b/webui/src/routes/home/+page.server.ts index c067a8b8..9204c7e1 100644 --- a/webui/src/routes/home/+page.server.ts +++ b/webui/src/routes/home/+page.server.ts @@ -29,14 +29,25 @@ export const actions: Actions = { } const response = await loginLoginPost(body); + const status = response.status as number; if (response.status != 200){ - return fail(response.status); + if (status === 401) { + form.message = "Invalid username or password"; + } else if (status >= 500) { + form.message = "Server unavailable"; + } else if (status === 0) { + form.message = "Network error. Please try again."; + } else { + form.message = "Login failed. Please try again."; + } + console.log("RESPONSE ", response.status) + return fail(response.status, {form}); } cookies.set("access_token", response.data.access_token, {httpOnly: true, secure: !dev, sameSite: "lax", path: '/'}); cookies.set("refresh_token", response.data.refresh_token, {httpOnly: true, secure: !dev, sameSite: "lax", path: '/'}); - redirect(303, '/dashboard'); + throw redirect(303, '/dashboard'); }, }; diff --git a/webui/src/routes/home/+page.svelte b/webui/src/routes/home/+page.svelte index 9c1d7778..79829da5 100644 --- a/webui/src/routes/home/+page.svelte +++ b/webui/src/routes/home/+page.svelte @@ -11,13 +11,30 @@ let { data } = $props(); - const { form, enhance, errors, submitting } = $derived(superForm(data.form,{ + const { form, enhance, errors, submitting, message } = $derived(superForm(data.form,{ validators: zod4(loginSchema), validationMethod: 'onblur' } )); - let loginError: string | null = null; // whether login is successful or not + let loginError: string | null = $state(null); + + $effect(() => {loginError = $message ?? null;}) + + //prevUsername, prevPassword and effect are used to clear error message when user starts typing again after login error + let prevUsername = ''; + let prevPassword = ''; + + $effect(() => { + if ( + $form.username !== prevUsername || + $form.password !== prevPassword + ) { + loginError = null; + prevUsername = $form.username; + prevPassword = $form.password; + } + }) @@ -54,7 +71,7 @@ name="username" placeholder="Enter your username" bind:value={$form.username} - class={$errors.username ? 'border-red-500' : ''} + class={$errors.username || loginError ? 'border-red-500' : ''} required /> {#if $errors.username} @@ -74,14 +91,15 @@ name="password" placeholder="Enter your password" bind:value={$form.password} - class={$errors.password ? 'border-red-500' : ''} + class={$errors.password || loginError ? 'border-red-500' : ''} required /> {#if $errors.password} {$errors.password} {/if} -