frontPanel/src/App.tsx

216 lines
5.8 KiB
TypeScript
Raw Normal View History

2023-11-08 12:51:40 +00:00
import ContactFormModal from "@ui_kit/ContactForm";
import ImageCrop from "@ui_kit/Modal/ImageCrop";
import dayjs from "dayjs";
import "dayjs/locale/ru";
import SigninDialog from "./pages/auth/Signin";
import SignupDialog from "./pages/auth/Signup";
2023-11-30 17:39:57 +00:00
import { ViewPage } from "./pages/ViewPublicationPage";
import { DesignPage } from "./pages/DesignPage/DesignPage";
2023-12-31 02:53:25 +00:00
import {
Route,
Routes,
useLocation,
useNavigate,
Navigate,
} from "react-router-dom";
2023-11-08 12:51:40 +00:00
import "./index.css";
import ContactFormPage from "./pages/ContactFormPage/ContactFormPage";
import InstallQuiz from "./pages/InstallQuiz/InstallQuiz";
import Landing from "./pages/Landing/Landing";
import QuestionsPage from "./pages/Questions/QuestionsPage";
2023-12-07 21:30:26 +00:00
import { Result } from "./pages/ResultPage/Result";
import { ResultSettings } from "./pages/ResultPage/ResultSettings";
2023-11-08 12:51:40 +00:00
import MyQuizzesFull from "./pages/createQuize/MyQuizzesFull";
import Main from "./pages/main";
import EditPage from "./pages/startPage/EditPage";
import { Tariffs } from "./pages/Tariffs/Tariffs";
2023-12-31 02:53:25 +00:00
import {
clearAuthToken,
getMessageFromFetchError,
useUserFetcher,
UserAccount,
makeRequest,
devlog,
createUserAccount,
} from "@frontend/kitui";
import {
clearUserData,
setUser,
setUserAccount,
useUserStore,
} from "@root/user";
2023-11-08 12:51:40 +00:00
import { enqueueSnackbar } from "notistack";
import PrivateRoute from "@ui_kit/PrivateRoute";
2023-11-08 12:51:40 +00:00
2023-12-16 13:02:27 +00:00
import { Restore } from "./pages/startPage/Restore";
2023-11-08 12:51:40 +00:00
2023-12-27 15:30:40 +00:00
import { isAxiosError } from "axios";
import { useEffect, useLayoutEffect, useRef } from "react";
2023-12-31 02:53:25 +00:00
export function useUserAccountFetcher({
onError,
onNewUserAccount,
url,
userId,
}: {
url: string;
userId: string | null;
onNewUserAccount: (response: UserAccount) => void;
onError?: (error: any) => void;
2023-12-27 15:30:40 +00:00
}) {
2023-12-31 02:53:25 +00:00
const onNewUserAccountRef = useRef(onNewUserAccount);
const onErrorRef = useRef(onError);
useLayoutEffect(() => {
onNewUserAccountRef.current = onNewUserAccount;
onErrorRef.current = onError;
}, [onError, onNewUserAccount]);
useEffect(() => {
if (!userId) return;
const controller = new AbortController();
makeRequest<never, UserAccount>({
url,
contentType: true,
method: "GET",
useToken: true,
withCredentials: false,
signal: controller.signal,
})
.then((result) => {
devlog("User account", result);
onNewUserAccountRef.current(result);
})
.catch((error) => {
devlog("Error fetching user account", error);
if (isAxiosError(error) && error.response?.status === 404) {
createUserAccount(controller.signal, url.replace("get", "create"))
.then((result) => {
devlog("Created user account", result);
onNewUserAccountRef.current(result);
})
.catch((error) => {
devlog("Error creating user account", error);
onErrorRef.current?.(error);
});
} else {
onErrorRef.current?.(error);
}
});
return () => controller.abort();
}, [url, userId]);
2023-12-27 15:30:40 +00:00
}
2023-11-08 12:51:40 +00:00
dayjs.locale("ru");
const routeslink = [
{
path: "/edit",
page: EditPage,
header: true,
sidebar: true,
footer: true,
},
{
path: "/design",
page: DesignPage,
2023-12-31 02:53:25 +00:00
header: true,
sidebar: true,
footer: true,
2023-12-31 02:53:25 +00:00
},
2023-11-08 12:51:40 +00:00
] as const;
export default function App() {
2023-12-31 02:53:25 +00:00
const userId = useUserStore((state) => state.userId);
const location = useLocation();
const navigate = useNavigate();
2023-11-08 12:51:40 +00:00
2023-12-31 02:53:25 +00:00
useUserFetcher({
url: `https://hub.pena.digital/user/${userId}`,
userId,
onNewUser: setUser,
onError: (error) => {
const errorMessage = getMessageFromFetchError(error);
if (errorMessage) {
enqueueSnackbar(errorMessage);
clearUserData();
clearAuthToken();
}
},
});
2023-11-08 12:51:40 +00:00
2023-12-31 02:53:25 +00:00
useUserAccountFetcher({
url: "https://squiz.pena.digital/squiz/account/get",
userId,
onNewUserAccount: setUserAccount,
onError: (error) => {
const errorMessage = getMessageFromFetchError(error);
if (errorMessage) {
enqueueSnackbar(errorMessage);
clearUserData();
clearAuthToken();
navigate("/signin");
}
},
});
2023-12-19 16:06:09 +00:00
2023-12-31 02:53:25 +00:00
if (location.state?.redirectTo)
2023-12-19 16:06:09 +00:00
return (
2023-12-31 02:53:25 +00:00
<Navigate
to={location.state.redirectTo}
replace
state={{ backgroundLocation: location }}
/>
2023-12-19 16:06:09 +00:00
);
2023-12-31 02:53:25 +00:00
return (
<>
<ContactFormModal />
{location.state?.backgroundLocation && (
<Routes>
<Route path="/signin" element={<SigninDialog />} />
<Route path="/signup" element={<SignupDialog />} />
<Route path="/restore" element={<Restore />} />
</Routes>
)}
<Routes location={location.state?.backgroundLocation || location}>
<Route path="/" element={<Landing />} />
<Route
2023-12-31 02:53:25 +00:00
path="/signin"
element={
<Navigate to="/" replace state={{ redirectTo: "/signin" }} />
}
/>
<Route
path="/signup"
element={
<Navigate to="/" replace state={{ redirectTo: "/signup" }} />
}
/>
<Route
path="/restore"
element={
<Navigate to="/" replace state={{ redirectTo: "/restore" }} />
}
/>
<Route path="/list" element={<MyQuizzesFull />} />
<Route path={"/view"} element={<ViewPage />} />
<Route path={"/tariffs"} element={<Tariffs />} />
2023-12-31 02:53:25 +00:00
<Route element={<PrivateRoute />}>
{routeslink.map((e, i) => (
<Route
key={i}
path={e.path}
element={
<Main
Page={e.page}
header={e.header}
sidebar={e.sidebar}
footer={e.footer}
/>
2023-12-31 02:53:25 +00:00
}
/>
))}
</Route>
2023-12-31 02:53:25 +00:00
</Routes>
</>
);
2023-12-16 13:02:27 +00:00
}