diff --git a/src/pages/Signin.tsx b/src/pages/Signin.tsx index 96f825c..6dce41e 100644 --- a/src/pages/Signin.tsx +++ b/src/pages/Signin.tsx @@ -3,14 +3,55 @@ import CustomButton from "../components/CustomButton"; import InputTextfield from "../components/InputTextfield"; import PenaLogo from "../components/PenaLogo"; import CloseIcon from "@mui/icons-material/Close"; -import { useState } from "react"; +import { authHandler } from "../utils/api/authenticationHandler"; +import { useNavigate } from "react-router-dom"; +import { useFormik } from "formik"; +interface Values { + email: string; + password: string; +} + +// TODO +function validate(values: Values) { + const errors = {} as any; + if (!values.email) { + errors.email = "Required"; + } else if (!/^[\w-]{3,25}$/i.test(values.email)) { + errors.email = "Invalid username"; + } + if (!values.password) { + errors.password = "Required"; + } else if (!/^[\w-]{8,25}$/i.test(values.password)) { + errors.password = "Invalid password"; + } + return errors; +} + export default function Signin() { - const [login, setLogin] = useState(""); - const [password, setPassword] = useState(""); const theme = useTheme(); const upMd = useMediaQuery(theme.breakpoints.up("md")); + const navigate = useNavigate(); + const formik = useFormik({ + initialValues: { + email: "", + password: "", + }, + validate, + onSubmit: async (values: Values) => { + const result = await authHandler.login({ + email: values.email, + password: values.password, + }); + if (result instanceof Error) { + console.log("TODO handle login error"); + return; + } + console.log("TODO handle login success feedback"); + navigate("/"); + } + }); return ( Вход в личный кабинет setLogin(e.target.value)} + TextfieldProps={{ + value: formik.values.email, + placeholder: "+7 900 000 00 00 или username@penahub.com", + onBlur: formik.handleBlur, + error: formik.touched.email && Boolean(formik.errors.email), + helperText: formik.touched.email && formik.errors.email, + }} + onChange={formik.handleChange} + id="email" label="Телефон или E-mail" - placeholder="+7 900 000 00 00 или username@penahub.com" - id="login" - gap={upMd ? "15px" : "12px"} + gap={upMd ? "15px" : "10px"} /> setPassword(e.target.value)} - label="Пароль" - placeholder="Не менее 8 символов" + TextfieldProps={{ + value: formik.values.password, + placeholder: "Не менее 8 символов", + onBlur: formik.handleBlur, + error: formik.touched.password && Boolean(formik.errors.password), + helperText: formik.touched.password && formik.errors.password, + type: "password", + }} + onChange={formik.handleChange} id="password" - gap={upMd ? "15px" : "12px"} + label="Пароль" + gap={upMd ? "15px" : "10px"} /> Войти (""); - const [phonenumber, setPhonenumber] = useState(""); - const [password, setPassword] = useState(""); - const [repeatPassword, setRepeatPassword] = useState(""); const theme = useTheme(); const upMd = useMediaQuery(theme.breakpoints.up("md")); + const navigate = useNavigate(); + const formik = useFormik({ + initialValues: { + login: "", + email: "", + phoneNumber: "", + password: "", + repeatPassword: "", + }, + validate, + onSubmit: async (values: Values) => { + const result = await authHandler.register({ + email: values.email, + login: values.login, + password: values.password, + phoneNumber: values.phoneNumber, + }); + if (result instanceof Error) { + console.log("TODO handle register error"); + return; + } + console.log("TODO handle register success feedback"); + navigate("/signin"); + } + }); return ( Регистрация setEmail(e.target.value)} + TextfieldProps={{ + value: formik.values.login, + placeholder: "username", + onBlur: formik.handleBlur, + error: formik.touched.login && Boolean(formik.errors.login), + helperText: formik.touched.login && formik.errors.login, + }} + onChange={formik.handleChange} + id="login" + label="Login" + gap={upMd ? "15px" : "10px"} + /> + setPhonenumber(e.target.value)} - id="phonenumber" + TextfieldProps={{ + value: formik.values.phoneNumber, + placeholder: "+7 900 000 00 00", + onBlur: formik.handleBlur, + error: formik.touched.phoneNumber && Boolean(formik.errors.phoneNumber), + helperText: formik.touched.phoneNumber && formik.errors.phoneNumber, + }} + onChange={formik.handleChange} + id="phoneNumber" label="Телефон" - placeholder="+7 900 000 00 00" gap={upMd ? "15px" : "10px"} /> setPassword(e.target.value)} + TextfieldProps={{ + value: formik.values.password, + placeholder: "Не менее 8 символов", + onBlur: formik.handleBlur, + error: formik.touched.password && Boolean(formik.errors.password), + helperText: formik.touched.password && formik.errors.password, + type: "password", + }} + onChange={formik.handleChange} id="password" label="Пароль" - placeholder="Не менее 8 символов" gap={upMd ? "15px" : "10px"} /> setRepeatPassword(e.target.value)} - id="repeat-password" + TextfieldProps={{ + value: formik.values.repeatPassword, + placeholder: "Не менее 8 символов", + onBlur: formik.handleBlur, + error: formik.touched.repeatPassword && Boolean(formik.errors.repeatPassword), + helperText: formik.touched.repeatPassword && formik.errors.repeatPassword, + type: "password", + }} + onChange={formik.handleChange} + id="repeatPassword" label="Повторить пароль" - placeholder="Не менее 8 символов" gap={upMd ? "15px" : "10px"} /> Войти