sinProject-Inc/talk

View on GitHub
src/routes/(authn)/sign-in/+page.svelte

Summary

Maintainability
Test Coverage
<script lang="ts">
    import { base } from '$app/paths'
    import { page } from '$app/stores'
    import { App } from '$lib/app/app'
    import LoadingIcon from '$lib/components/icons/loading_icon.svelte'
    import SocialMetaTags from '$lib/components/social_meta_tags.svelte'
    import { WebLogger } from '$lib/view/log/web_logger'
    import { onMount } from 'svelte'
    import { _ } from 'svelte-i18n'

    let email_input_element: HTMLInputElement

    const redirect_url = $page.url.searchParams.get('redirect_url') ?? ''
    const encoded_redirect_url = encodeURIComponent(redirect_url)

    let sending = false

    const web_logger = new WebLogger('sign_in')

    function on_submit(): void {
        web_logger.info(`on_submit: email: ${email_input_element.value}`)
        sending = true
    }

    onMount(() => {
        web_logger.add_event_listeners()

        document.onfocus = (event): void => {
            if (event.target instanceof HTMLInputElement) event.target.select()
        }

        email_input_element.select()
    })
</script>

<SocialMetaTags title={App.get_page_title('Sign in')} description={App.description} />

<div class="flex h-screen items-center justify-center">
    <div class="center-container card-parent">
        <form
            class="card glass-panel mx-3 mb-0 p-4 md:mb-40"
            method="POST"
            action="{base}/pin-code?/sign_in&redirect_url={encoded_redirect_url}"
            on:submit={on_submit}
        >
            <div class="title w-full">
                <h1 class="mb-2">{$_('sign_in')}</h1>
                <h2 class="glass-text-faint-sm text-sm font-light">{$_('or_create_account')}</h2>
            </div>

            <div class="mt-4 flex flex-col gap-3">
                <input
                    type="email"
                    name="email"
                    class="input"
                    placeholder={$_('email')}
                    required
                    bind:this={email_input_element}
                />

                <button class="glass-button flex flex-row justify-center" type="submit" disabled={sending}>
                    {#if sending}
                        <div class="w-6 animate-spin">
                            <LoadingIcon />
                        </div>
                    {:else}
                        {$_('continue')}
                    {/if}
                </button>
                <input type="hidden" name="translated_pin_code" value={$_('pin_code')} />
            </div>
        </form>
    </div>
</div>