aboutsummaryrefslogtreecommitdiffstats
path: root/apps/kit/src/routes/(main)/(public)/sign-in
diff options
context:
space:
mode:
Diffstat (limited to 'apps/kit/src/routes/(main)/(public)/sign-in')
-rw-r--r--apps/kit/src/routes/(main)/(public)/sign-in/+page.svelte107
1 files changed, 107 insertions, 0 deletions
diff --git a/apps/kit/src/routes/(main)/(public)/sign-in/+page.svelte b/apps/kit/src/routes/(main)/(public)/sign-in/+page.svelte
new file mode 100644
index 0000000..3802722
--- /dev/null
+++ b/apps/kit/src/routes/(main)/(public)/sign-in/+page.svelte
@@ -0,0 +1,107 @@
+<script lang="ts">
+ import { goto } from "$app/navigation";
+ import { login } from "$lib/api/user";
+ import Button from "$lib/components/button.svelte";
+ import Checkbox from "$lib/components/checkbox.svelte";
+ import Input from "$lib/components/input.svelte";
+ import LL from "$lib/i18n/i18n-svelte";
+ import type { ErrorResult } from "$lib/models/ErrorResult";
+ import type { LoginPayload } from "$lib/models/LoginPayload";
+
+ let loading = false;
+
+ const data = {
+ username: "",
+ password: "",
+ } as LoginPayload;
+
+ let error = {
+ text: "",
+ title: "",
+ } as ErrorResult;
+
+ async function submitFormAsync() {
+ error = { text: "", title: "" };
+ loading = true;
+ const loginResponse = await login(data);
+ if (loginResponse.ok) {
+ await goto("/home");
+ } else {
+ error.title = loginResponse.data.title;
+ error.text = loginResponse.data.text;
+ }
+ loading = false;
+ }
+</script>
+
+<div class="min-h-full flex flex-col justify-center py-12 sm:px-6 lg:px-8">
+ <div class="sm:mx-auto sm:w-full sm:max-w-md">
+ <h2
+ class="mt-6 text-center text-3xl tracking-tight font-bold text-gray-900"
+ >
+ {$LL.login.loginToYourAccount()}
+ </h2>
+ <p class="mt-2 text-center text-sm text-gray-600">
+ {$LL.common.or()}
+ <a href="/sign-up" class="link">{$LL.login.createANewAccount()}</a>
+ </p>
+ </div>
+ <div class="mt-8 sm:mx-auto sm:w-full sm:max-w-md">
+ <div class="bg-white py-8 px-4 shadow sm:rounded-lg sm:px-10">
+ {#if error.text || error.title}
+ <div class="rounded-md bg-red-50 p-3 mb-3">
+ {#if error.title}
+ <h3 class="text-sm font-medium text-red-600">
+ {error.title}
+ </h3>
+ {/if}
+ {#if error.text}
+ <div class="mt-2 text-sm text-red-500">
+ {error.text}
+ </div>
+ {/if}
+ </div>
+ {/if}
+ <form class="space-y-6" on:submit|preventDefault={submitFormAsync}>
+ <Input
+ id="email"
+ name="email"
+ type="email"
+ label={$LL.common.emailAddress()}
+ required
+ value={data.username}
+ />
+
+ <Input
+ id="password"
+ name="password"
+ type="password"
+ label={$LL.login.password()}
+ autocomplete="current-password"
+ required
+ value={data.password}
+ />
+
+ <div class="flex items-center justify-between">
+ <Checkbox
+ id="remember-me"
+ name="remember-me"
+ label={$LL.login.notMyComputer()}
+ />
+ <div class="text-sm">
+ <a href="/reset-password" class="link">
+ {$LL.login.forgotPassword()}
+ </a>
+ </div>
+ </div>
+
+ <Button
+ text={$LL.common.logIn()}
+ fullWidth
+ type="submit"
+ {loading}
+ />
+ </form>
+ </div>
+ </div>
+</div>