From 7a5ba5ea4aec0704070cfe8d63ba504a07d88cc6 Mon Sep 17 00:00:00 2001
From: ivarlovlie <git@ivarlovlie.no>
Date: Sat, 1 Oct 2022 16:44:31 +0800
Subject: feat: Functionality complete public sites

---
 .../routes/(main)/(public)/sign-up/+page.svelte    | 61 +++++++++++++++++-----
 1 file changed, 47 insertions(+), 14 deletions(-)

(limited to 'apps/kit/src/routes/(main)/(public)/sign-up/+page.svelte')

diff --git a/apps/kit/src/routes/(main)/(public)/sign-up/+page.svelte b/apps/kit/src/routes/(main)/(public)/sign-up/+page.svelte
index 8b89190..0dfa41a 100644
--- a/apps/kit/src/routes/(main)/(public)/sign-up/+page.svelte
+++ b/apps/kit/src/routes/(main)/(public)/sign-up/+page.svelte
@@ -1,29 +1,62 @@
-<script>
-    import { Button, Input } from "$lib/components";
+<script lang="ts">
+    import { goto } from "$app/navigation";
+    import { create_account } from "$lib/api/user";
+    import { Button, Input, Alert } from "$lib/components";
     import LL from "$lib/i18n/i18n-svelte";
+    import type { CreateAccountPayload } from "$lib/models/CreateAccountPayload";
+    import type { ErrorResult } from "$lib/models/ErrorResult";
 
     const formData = {
-        emailAddress: "",
+        username: "",
         password: "",
-    };
+    } as CreateAccountPayload;
+
+    const errorData = {
+        text: "",
+        title: "",
+    } as ErrorResult;
+    let loading = false;
+    $: showErrorAlert =
+        (errorData?.text.length ?? 0 + errorData?.title.length ?? 0) > 0;
+
+    async function submitFormAsync() {
+        loading = true;
+        errorData.text = "";
+        errorData.title = "";
+        const response = await create_account(formData);
+        loading = false;
+        if (response.ok) {
+            await goto("/home");
+            return;
+        }
+        errorData.title = response.data?.title ?? $LL.unexpectedError();
+        errorData.text = response.data?.text ?? $LL.tryAgainSoon();
+    }
 </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.createYourNewAccount()}
+    <div class="sm:mx-auto sm:w-full p-2 sm:p-0 sm:max-w-md">
+        <h2 class="mt-6 text-3xl tracking-tight font-bold text-gray-900">
+            {$LL.signUpPage.createYourNewAccount()}
         </h2>
-        <p class="mt-2 text-center text-sm text-gray-600">
+        <p class="mt-2 text-sm text-gray-600">
             {$LL.or().toLowerCase()}
-            <a href="/sign-in" class="link">{$LL.signIntoYourAccount()}</a>
+            <a href="/sign-in" class="link">
+                {$LL.signIntoYourAccount().toLowerCase()}
+            </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">
-            <form class="space-y-6" action="#">
+            <Alert
+                title={errorData.title}
+                message={errorData.text}
+                type="error"
+                class="mb-2"
+                visible={showErrorAlert}
+            />
+            <form class="space-y-6" on:submit|preventDefault={submitFormAsync}>
                 <Input
                     label={$LL.emailAddress()}
                     id="email"
@@ -31,7 +64,7 @@
                     autocomplete="email"
                     required
                     type="email"
-                    bind:value={formData.emailAddress}
+                    bind:value={formData.username}
                 />
 
                 <Input
@@ -42,7 +75,7 @@
                     type="password"
                     bind:value={formData.password}
                 />
-                <Button type="submit" text={$LL.submit()} fullWidth />
+                <Button type="submit" text={$LL.submit()} {loading} fullWidth />
             </form>
         </div>
     </div>
-- 
cgit v1.3

