2022-11-25 18:53:21 +00:00
|
|
|
|
import { Box, IconButton, Link, Typography, useMediaQuery, useTheme } from "@mui/material";
|
2022-11-29 12:21:40 +00:00
|
|
|
|
import { useNavigate } from "react-router-dom";
|
|
|
|
|
import { useFormik } from "formik";
|
2023-03-19 12:30:40 +00:00
|
|
|
|
import CloseIcon from "@mui/icons-material/Close";
|
2022-11-19 20:31:42 +00:00
|
|
|
|
|
2023-03-19 12:30:40 +00:00
|
|
|
|
import CustomButton from "@components/CustomButton";
|
|
|
|
|
import InputTextfield from "@components/InputTextfield";
|
|
|
|
|
import PenaLogo from "@components/PenaLogo";
|
|
|
|
|
|
|
|
|
|
import { useSnackbar } from "notistack";
|
2023-03-19 15:26:39 +00:00
|
|
|
|
import {authStore} from "@stores/makeRequest";
|
2022-11-19 20:31:42 +00:00
|
|
|
|
|
2022-11-29 12:21:40 +00:00
|
|
|
|
interface Values {
|
2023-03-19 12:30:40 +00:00
|
|
|
|
login: string;
|
|
|
|
|
email: string;
|
|
|
|
|
phoneNumber: string;
|
|
|
|
|
password: string;
|
|
|
|
|
repeatPassword: string;
|
2022-11-29 12:21:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO
|
|
|
|
|
function validate(values: Values) {
|
2023-03-19 12:30:40 +00:00
|
|
|
|
const errors = {} as any;
|
|
|
|
|
if (!values.login) {
|
|
|
|
|
errors.login = "Required";
|
|
|
|
|
} else if (!/^[\w-]{3,25}$/i.test(values.login)) {
|
|
|
|
|
errors.login = "Invalid username";
|
|
|
|
|
}
|
|
|
|
|
if (!values.password) {
|
|
|
|
|
errors.password = "Required";
|
|
|
|
|
} else if (!/^[\w-]{8,25}$/i.test(values.password)) {
|
|
|
|
|
errors.password = "Invalid password";
|
|
|
|
|
}
|
|
|
|
|
if (values.password !== values.repeatPassword) {
|
|
|
|
|
errors.repeatPassword = "Passwords do not match";
|
|
|
|
|
}
|
|
|
|
|
return errors;
|
2022-11-29 12:21:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
2022-11-19 20:31:42 +00:00
|
|
|
|
export default function Signup() {
|
2023-03-19 12:30:40 +00:00
|
|
|
|
const { enqueueSnackbar } = useSnackbar();
|
|
|
|
|
const theme = useTheme();
|
|
|
|
|
const upMd = useMediaQuery(theme.breakpoints.up("md"));
|
|
|
|
|
const navigate = useNavigate();
|
2023-03-19 15:26:39 +00:00
|
|
|
|
const { makeRequest } = authStore()
|
2023-03-19 12:30:40 +00:00
|
|
|
|
const formik = useFormik<Values>({
|
|
|
|
|
initialValues: {
|
|
|
|
|
login: "",
|
|
|
|
|
email: "",
|
|
|
|
|
phoneNumber: "",
|
|
|
|
|
password: "",
|
|
|
|
|
repeatPassword: "",
|
|
|
|
|
},
|
|
|
|
|
validate,
|
|
|
|
|
onSubmit: async (values: Values) => {
|
2023-03-19 15:26:39 +00:00
|
|
|
|
makeRequest({
|
|
|
|
|
url: "https://hub.pena.digital/auth/register",
|
|
|
|
|
body: {
|
|
|
|
|
"login": values.email,
|
|
|
|
|
"email": values.email,
|
|
|
|
|
"password": values.repeatPassword,
|
|
|
|
|
"phoneNumber": "--"
|
|
|
|
|
},
|
|
|
|
|
useToken: false
|
|
|
|
|
})
|
|
|
|
|
.catch((e:any) => {
|
|
|
|
|
console.log(e)
|
|
|
|
|
enqueueSnackbar(e.response && e.response.data && e.response.data.message ? e.response.data.message : `Unknown error`)
|
|
|
|
|
})
|
2023-03-19 12:30:40 +00:00
|
|
|
|
},
|
|
|
|
|
});
|
2022-11-19 20:31:42 +00:00
|
|
|
|
|
2023-03-19 12:30:40 +00:00
|
|
|
|
function handleClose() {
|
|
|
|
|
navigate("/");
|
|
|
|
|
}
|
2022-12-11 10:25:32 +00:00
|
|
|
|
|
2023-03-19 12:30:40 +00:00
|
|
|
|
return (
|
|
|
|
|
<Box
|
|
|
|
|
sx={{
|
|
|
|
|
display: "flex",
|
|
|
|
|
justifyContent: "center",
|
2023-03-27 13:04:09 +00:00
|
|
|
|
alignItems:"center",
|
|
|
|
|
height: upMd ? "100vh" : "100%",
|
2023-03-19 12:30:40 +00:00
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<Box
|
|
|
|
|
component="form"
|
|
|
|
|
onSubmit={formik.handleSubmit}
|
|
|
|
|
noValidate
|
|
|
|
|
sx={{
|
|
|
|
|
position: "relative",
|
|
|
|
|
width: upMd ? "600px" : "100%",
|
|
|
|
|
height: upMd ? "auto" : "100%",
|
|
|
|
|
backgroundColor: "white",
|
|
|
|
|
display: "flex",
|
|
|
|
|
alignItems: "center",
|
|
|
|
|
flexDirection: "column",
|
|
|
|
|
p: upMd ? "50px" : "18px",
|
|
|
|
|
pb: upMd ? "40px" : "30px",
|
|
|
|
|
gap: "15px",
|
|
|
|
|
borderRadius: "12px",
|
|
|
|
|
boxShadow: `0px 100px 309px rgba(210, 208, 225, 0.24),
|
2022-11-29 12:21:40 +00:00
|
|
|
|
0px 41.7776px 129.093px rgba(210, 208, 225, 0.172525),
|
|
|
|
|
0px 22.3363px 69.0192px rgba(210, 208, 225, 0.143066),
|
|
|
|
|
0px 12.5216px 38.6916px rgba(210, 208, 225, 0.12),
|
|
|
|
|
0px 6.6501px 20.5488px rgba(210, 208, 225, 0.0969343),
|
|
|
|
|
0px 2.76726px 8.55082px rgba(210, 208, 225, 0.0674749)`,
|
2023-03-19 12:30:40 +00:00
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<IconButton
|
|
|
|
|
onClick={handleClose}
|
|
|
|
|
sx={{
|
|
|
|
|
position: "absolute",
|
|
|
|
|
right: "7px",
|
|
|
|
|
top: "7px",
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<CloseIcon sx={{ transform: "scale(1.5)" }} />
|
|
|
|
|
</IconButton>
|
2023-03-27 13:04:09 +00:00
|
|
|
|
<Box sx={{mt: upMd ? undefined: "62px"}}>
|
2023-03-19 12:30:40 +00:00
|
|
|
|
<PenaLogo width={upMd ? 233 : 196} />
|
2022-11-25 18:53:21 +00:00
|
|
|
|
</Box>
|
2023-03-19 12:30:40 +00:00
|
|
|
|
<Typography
|
|
|
|
|
sx={{
|
|
|
|
|
color: theme.palette.grey3.main,
|
|
|
|
|
mt: "5px",
|
|
|
|
|
mb: upMd ? "35px" : "33px",
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
Регистрация
|
|
|
|
|
</Typography>
|
2023-03-27 13:04:09 +00:00
|
|
|
|
{/* <InputTextfield
|
2023-03-19 12:30:40 +00:00
|
|
|
|
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"
|
2023-03-27 13:04:09 +00:00
|
|
|
|
gap={upMd ? "10px" : "10px"}
|
|
|
|
|
/> */}
|
2023-03-19 12:30:40 +00:00
|
|
|
|
<InputTextfield
|
|
|
|
|
TextfieldProps={{
|
|
|
|
|
value: formik.values.email,
|
|
|
|
|
placeholder: "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"
|
2023-03-27 13:04:09 +00:00
|
|
|
|
gap={upMd ? "10px" : "10px"}
|
2023-03-19 12:30:40 +00:00
|
|
|
|
/>
|
|
|
|
|
<InputTextfield
|
|
|
|
|
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="Телефон"
|
2023-03-27 13:04:09 +00:00
|
|
|
|
gap={upMd ? "10px" : "10px"}
|
2023-03-19 12:30:40 +00:00
|
|
|
|
/>
|
|
|
|
|
<InputTextfield
|
|
|
|
|
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="Пароль"
|
2023-03-27 13:04:09 +00:00
|
|
|
|
gap={upMd ? "10px" : "10px"}
|
2023-03-19 12:30:40 +00:00
|
|
|
|
/>
|
|
|
|
|
<InputTextfield
|
|
|
|
|
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="Повторить пароль"
|
2023-03-27 13:04:09 +00:00
|
|
|
|
gap={upMd ? "10px" : "10px"}
|
2023-03-19 12:30:40 +00:00
|
|
|
|
/>
|
|
|
|
|
<CustomButton
|
|
|
|
|
fullWidth
|
|
|
|
|
variant="contained"
|
|
|
|
|
sx={{
|
|
|
|
|
backgroundColor: theme.palette.brightPurple.main,
|
|
|
|
|
textColor: "white",
|
|
|
|
|
width: "100%",
|
|
|
|
|
py: "12px",
|
|
|
|
|
mt: upMd ? undefined : "10px",
|
|
|
|
|
}}
|
|
|
|
|
type="submit"
|
|
|
|
|
disabled={formik.isSubmitting}
|
|
|
|
|
>
|
2023-03-27 13:04:09 +00:00
|
|
|
|
Зарегистрироваться
|
2023-03-19 12:30:40 +00:00
|
|
|
|
</CustomButton>
|
|
|
|
|
<Link
|
|
|
|
|
href="#"
|
|
|
|
|
sx={{
|
|
|
|
|
color: theme.palette.brightPurple.main,
|
|
|
|
|
mt: "auto",
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
Вход в личный кабинет
|
|
|
|
|
</Link>
|
|
|
|
|
</Box>
|
|
|
|
|
</Box>
|
|
|
|
|
);
|
|
|
|
|
}
|