2023-05-21 05:18:04 +00:00
|
|
|
<script lang="ts">
|
2023-07-31 05:24:33 +00:00
|
|
|
import { page } from '$app/stores';
|
2023-05-21 05:18:04 +00:00
|
|
|
import { superForm } from 'sveltekit-superforms/client';
|
2023-07-30 23:31:39 +00:00
|
|
|
import * as flashModule from 'sveltekit-flash-message/client';
|
2023-07-31 05:24:33 +00:00
|
|
|
import toast from 'svelte-french-toast';
|
2023-07-01 23:12:17 +00:00
|
|
|
import { AlertCircle } from "lucide-svelte";
|
2023-05-21 05:18:04 +00:00
|
|
|
import { userSchema } from '$lib/config/zod-schemas.js';
|
2023-06-30 22:08:45 +00:00
|
|
|
import Label from '$components/ui/label/Label.svelte';
|
|
|
|
|
import Input from '$components/ui/input/Input.svelte';
|
|
|
|
|
import Button from '$components/ui/button/Button.svelte';
|
2023-07-01 23:12:17 +00:00
|
|
|
import { Alert, AlertDescription, AlertTitle } from "$components/ui/alert";
|
2023-05-21 05:18:04 +00:00
|
|
|
|
|
|
|
|
export let data;
|
|
|
|
|
const { form, errors, enhance, delayed } = superForm(data.form, {
|
2023-07-30 23:31:39 +00:00
|
|
|
flashMessage: {
|
|
|
|
|
module: flashModule,
|
|
|
|
|
onError: ({ result, message }) => {
|
|
|
|
|
// Error handling for the flash message:
|
2023-07-31 05:24:33 +00:00
|
|
|
// - result is the ActionResult
|
|
|
|
|
// - message is the flash store (not the status message store)
|
|
|
|
|
const errorMessage = result.error.message
|
|
|
|
|
message.set({ type: 'error', message: errorMessage });
|
2023-07-30 23:31:39 +00:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
syncFlashMessage: false,
|
2023-05-21 05:18:04 +00:00
|
|
|
taintedMessage: null,
|
2023-05-29 06:34:39 +00:00
|
|
|
validationMethod: 'oninput',
|
2023-05-21 05:18:04 +00:00
|
|
|
delayMs: 0,
|
|
|
|
|
});
|
2023-07-31 05:24:33 +00:00
|
|
|
|
|
|
|
|
const flash = flashModule.getFlash(page);
|
|
|
|
|
|
|
|
|
|
$: {
|
|
|
|
|
if ($flash) {
|
|
|
|
|
toast.error($flash.message, {
|
|
|
|
|
duration: 5000
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-05-21 05:18:04 +00:00
|
|
|
</script>
|
|
|
|
|
|
2023-07-31 05:24:33 +00:00
|
|
|
<div class="signin">
|
|
|
|
|
<form method="POST" use:enhance>
|
|
|
|
|
<div class="grid w-full max-w-sm items-center gap-2">
|
|
|
|
|
<h2
|
|
|
|
|
class="scroll-m-20 border-b pb-2 text-3xl font-semibold tracking-tight transition-colors first:mt-0"
|
|
|
|
|
>
|
|
|
|
|
Sign into your account
|
|
|
|
|
</h2>
|
|
|
|
|
<Label for="username">Username</Label>
|
|
|
|
|
<Input type="text" id="username" name="username" placeholder="Username" autocomplete="username" data-invalid={$errors.username} bind:value={$form.username} />
|
|
|
|
|
<Label for="password">Password</Label>
|
2023-08-04 23:40:22 +00:00
|
|
|
<Input type="password" id="password" name="password" placeholder="Password" autocomplete="password" data-invalid={$errors.password} bind:value={$form.password} />
|
2023-07-31 05:24:33 +00:00
|
|
|
<Button type="submit">Sign In</Button>
|
|
|
|
|
</div>
|
|
|
|
|
</form>
|
2023-05-21 05:18:04 +00:00
|
|
|
{#if $errors._errors}
|
2023-07-01 23:12:17 +00:00
|
|
|
<Alert variant="destructive">
|
|
|
|
|
<AlertCircle class="h-4 w-4" />
|
|
|
|
|
<AlertTitle>Error</AlertTitle>
|
|
|
|
|
<AlertDescription>
|
|
|
|
|
{$errors._errors}
|
|
|
|
|
</AlertDescription>
|
|
|
|
|
</Alert>
|
2023-05-21 05:18:04 +00:00
|
|
|
{/if}
|
2023-07-31 05:24:33 +00:00
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<style lang="postcss">
|
|
|
|
|
.signin {
|
|
|
|
|
display: grid;
|
|
|
|
|
gap: 2rem;
|
|
|
|
|
}
|
|
|
|
|
</style>
|