From 23905636d97e13eaec6669106fb8b04d1637e3bd Mon Sep 17 00:00:00 2001 From: Tamara Date: Fri, 19 Jan 2024 17:24:35 +0300 Subject: [PATCH 1/5] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20?= =?UTF-8?q?=D0=BE=D0=B4=D0=BD=D0=B0=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=B1=D0=B5=D1=81=D0=BF=D0=BE=D0=BB=D0=B5=D0=B7=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B8=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development.local | 1 - .env.production.local | 3 +-- src/api/auth.ts | 2 +- src/api/contactForm.ts | 2 +- src/api/quizRelase.ts | 2 +- src/pages/Landing/FooterLanding.tsx | 4 ++-- src/pages/ResultPage/ResultSettings.tsx | 1 - src/pages/Tariffs/Tariffs.tsx | 16 ++++++++++------ src/stores/questions/actions.ts | 3 ++- src/stores/quizes.ts | 2 +- src/stores/quizes/actions.ts | 2 +- 11 files changed, 20 insertions(+), 18 deletions(-) diff --git a/.env.development.local b/.env.development.local index 992c76e4..50bf2636 100644 --- a/.env.development.local +++ b/.env.development.local @@ -1,2 +1 @@ REACT_APP_DOMAIN="https://squiz.pena.digital" -REACT_APP_HUB_DOMAIN="https://shub.pena.digital" \ No newline at end of file diff --git a/.env.production.local b/.env.production.local index 992c76e4..c0284fff 100644 --- a/.env.production.local +++ b/.env.production.local @@ -1,2 +1 @@ -REACT_APP_DOMAIN="https://squiz.pena.digital" -REACT_APP_HUB_DOMAIN="https://shub.pena.digital" \ No newline at end of file +REACT_APP_DOMAIN="https://squiz.pena.digital" \ No newline at end of file diff --git a/src/api/auth.ts b/src/api/auth.ts index 7c729a66..b3a282f5 100644 --- a/src/api/auth.ts +++ b/src/api/auth.ts @@ -8,7 +8,7 @@ import type { } from "@frontend/kitui"; import { parseAxiosError } from "../utils/parse-error"; -const apiUrl =process.env.REACT_APP_DOMAIN + "/auth"; +const apiUrl = process.env.REACT_APP_DOMAIN + "/auth"; export async function register( login: string, diff --git a/src/api/contactForm.ts b/src/api/contactForm.ts index f64be0c2..00e9face 100644 --- a/src/api/contactForm.ts +++ b/src/api/contactForm.ts @@ -1,6 +1,6 @@ import axios from "axios"; -const domen = process.env.REACT_APP_HUB_DOMAIN +const domen = process.env.REACT_APP_DOMAIN; export function sendContactFormRequest(body: { contact: string; diff --git a/src/api/quizRelase.ts b/src/api/quizRelase.ts index a960f2d5..c846c8d8 100644 --- a/src/api/quizRelase.ts +++ b/src/api/quizRelase.ts @@ -18,7 +18,7 @@ import { CopyQuestionResponse, } from "@model/question/copy"; -const baseUrl = process.env.REACT_APP_DOMAIN ; +const baseUrl = process.env.REACT_APP_DOMAIN; function get(quizId: string) { return makeRequest({ diff --git a/src/pages/Landing/FooterLanding.tsx b/src/pages/Landing/FooterLanding.tsx index b94d8fd9..0708e15c 100644 --- a/src/pages/Landing/FooterLanding.tsx +++ b/src/pages/Landing/FooterLanding.tsx @@ -127,13 +127,13 @@ export default function Component() { > Пользовательское соглашение - diff --git a/src/pages/ResultPage/ResultSettings.tsx b/src/pages/ResultPage/ResultSettings.tsx index 14524fae..f1e384c0 100644 --- a/src/pages/ResultPage/ResultSettings.tsx +++ b/src/pages/ResultPage/ResultSettings.tsx @@ -90,7 +90,6 @@ export const ResultSettings = () => { }} > Настройки результатов - + + + + ); +} diff --git a/src/pages/auth/RecoverPassword.tsx b/src/pages/auth/RecoverPassword.tsx new file mode 100644 index 00000000..89d3d5e3 --- /dev/null +++ b/src/pages/auth/RecoverPassword.tsx @@ -0,0 +1,198 @@ +import { + Box, + Dialog, + IconButton, + Link, + Typography, + useMediaQuery, + useTheme, + Button, +} from "@mui/material"; +import CloseIcon from "@mui/icons-material/Close"; +import { useLocation, useNavigate } from "react-router-dom"; +import { useFormik } from "formik"; +import InputTextfield from "@ui_kit/InputTextfield"; +import PenaLogo from "../Landing/images/icons/QuizLogo"; +import { enqueueSnackbar } from "notistack"; +import { object, string } from "yup"; +import { useEffect, useState } from "react"; +import { useUserStore } from "@root/user"; + +import { getAuthToken, makeRequest, setAuthToken } from "@frontend/kitui"; +import { FormContactFieldName } from "@model/quizSettings"; +import { parseAxiosError } from "@utils/parse-error"; +interface Values { + password: string; +} + +const initialValues: Values = { + password: "", +}; + +const validationSchema = object({ + password: string() + .min(8, "Минимум 8 символов") + .matches(/^[.,:;-_+\d\w]+$/, "Некорректные символы") + .required("Поле обязательно"), +}); + +export default function RecoverPassword() { + const [isDialogOpen, setIsDialogOpen] = useState(true); + const [tokenUser, setTokenUser] = useState(""); + const user = useUserStore((state) => state.user); + const theme = useTheme(); + const upMd = useMediaQuery(theme.breakpoints.up("md")); + const navigate = useNavigate(); + const location = useLocation(); + const formik = useFormik({ + initialValues, + validationSchema, + onSubmit: async (values, formikHelpers) => { + if (tokenUser) { + setAuthToken(tokenUser || ""); + try { + const response = await makeRequest({ + url: process.env.REACT_APP_DOMAIN + "/user/", + method: "PATCH", + body: { password: values.password }, + }); + setIsDialogOpen(false); + navigate("/"); + enqueueSnackbar("Пароль успешно сменён"); + } catch (nativeError) { + const [error] = parseAxiosError(nativeError); + setAuthToken(""); + enqueueSnackbar( + `Извините, произошла ошибка, попробуйте повторить позже. ${error}`, + ); + } + } else { + enqueueSnackbar("Неверный url-адрес"); + } + }, + }); + useEffect(() => { + const params = new URLSearchParams(window.location.search); + const authToken = params.get("auth"); + setTokenUser(authToken); + + history.pushState(null, document.title, "/changepwd"); + return () => { + setAuthToken(""); + }; + }, []); + console.log(tokenUser); + + function handleClose() { + setIsDialogOpen(false); + setTimeout(() => navigate("/"), theme.transitions.duration.leavingScreen); + } + + return ( + + + + + + + + + + Введите новый пароль + + + + + + + ); +} diff --git a/src/pages/startPage/Restore.tsx b/src/pages/auth/Restore.tsx similarity index 69% rename from src/pages/startPage/Restore.tsx rename to src/pages/auth/Restore.tsx index be518193..10b89d17 100644 --- a/src/pages/startPage/Restore.tsx +++ b/src/pages/auth/Restore.tsx @@ -11,35 +11,25 @@ import { useTheme, } from "@mui/material"; import InputTextfield from "@ui_kit/InputTextfield"; -import PasswordInput from "@ui_kit/passwordInput"; import { useFormik } from "formik"; import { object, ref, string } from "yup"; import Logotip from "../Landing/images/icons/QuizLogo"; import { useNavigate, Link as RouterLink, useLocation } from "react-router-dom"; +import { enqueueSnackbar } from "notistack"; +import { recover } from "@api/auth"; interface Values { email: string; - password: string; - repeatPassword: string; } const initialValues: Values = { email: "", - password: "", - repeatPassword: "", }; const validationSchema = object({ email: string() .required("Поле обязательно") .email("Введите корректный email"), - password: string() - .min(8, "Минимум 8 символов") - .matches(/^[.,:;-_+\d\w]+$/, "Некорректные символы") - .required("Поле обязательно"), - repeatPassword: string() - .oneOf([ref("password"), undefined], "Пароли не совпадают") - .required("Повторите пароль"), }); export const Restore: FC = () => { @@ -52,7 +42,19 @@ export const Restore: FC = () => { const formik = useFormik({ initialValues, validationSchema, - onSubmit: (values) => {}, + onSubmit: async (values, formikHelpers) => { + const [recoverResponse, recoverError] = await recover( + values.email.trim(), + ); + + formikHelpers.setSubmitting(false); + if (recoverError) { + enqueueSnackbar(recoverError); + return; + } + navigate("/"); + enqueueSnackbar("Письмо прийдёт Вам на почту"); + }, }); function handleClose() { @@ -138,41 +140,6 @@ export const Restore: FC = () => { label="Email" gap={upMd ? "10px" : "10px"} /> - -