From 467f89c104df40904ef4c6b408507e90fe661724 Mon Sep 17 00:00:00 2001 From: Ellie Huxtable Date: Thu, 30 May 2024 12:49:22 +0100 Subject: feat(ui): add login/register dialog (#2056) --- ui/src/components/LoginOrRegister.tsx | 341 ++++++++++++++++++++++++++++++++++ 1 file changed, 341 insertions(+) create mode 100644 ui/src/components/LoginOrRegister.tsx (limited to 'ui/src/components/LoginOrRegister.tsx') diff --git a/ui/src/components/LoginOrRegister.tsx b/ui/src/components/LoginOrRegister.tsx new file mode 100644 index 00000000..c13c314c --- /dev/null +++ b/ui/src/components/LoginOrRegister.tsx @@ -0,0 +1,341 @@ +import Logo from "@/assets/logo-light.svg"; +import { useState } from "react"; + +import { login, register } from "@/state/client"; +import { useStore } from "@/state/store"; + +interface LoginProps { + toggleRegister: () => void; +} + +function Login(props: LoginProps) { + const refreshUser = useStore((state) => state.refreshUser); + const [errors, setErrors] = useState(null); + + const doLogin = async (e: React.FormEvent) => { + e.preventDefault(); + + const form = e.currentTarget; + const username = form.username.value; + const password = form.password.value; + const key = form.key.value; + + console.log("Logging in..."); + try { + await login(username, password, key); + refreshUser(); + console.log("Logged in"); + } catch (e) { + console.error(e); + setErrors(e); + } + }; + + return ( + <> +
+
+ Atuin + +

+ Sign in to your account +

+ +

+ Backup and sync your data across devices. All data is end-to-end + encrypted and stored securely in the cloud. +

+
+ +
+
+
+ +
+ +
+
+ +
+
+ +
+ {/* You can't right now. Sorry. Validate emails first. + + Forgot password? + + */} +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ +
+
+ + {errors && ( +

{errors}

+ )} + +

+ Not a member?{" "} + { + e.preventDefault(); + props.toggleRegister(); + }} + > + Register + +

+
+
+ + ); +} + +interface RegisterProps { + toggleLogin: () => void; +} + +function Register(props: RegisterProps) { + const refreshUser = useStore((state) => state.refreshUser); + const [errors, setErrors] = useState(null); + + const doRegister = async (e: React.FormEvent) => { + e.preventDefault(); + + const form = e.currentTarget; + const username = form.username.value; + const email = form.email.value; + const password = form.password.value; + + console.log("Logging in..."); + try { + await register(username, email, password); + refreshUser(); + console.log("Logged in"); + } catch (e) { + console.error(e); + setErrors(e); + } + }; + + return ( + <> +
+
+ Atuin + +

+ Register for an account +

+ +

+ Backup and sync your data across devices. All data is end-to-end + encrypted and stored securely in the cloud. +

+
+ +
+
+
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+
+ +
+ {/* You can't right now. Sorry. Validate emails first. + + Forgot password? + + */} +
+
+
+ +
+
+ +
+ +
+
+ + {errors && ( +

{errors}

+ )} + +

+ Already have an account?{" "} + { + e.preventDefault(); + props.toggleLogin(); + }} + > + Login + +

+
+
+ + ); +} + +export default function LoginOrRegister() { + let [login, setLogin] = useState(false); + + if (login) { + return setLogin(false)} />; + } + + return setLogin(true)} />; +} -- cgit v1.3.1