sinProject-Inc/talk

View on GitHub
src/routes/(authn)/pin-code/+page.svelte

Summary

Maintainability
Test Coverage
<script lang="ts">
    import { enhance } from '$app/forms'
    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'
    import type { ActionData } from './$types'

    export let form: ActionData

    let pin_input_element: HTMLInputElement

    let sending = false

    const web_logger = new WebLogger('pin-code')

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

        if (!form) location.href = '/sign-in'

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

        pin_input_element.select()
    })

    /* eslint-disable @typescript-eslint/explicit-function-return-type */
</script>

<SocialMetaTags title={App.get_page_title('PIN code')} 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="?/submit"
            use:enhance={() => {
                web_logger.info(
                    `on_submit: email: ${form?.email_address}, pin_code: ${pin_input_element.value}`
                )

                sending = true

                return async ({ update }) => {
                    await update()
                    sending = false
                }
            }}
        >
            <div class="title w-full">
                <h1 class="mb-2">{$_('enter_pin_code')}</h1>
                <p class="glass-text-faint-sm break-words text-sm font-light">
                    {$_('sent_pin_code', { values: { email: form?.email_address } })}
                </p>
            </div>
            <div class="mt-4 flex flex-col gap-3">
                <input type="hidden" name="email" value={form?.email_address} />
                <input
                    class="focus:outline-link] input"
                    type="text"
                    name="pin_code"
                    placeholder={$_('pin_code')}
                    required
                    bind:this={pin_input_element}
                />

                {#if form?.missing}<p class="error">{$_('pin_code_is_required')}</p>{/if}
                {#if form?.credentials}<p class="error">{$_('wrong_credentials')}</p>{/if}

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