From d1275b4a1fe1ac963d3ed22ff0b5c43ca4265e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luc=C3=A0s?= Date: Wed, 22 Mar 2023 16:45:23 +0100 Subject: [PATCH] Refactor Register Took 1 hour 8 minutes --- src/components/form/LoginForm.tsx | 75 +++++++------- src/components/form/RegisterForm.tsx | 120 +++++++++++++++++++++ src/models/form/RegisterData.ts | 10 ++ src/pages/register.tsx | 150 ++------------------------- 4 files changed, 176 insertions(+), 179 deletions(-) create mode 100644 src/components/form/RegisterForm.tsx create mode 100644 src/models/form/RegisterData.ts diff --git a/src/components/form/LoginForm.tsx b/src/components/form/LoginForm.tsx index 980c332..9fdc673 100644 --- a/src/components/form/LoginForm.tsx +++ b/src/components/form/LoginForm.tsx @@ -9,7 +9,7 @@ import { } from '@chakra-ui/react'; import {useState} from 'react'; import {useRouter} from 'next/router'; -import {signIn, SignInResponse,} from 'next-auth/react'; +import {signIn, SignInResponse} from 'next-auth/react'; import {LoginData} from '@/models/form/LoginData'; @@ -20,20 +20,18 @@ export default function LoginForm() { const buttonWidth = {base: '100%', md: 'unset'}; - const handleInput = ({email = loginData.email, password = loginData.password}) => { + const handleInput = (data: any) => { setInvalidInput(false); - setLoginData(new LoginData(email, password)); + setLoginData({...loginData, ...data}); }; const handleSubmit = async () => { - const {email, password} = loginData; await signIn('credentials', - {email, password, redirect: false}) - .then((res) => { - const {ok} = res as SignInResponse + {...loginData, redirect: false}).then((res) => { + const {ok} = res as SignInResponse; - if (!ok) setInvalidInput(true) - else router.push("/") + if (!ok) setInvalidInput(true); + else router.push('/'); }); }; @@ -43,22 +41,23 @@ export default function LoginForm() { Connexion {/* Email */} - - - Adresse email - handleInput({email: evt.target.value})} - placeholder={'adresse@email.com'} - required={true} - /> - + - {/* Mot de passe */} - + Adresse email + handleInput({email: evt.target.value})} + placeholder={'adresse@email.com'} + required={true} + /> + + + {/* Mot de passe */ + } + Mot de passe - - - {/*Boutons*/} - - - - - - - - ); + + {/*Boutons*/ + } + + + + + + +) + } \ No newline at end of file diff --git a/src/components/form/RegisterForm.tsx b/src/components/form/RegisterForm.tsx new file mode 100644 index 0000000..fdad3bf --- /dev/null +++ b/src/components/form/RegisterForm.tsx @@ -0,0 +1,120 @@ +import { + Box, Button, + Flex, + FormControl, + FormLabel, + Heading, + Input, + Container, +} from '@chakra-ui/react'; +import {useRouter} from 'next/router'; +import {useState} from 'react'; +import {RegisterData} from '@/models/form/RegisterData'; + +export default function RegisterForm() { + const router = useRouter(); + const [registerData, setRegisterData] = useState(new RegisterData()); + const [invalidInput, setInvalidInput] = useState(false); + + const buttonWidth = {base: '100%', md: 'unset'}; + + const handleInput = (data: any) => { + setInvalidInput(false); + setRegisterData({...registerData, ...data}); + }; + + const handleSubmit = () => { + const {password, confirmPassword} = registerData; + if (password !== confirmPassword) setInvalidInput(true); + + fetch('/api/user/new', { + method: 'PUT', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify(registerData), + }).then(() => router.push('/')).catch(() => { + setInvalidInput(true); + setRegisterData({...registerData, password: '', confirmPassword: ''}); + }); + }; + + return ( + + + Inscription + + + {/*Prénom*/} + + Prénom + handleInput({firstName: evt.target.value})} + placeholder="Prénom" + required={true} + /> + + + {/*Nom*/} + + Nom + handleInput({lastName: evt.target.value})} + placeholder="Nom" + required={true} + /> + + + + {/*Email*/} + + Adresse email + handleInput({email: evt.target.value})} + placeholder="adresse@email.com" + /> + + + {/*Mot de passe*/} + + Mot de passe + handleInput({password: evt.target.value})} + placeholder="Mot de passe" + /> + + + {/*Mot de passe (2)*/} + + Confirmation du mot de passe + handleInput( + {confirmPassword: evt.target.value})} + placeholder="Mot de passe" + /> + + + + + + + + + + ); + +} diff --git a/src/models/form/RegisterData.ts b/src/models/form/RegisterData.ts new file mode 100644 index 0000000..6350cd4 --- /dev/null +++ b/src/models/form/RegisterData.ts @@ -0,0 +1,10 @@ +export class RegisterData { + + constructor( + public firstName: string = "", + public lastName: string = "", + public email: string = "", + public password: string = "", + public confirmPassword: string = "", + ) {} +} \ No newline at end of file diff --git a/src/pages/register.tsx b/src/pages/register.tsx index 0d1a01f..c28e46c 100644 --- a/src/pages/register.tsx +++ b/src/pages/register.tsx @@ -12,150 +12,18 @@ import { } from '@chakra-ui/react'; import {useRouter} from 'next/router'; import {useForm} from 'react-hook-form'; - -type FormValues = { - firstName: string - lastName: string - email: string - password: string - confirmPassword: string -} +import RegisterForm from '@/components/form/RegisterForm'; export default function Register() { - const { - handleSubmit, - register, - formState: {errors, isSubmitting}, - } = useForm(); - - const router = useRouter(); - - const redirect_home = () => { - router.push('/'); - }; - - const onRegister = async (values: FormValues) => { - // Verify password - if (values.password !== values.confirmPassword) { - alert('Les mots de passe ne correspondent pas'); - return; - } - - // Create User - fetch('/api/user/', { - method: 'PUT', - headers: {'Content-Type': 'application/json'}, - body: JSON.stringify(values), - }).then(res => res.json()).then(data => { - if (data.error) throw new Error(); - alert('Inscription réussie'); - router.push('/'); - }).catch(err => console.error(err)); - }; - - const RightSide = () => ( - - Inscription - -
- - - - Prénom - - - - Nom - - - - - Adresse email - - - - Mot de passe - - - {/* Il y a une margin en trop mais je me suis dit que c'etais mieux d'avoir plus d'expace entre les deux */} - - Confirmation du mot de passe - - - - - {/*{errors.name && errors.name.message}*/} - - - - - - - -
-
-
- ); - - const LeftSide = () => ( - - couple holding hands - - ); return ( - - - - - - + + + + + + ); }