diff --git a/src/App.tsx b/src/App.tsx index e3198f44..ac1bed39 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,4 +1,5 @@ -import { Suspense, lazy } from "react"; +import type { SuspenseProps } from "react"; +import { lazy, Suspense, useEffect, useLayoutEffect, useRef } from "react"; import { lazily } from "react-lazily"; import ContactFormModal from "@ui_kit/ContactForm"; import dayjs from "dayjs"; @@ -6,29 +7,30 @@ import "dayjs/locale/ru"; import SigninDialog from "./pages/auth/Signin"; import SignupDialog from "./pages/auth/Signup"; import { + Navigate, Route, Routes, useLocation, useNavigate, - Navigate, } from "react-router-dom"; import "./index.css"; import Landing from "./pages/Landing/Landing"; import Main from "./pages/main"; import { clearAuthToken, - getMessageFromFetchError, - useUserFetcher, - UserAccount, - makeRequest, - devlog, createUserAccount, + devlog, + getMessageFromFetchError, + makeRequest, + UserAccount, + useUserFetcher, } from "@frontend/kitui"; +import type { OriginalUserAccount } from "@root/user"; import { clearUserData, + setCustomerAccount, setUser, setUserAccount, - setCustomerAccount, useUserStore, } from "@root/user"; import { enqueueSnackbar } from "notistack"; @@ -38,15 +40,10 @@ import FloatingSupportChat from "@ui_kit/FloatingSupportChat"; import { Restore } from "./pages/auth/Restore"; import { isAxiosError } from "axios"; -import { useEffect, useLayoutEffect, useRef } from "react"; import RecoverPassword from "./pages/auth/RecoverPassword"; import OutdatedLink from "./pages/auth/OutdatedLink"; import { useAfterpay } from "@utils/hooks/useAfterpay"; -import type { OriginalUserAccount } from "@root/user"; - -import type { SuspenseProps } from "react"; - const MyQuizzesFull = lazy(() => import("./pages/createQuize/MyQuizzesFull")); const ViewPage = lazy(() => import("./pages/ViewPublicationPage")); const Analytics = lazy(() => import("./pages/Analytics/Analytics")); diff --git a/src/pages/Tariffs/Tariffs.tsx b/src/pages/Tariffs/Tariffs.tsx index e771f1b8..1ef1c15a 100644 --- a/src/pages/Tariffs/Tariffs.tsx +++ b/src/pages/Tariffs/Tariffs.tsx @@ -1,39 +1,35 @@ import { Link, useLocation, useNavigate } from "react-router-dom"; -import { makeRequest, useToken } from "@frontend/kitui"; +import type { Tariff } from "@frontend/kitui"; +import { clearAuthToken, makeRequest, useToken } from "@frontend/kitui"; import { useEffect, useState } from "react"; import type { GetTariffsResponse } from "@model/tariff"; -import { clearAuthToken } from "@frontend/kitui"; import { logout } from "@api/auth"; -import ArrowDown from "../../assets/icons/ArrowDownIcon"; import { Box, Button, Container, + IconButton, Modal, Paper, Typography, useMediaQuery, useTheme, - IconButton, } from "@mui/material"; import { enqueueSnackbar } from "notistack"; -import { getMessageFromFetchError } from "@frontend/kitui"; import { withErrorBoundary } from "react-error-boundary"; import { createTariffElements } from "./tariffsUtils/createTariffElements"; -import HeaderFull from "@ui_kit/Header/HeaderFull"; import Logotip from "../../pages/Landing/images/icons/QuizLogo"; import { LogoutButton } from "@ui_kit/LogoutButton"; import { clearUserData, useUserStore } from "@root/user"; import ArrowLeft from "@icons/questionsPage/arrowLeft"; import { currencyFormatter } from "./tariffsUtils/currencyFormatter"; - -import type { Tariff } from "@frontend/kitui"; import { Tabs } from "./Tabs"; import { cleanAuthTicketData } from "@root/ticket"; import { useDomainDefine } from "@utils/hooks/useDomainDefine"; import CollapsiblePromocodeField from "./CollapsiblePromocodeField"; import { activatePromocode } from "@api/promocode"; +import { clearQuizData } from "@root/quizes/store"; const StepperText: Record = { count: "Тарифы на объём", @@ -179,6 +175,7 @@ function TariffPage() { cleanAuthTicketData(); clearAuthToken(); clearUserData(); + clearQuizData(); navigate("/"); } diff --git a/src/pages/createQuize/MyQuizzesFull.tsx b/src/pages/createQuize/MyQuizzesFull.tsx index cb6e9752..212a5c58 100644 --- a/src/pages/createQuize/MyQuizzesFull.tsx +++ b/src/pages/createQuize/MyQuizzesFull.tsx @@ -31,7 +31,7 @@ export default function MyQuizzesFull({ outerContainerSx: sx, children, }: Props) { - const { quizes } = useQuizes(); + const { quizes, isValidating } = useQuizes(); const navigate = useNavigate(); const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down(500)); @@ -40,6 +40,10 @@ export default function MyQuizzesFull({ copyQuiz(value); }; + if (isValidating) { + return ; + } + return ( <> @@ -100,10 +104,12 @@ export default function MyQuizzesFull({ applicationCount={quiz.passed_count} conversionPercent={ quiz.session_count - ? ( - (quiz.passed_count / quiz.session_count) * - 100 - ).toFixed(1) + ? parseFloat( + ( + (quiz.passed_count / quiz.session_count) * + 100 + ).toFixed(1), + ) : 0 } onClickCopy={onClickCopy} diff --git a/src/stores/quizes/store.ts b/src/stores/quizes/store.ts index e3667d16..bc21ee3c 100644 --- a/src/stores/quizes/store.ts +++ b/src/stores/quizes/store.ts @@ -30,3 +30,5 @@ export const useQuizStore = create()( }, ), ); + +export const clearQuizData = () => useQuizStore.setState({ ...initialState }); diff --git a/src/ui_kit/Header/Header.tsx b/src/ui_kit/Header/Header.tsx index d6f853d0..6adfcd35 100644 --- a/src/ui_kit/Header/Header.tsx +++ b/src/ui_kit/Header/Header.tsx @@ -7,17 +7,13 @@ import { Container, FormControl, IconButton, - TextField, useMediaQuery, useTheme, } from "@mui/material"; import { updateQuiz } from "@root/quizes/actions"; import { useCurrentQuiz } from "@root/quizes/hooks"; -import CustomAvatar from "@ui_kit/Header/Avatar"; -import NavMenuItem from "@ui_kit/Header/NavMenuItem"; import { enqueueSnackbar } from "notistack"; -import { useState } from "react"; import { Link, useNavigate } from "react-router-dom"; import Logotip from "../../pages/Landing/images/icons/QuizLogo"; @@ -27,6 +23,7 @@ import { logout } from "@api/auth"; import { ToTariffsButton } from "@ui_kit/Toolbars/ToTariffsButton"; import CustomTextField from "@ui_kit/CustomTextField"; import { cleanAuthTicketData } from "@root/ticket"; +import { clearQuizData } from "@root/quizes/store"; type HeaderProps = { setMobileSidebar: (callback: (visible: boolean) => boolean) => void; @@ -50,6 +47,7 @@ export const Header = ({ setMobileSidebar, scrollDown }: HeaderProps) => { cleanAuthTicketData(); clearAuthToken(); clearUserData(); + clearQuizData(); navigate("/"); } diff --git a/src/ui_kit/Header/HeaderFull.tsx b/src/ui_kit/Header/HeaderFull.tsx index ed56ad64..cf864e1a 100644 --- a/src/ui_kit/Header/HeaderFull.tsx +++ b/src/ui_kit/Header/HeaderFull.tsx @@ -2,17 +2,12 @@ import { Box, Container, IconButton, - Typography, - useTheme, - useMediaQuery, SxProps, Theme, + useMediaQuery, + useTheme, } from "@mui/material"; -import NavMenuItem from "./NavMenuItem"; import Logotip from "../../pages/Landing/images/icons/QuizLogo"; -import WalletIcon from "@icons/WalletIcon"; -import CustomAvatar from "./Avatar"; -import { Burger } from "@icons/Burger"; import { clearAuthToken } from "@frontend/kitui"; import { logout } from "@api/auth"; import { Link, useNavigate } from "react-router-dom"; @@ -22,6 +17,7 @@ import { LogoutButton } from "@ui_kit/LogoutButton"; import { ToTariffsButton } from "@ui_kit/Toolbars/ToTariffsButton"; import ArrowLeft from "@icons/questionsPage/arrowLeft"; import { cleanAuthTicketData } from "@root/ticket"; +import { clearQuizData } from "@root/quizes/store"; interface HeaderFullProps { isRequest: boolean; @@ -44,6 +40,7 @@ export default function HeaderFull({ isRequest = false, sx }: HeaderFullProps) { cleanAuthTicketData(); clearAuthToken(); clearUserData(); + clearQuizData(); navigate("/"); } diff --git a/src/ui_kit/Sidebar/SidebarMobile.tsx b/src/ui_kit/Sidebar/SidebarMobile.tsx index 22a07d1a..9359505a 100644 --- a/src/ui_kit/Sidebar/SidebarMobile.tsx +++ b/src/ui_kit/Sidebar/SidebarMobile.tsx @@ -1,48 +1,39 @@ -import { FC, useEffect, useRef, useState } from "react"; +import React, { FC, useEffect, useRef, useState } from "react"; import { Box, FormControl, IconButton, - List, - Popper, TextField, Typography, useMediaQuery, useTheme, } from "@mui/material"; -import { People } from "@mui/icons-material"; import { SidebarModal } from "./SidebarModal"; import BackArrowIcon from "@icons/BackArrowIcon"; -import { ChartLineUp } from "./icons/ChartLineUp"; -import { ReturnTime } from "./icons/ReturnTime"; -import { Question } from "./icons/Question"; import { Settings } from "./icons/Settings"; import { Pencil } from "./icons/Pencil"; import { ArrowDown } from "./icons/ArrowDown"; -import Sidebar from "@ui_kit/Sidebar/Sidebar"; import { Link, useLocation, useNavigate } from "react-router-dom"; import { setCurrentStep, updateQuiz } from "@root/quizes/actions"; import { useCurrentQuiz } from "@root/quizes/hooks"; import { LogoutButton } from "@ui_kit/LogoutButton"; -import { ToTariffsButton } from "@ui_kit/Toolbars/ToTariffsButton"; import { logout } from "@api/auth"; import { enqueueSnackbar } from "notistack"; import { clearAuthToken } from "@frontend/kitui"; import { clearUserData } from "@root/user"; -import CustomTextField from "@ui_kit/CustomTextField"; import PencilCircleIcon from "@icons/PencilCircleIcon"; import { quizSetupSteps } from "@model/quizSettings"; -import React from "react"; import { updateNextStep } from "@root/uiTools/actions"; +import { cleanAuthTicketData } from "@root/ticket"; +import { clearQuizData } from "@root/quizes/store"; interface SidebarIconProps { height: string; width: string; color: string; } -import { cleanAuthTicketData } from "@root/ticket"; interface Iprops { open: boolean; @@ -93,6 +84,7 @@ export const SidebarMobile: FC = ({ cleanAuthTicketData(); clearAuthToken(); clearUserData(); + clearQuizData(); navigate("/"); }