From 9f65b9e65ead6cc6b8ce5cfcf650b49fe134cd91 Mon Sep 17 00:00:00 2001
From: ivarlovlie <git@ivarlovlie.no>
Date: Sat, 24 Sep 2022 15:38:39 +0800
Subject: feat: Implement functionality for requesting password resets

---
 apps/kit/src/routes/(public)/reset/+page.svelte | 103 +++++++++++++++++++++---
 1 file changed, 93 insertions(+), 10 deletions(-)

(limited to 'apps/kit/src/routes/(public)/reset/+page.svelte')

diff --git a/apps/kit/src/routes/(public)/reset/+page.svelte b/apps/kit/src/routes/(public)/reset/+page.svelte
index 41c4728..8568234 100644
--- a/apps/kit/src/routes/(public)/reset/+page.svelte
+++ b/apps/kit/src/routes/(public)/reset/+page.svelte
@@ -1,26 +1,109 @@
+<script lang="ts">
+    import { create_forgot_password_request } from "$lib/api/user";
+    import Alert from "$lib/components/alert.svelte";
+    import LL from "$lib/i18n/i18n-svelte";
+    import type { ErrorResult } from "$lib/models/ErrorResult";
+    import { get } from "svelte/store";
+
+    const formData = {
+        email: "",
+    };
+
+    $: showErrorAlert =
+        (errorData?.text.length ?? 0 + errorData?.title.length ?? 0) > 0 &&
+        !showSuccessAlert;
+
+    const errorData = {
+        text: "",
+        title: "",
+    } as ErrorResult;
+
+    $: showSuccessAlert =
+        (successData?.text.length ?? 0 + successData?.title.length ?? 0) > 0;
+    const successData = {
+        text: "",
+        title: "",
+    };
+
+    const strings = get(LL);
+
+    async function submit() {
+        errorData.text = "";
+        errorData.title = "";
+        const request = await create_forgot_password_request(formData.email);
+        if (!request.ok) {
+            errorData.text = request.data.text ?? strings.common.tryAgainSoon();
+            errorData.title =
+                request.data.title ?? strings.common.unexpectedError();
+            return;
+        }
+        successData.title = strings.common.success() + "!";
+        successData.text = strings.reset.requestSentMessage();
+    }
+</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">Request a password reset</h2>
+        <h2
+            class="mt-6 text-center text-3xl tracking-tight font-bold text-gray-900"
+        >
+            {$LL.reset.resetPassword()}
+        </h2>
         <p class="mt-2 text-center text-sm text-gray-600">
-            Or
-            <a href="/login" class="font-medium text-indigo-600 hover:text-indigo-500">go to login page</a>
+            {$LL.common.or()}
+            <a
+                href="/login"
+                class="font-medium text-indigo-600 hover:text-indigo-500"
+                >{$LL.reset.gotoLoginPage().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="#" method="POST">
+            <form
+                class="space-y-6"
+                on:submit|preventDefault={submit}
+                method="POST"
+            >
+                <Alert
+                    title={errorData.title}
+                    message={errorData.text}
+                    type="error"
+                    visible={showErrorAlert}
+                />
+
+                <Alert
+                    type="success"
+                    title={successData.title}
+                    message={successData.text}
+                    visible={showSuccessAlert}
+                />
                 <div>
-                    <label for="email" class="block text-sm font-medium text-gray-700"> Email address </label>
+                    <label
+                        for="email"
+                        class="block text-sm font-medium text-gray-700"
+                    >
+                        {$LL.common.emailAddress()}</label
+                    >
                     <div class="mt-1">
-                        <input id="email" name="email" type="email" autocomplete="email" required
-                               class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">
+                        <input
+                            id="email"
+                            name="email"
+                            type="email"
+                            autocomplete="email"
+                            required
+                            bind:value={formData.email}
+                            class="appearance-none block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm"
+                        />
                     </div>
                 </div>
                 <div>
-                    <button type="submit"
-                            class="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
-                        Send request
+                    <button
+                        type="submit"
+                        class="w-full flex justify-center py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
+                    >
+                        {$LL.common.send($LL.common.request().toLowerCase())}
                     </button>
                 </div>
             </form>
-- 
cgit v1.3

