From c597fff15abbd7c925b821ae09e24dfb32fc9f33 Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Fri, 14 Mar 2025 22:19:40 +0100 Subject: [PATCH] Skeleton: Initial support for user emails --- src/routes/+layout.svelte | 136 +++++++++++++++++++++++++++++++++----- 1 file changed, 121 insertions(+), 15 deletions(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 47672ff..b2460c9 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -18,6 +18,7 @@ RacePickCard, RaceResultCard, SeasonPickCard, + EMailIcon, } from "$lib/components"; import { get_avatar_preview_event_handler } from "$lib/image"; import { @@ -37,11 +38,12 @@ type ModalComponent, type ToastStore, getToastStore, + SlideToggle, } from "@skeletonlabs/skeleton"; import { computePosition, autoUpdate, offset, shift, flip, arrow } from "@floating-ui/dom"; import { invalidate } from "$app/navigation"; - import { get_error_toast } from "$lib/toast"; - import { pb, subscribe, unsubscribe } from "$lib/pocketbase"; + import { get_error_toast, get_info_toast } from "$lib/toast"; + import { pb, pbUser, subscribe, unsubscribe } from "$lib/pocketbase"; import { AVATAR_HEIGHT, AVATAR_WIDTH } from "$lib/config"; import { error } from "@sveltejs/kit"; @@ -138,11 +140,33 @@ // Reactive state let username_value: string = $state(data.user?.username ?? ""); let firstname_value: string = $state(data.user?.firstname ?? ""); + let email_value: string = $state(data.user?.email ?? ""); let password_value: string = $state(""); let avatar_value: FileList | undefined = $state(); + let registration_mode: boolean = $state(false); + + // Add "Enter" event listeners for login/register text inputs + const enter_handler = (event: KeyboardEvent) => { + if (event.key === "Enter") { + // Cancel the default action, if needed + event.preventDefault(); + + registration_mode ? update_profile(true) : login(); + } + }; + // Database actions const login = async (): Promise => { + if (!username_value || username_value.trim() === "") { + toastStore.trigger(get_error_toast("Please enter your username!")); + return; + } + if (!password_value || password_value.trim() === "") { + toastStore.trigger(get_error_toast("Please enter your password!")); + return; + } + try { await pb.collection("users").authWithPassword(username_value, password_value); } catch (error) { @@ -150,6 +174,9 @@ } await invalidate("data:user"); drawerStore.close(); + username_value = data.user?.username ?? ""; + firstname_value = data.user?.firstname ?? ""; + email_value = data.user?.email ?? ""; password_value = ""; }; @@ -159,6 +186,7 @@ drawerStore.close(); username_value = ""; firstname_value = ""; + email_value = ""; password_value = ""; }; @@ -201,6 +229,10 @@ toastStore.trigger(get_error_toast("Please enter your first name!")); return; } + if (!email_value || email_value.trim() === "") { + toastStore.trigger(get_error_toast("Please enter your e-mail address!")); + return; + } if (!password_value || password_value.trim() === "") { toastStore.trigger(get_error_toast("Please enter a password!")); return; @@ -209,11 +241,17 @@ await pb.collection("users").create({ username: username_value.trim(), firstname: firstname_value.trim(), + email: email_value.trim(), password: password_value.trim(), passwordConfirm: password_value.trim(), // lol admin: false, }); + await pb.collection("users").requestVerification(email_value.trim()); + toastStore.trigger(get_info_toast("Check your inbox!")); + + pb.authStore.clear(); + await login(); } else { if (!data.user?.id || data.user.id === "") { @@ -221,12 +259,20 @@ return; } + if (email_value && email_value.trim() !== data.user.email) { + await pb.collection("users").requestEmailChange(email_value.trim()); + toastStore.trigger(get_info_toast("Check your inbox!")); + } + await pb.collection("users").update(data.user.id, { username: username_value.trim().length > 0 ? username_value.trim() : data.user.username, firstname: firstname_value.trim().length > 0 ? firstname_value.trim() : data.user.firstname, avatar: avatar_avif, }); + + pb.authStore.clear(); + toastStore.trigger(get_info_toast("Please login again (sry UwU)!")); drawerStore.close(); } } catch (error) { @@ -322,7 +368,22 @@
-

Enter Username and Password

+
+

+ Login or Register +

+
+
+ Login + + Register +
+
- - - + + + +
+
+ + + +
-
- - +
+ +
+
+
{:else if $drawerStore.id === "profile_drawer" && data.user} @@ -359,7 +460,7 @@
-

Edit Profile

+

Edit Profile

+ + +
- - + +
{/if}