import { useState } from "react"; import { Box, Typography, Button, TextField, useTheme, useMediaQuery, } from "@mui/material"; import EditOutlinedIcon from "@mui/icons-material/EditOutlined"; import { Formik } from "formik"; import * as yup from "yup"; import { useNavigate } from "react-router-dom"; import { useDispatch } from "react-redux"; import { setLogin } from "state"; import Dropzone from "react-dropzone"; import FlexBetween from "components/FlexBetween"; const registerSchema = yup.object().shape({ firstName: yup.string().required("First name is required"), lastName: yup.string().required("Last name is required"), email: yup.string().email("Invalid email").required("Email is required"), password: yup.string().required("Password is required"), location: yup.string(), description: yup.string(), profilePicture: yup.string(), }); const loginSchema = yup.object().shape({ email: yup.string().email("Invalid email").required("Email is required"), password: yup.string().required("Password is required"), }); const initialRegisterValues = { firstName: "", lastName: "", email: "", password: "", location: "", description: "", profilePicture: "", }; const initialLoginValues = { email: "", password: "", }; const Form = () => { const [pageType, setPageType] = useState("login"); const { palette } = useTheme(); const dispatch = useDispatch(); const navigate = useNavigate(); const isNotMobile = useMediaQuery("(min-width: 600px)"); const isLogin = pageType === "login"; const isRegister = pageType === "register"; const register = async (values, onSubmitProps) => { const formData = new FormData(); for (const key in values) { formData.append(key, values[key]); } formData.append("profilePicturePath", values.profilePicture.name); const savedUserResponse = await fetch( "http://localhost:3001/auth/register", { method: "POST", body: formData, } ); const savedUser = await savedUserResponse.json(); onSubmitProps.resetForm(); if (savedUser) { setPageType("login"); } }; const login = async (values, onSubmitProps) => { const loggedInUserResponse = await fetch( "http://localhost:3001/auth/login", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(values), } ); const loggedInUser = await loggedInUserResponse.json(); onSubmitProps.resetForm(); if (loggedInUser) { dispatch(setLogin({ user: loggedInUser, token: loggedInUser.token })); navigate("/home"); } }; const handleFormSubmit = async (values, onSubmitProps) => { if (isLogin) { await login(values, onSubmitProps); } if (isRegister) { await register(values, onSubmitProps); } }; return ( {({ values, errors, touched, handleChange, handleBlur, handleSubmit, setFieldValue, resetForm, }) => (
div": { gridColumn: isNotMobile ? undefined : "span 4" }, }} > {isRegister && ( <> { setFieldValue("profilePicture", acceptedFiles[0]); }} > {({ getRootProps, getInputProps }) => ( {!values.profilePicture ? (

Add your profile photo here

) : ( {values.profilePicture.name} )}
)}
)}
{/* Buttons */} { setPageType(isLogin ? "register" : "login"); resetForm(); }} sx={{ textDecoration: "underline", color: palette.primary.main, "&:hover": { cursor: "pointer", color: palette.primary.light }, }} > {isLogin ? "Don't have an account? Register here" : "Already have an account? Login here"}
)}
); }; export default Form;