From a627addad57c7a7af685863aac15e72812849fc7 Mon Sep 17 00:00:00 2001 From: strNophix Date: Sun, 16 Oct 2022 21:02:41 +0200 Subject: [PATCH] Added login flow --- .docker/kratos/kratos.yml | 4 -- client/components/login/LoginForm.tsx | 76 ++++++++++++++++++-------- client/components/login/SignupForm.tsx | 16 +----- client/components/nav/NavBar.tsx | 67 +++++++++++++++-------- client/config/index.ts | 2 - client/config/validation.ts | 18 ++++++ client/hooks/useLogInFlow.ts | 53 ++++++++++++++++++ client/hooks/useLogout.ts | 38 +++++++++++++ client/hooks/useSession.ts | 31 +++++++++++ client/hooks/useSignUpFlow.ts | 29 +++++----- client/package.json | 3 +- client/pages/_app.tsx | 11 +++- client/pages/index.tsx | 9 +++ client/pnpm-lock.yaml | 26 +++++++++ 14 files changed, 303 insertions(+), 80 deletions(-) create mode 100644 client/config/validation.ts create mode 100644 client/hooks/useLogInFlow.ts create mode 100644 client/hooks/useLogout.ts create mode 100644 client/hooks/useSession.ts create mode 100644 client/pages/index.tsx diff --git a/.docker/kratos/kratos.yml b/.docker/kratos/kratos.yml index 5bb6918..4bdcaba 100644 --- a/.docker/kratos/kratos.yml +++ b/.docker/kratos/kratos.yml @@ -47,10 +47,6 @@ selfservice: registration: lifespan: 10m ui_url: http://127.0.0.1:3000/signup - after: - password: - hooks: - - hook: session log: level: debug diff --git a/client/components/login/LoginForm.tsx b/client/components/login/LoginForm.tsx index 1236cbf..ecfe0ff 100644 --- a/client/components/login/LoginForm.tsx +++ b/client/components/login/LoginForm.tsx @@ -5,34 +5,66 @@ import FormField from "../common/form/FormField" import InlineLink from "../common/InlineLink" import SubmitButton from "../common/form/SubmitButton" -interface LoginFormValues { - username: string - password: string -} +import * as validation from "../../config/validation" +import { z } from "zod" +import { zodResolver } from "@hookform/resolvers/zod" +import useLogInFlow from "../../hooks/useLogInFlow" +import Input from "../common/Input" + +const LogInFormSchema = z.object({ + csrfToken: z.string(), + password: validation.password, + email: z.string().email({ message: "Not a valid email address" }).trim(), +}) + +type LogInFormValues = z.infer + +const formFields = [ + { id: "email", label: "Email", type: "email" }, + { id: "password", label: "Password", type: "password" }, +] const LoginForm: FC = () => { - const { register, handleSubmit } = useForm() - const onSubmit: SubmitHandler = (data) => console.log(data) + const logInFlow = useLogInFlow() + const { register, handleSubmit, formState } = useForm({ + resolver: zodResolver(LogInFormSchema), + }) + const onSubmit: SubmitHandler = (data) => + logInFlow.submitData({ + csrf_token: data.csrfToken, + method: "password", + identifier: data.email, + password: data.password, + }) return (
- - - Trouble logging in? - - } - /> + {logInFlow.flow && ( + + )} + {formFields.map((field) => ( + + {formState.errors[(field.id as any) || ""]?.message} +

+ } + /> + ))} +
+ Trouble logging in? +
) } diff --git a/client/components/login/SignupForm.tsx b/client/components/login/SignupForm.tsx index d4ccc51..a0e7ea2 100644 --- a/client/components/login/SignupForm.tsx +++ b/client/components/login/SignupForm.tsx @@ -7,24 +7,14 @@ import FormField from "../common/form/FormField" import InlineLink from "../common/InlineLink" import Input from "../common/Input" import SubmitButton from "../common/form/SubmitButton" -import { PASSWORD_REGEX } from "../../config" import useSignUpFlow from "../../hooks/useSignUpFlow" +import * as validation from "../../config/validation" const SignupFormSchema = z .object({ csrfToken: z.string(), - username: z - .string() - .trim() - .min(1, { message: "Username must be at least 1 character long." }) - .max(16, { message: "Username can't be longer than 16 characters.." }), - password: z - .string() - .trim() - .regex( - PASSWORD_REGEX, - "Password must be 8-64 long and must contain a number, uppercase, lowercase and special character.", - ), + username: validation.username, + password: validation.password, passwordRepeat: z.string().trim(), email: z.string().email({ message: "Not a valid email address" }).trim(), }) diff --git a/client/components/nav/NavBar.tsx b/client/components/nav/NavBar.tsx index dc3744e..8ea5ead 100644 --- a/client/components/nav/NavBar.tsx +++ b/client/components/nav/NavBar.tsx @@ -1,11 +1,19 @@ -import { UserIcon } from "@heroicons/react/24/outline" +import { + ArrowRightIcon, + ArrowRightOnRectangleIcon, + UserIcon, +} from "@heroicons/react/24/outline" import { FC, useState } from "react" +import { useLogout } from "../../hooks/useLogout" +import useSession from "../../hooks/useSession" import Button from "../common/Button" import Logo from "../common/Logo" import LoginModal, { LoginModelProps } from "../login/LoginModal" const NavBar: FC = () => { + const logout = useLogout() + const session = useSession((state) => state.session) const [modalProps, setModalProps] = useState({ isOpen: false, defaultPage: 0, @@ -23,6 +31,7 @@ const NavBar: FC = () => { isOpen: true, }) + console.log({ session }) return (