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?
+
)
}
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 (