front-hub/src/index.tsx

193 lines
5.8 KiB
TypeScript
Raw Normal View History

import React from "react";
2022-11-17 12:25:23 +00:00
import ReactDOM from "react-dom/client";
2023-08-23 13:24:47 +00:00
import {
BrowserRouter,
Navigate,
Route,
Routes,
useLocation,
useNavigate,
} from "react-router-dom";
2023-05-17 11:20:11 +00:00
import { CssBaseline, ThemeProvider } from "@mui/material";
import Faq from "./pages/Faq/Faq";
import Wallet from "./pages/Wallet";
import Payment from "./pages/Payment/Payment";
import Support from "./pages/Support/Support";
2023-06-24 12:04:06 +00:00
import AccountSettings from "./pages/AccountSettings/AccountSettings";
import Landing from "./pages/Landing/Landing";
import Tariffs from "./pages/Tariffs/Tariffs";
2023-05-13 14:13:57 +00:00
import SigninDialog from "./pages/auth/Signin";
import SignupDialog from "./pages/auth/Signup";
2023-07-25 22:31:04 +00:00
import History from "./pages/History";
2023-08-12 14:55:41 +00:00
import Cart from "./pages/Cart/Cart";
2023-03-27 12:45:44 +00:00
import TariffPage from "./pages/Tariffs/TariffsPage";
2023-07-25 22:31:04 +00:00
import SavedTariffs from "./pages/SavedTariffs";
2023-03-27 12:45:44 +00:00
import PrivateRoute from "@utils/routes/privateRoute";
import reportWebVitals from "./reportWebVitals";
2023-05-17 11:20:11 +00:00
import { SnackbarProvider, enqueueSnackbar } from "notistack";
2023-03-27 12:45:44 +00:00
import "./index.css";
2023-05-17 11:20:11 +00:00
import Layout from "./components/Layout";
2023-08-23 13:24:47 +00:00
import {
clearUserData,
setUser,
setUserAccount,
useUserStore,
} from "./stores/user";
2023-05-27 11:50:21 +00:00
import TariffConstructor from "./pages/TariffConstructor/TariffConstructor";
2023-06-06 13:13:58 +00:00
import { useUser } from "./utils/hooks/useUser";
2023-08-23 13:24:47 +00:00
import {
clearAuthToken,
getMessageFromFetchError,
usePrivilegeFetcher,
} from "@frontend/kitui";
2023-06-24 18:17:43 +00:00
import { useUserAccount } from "./utils/hooks/useUserAccount";
import { setCustomTariffs } from "@root/stores/customTariffs";
import { useCustomTariffs } from "@root/utils/hooks/useCustomTariffs";
import { useDiscounts } from "./utils/hooks/useDiscounts";
import { setDiscounts } from "./stores/discounts";
2023-07-25 22:31:04 +00:00
import { pdfjs } from "react-pdf";
2023-08-08 12:59:54 +00:00
import { setPrivileges } from "./stores/privileges";
2023-08-22 10:28:22 +00:00
import { theme } from "./utils/theme";
2023-03-27 12:45:44 +00:00
2023-08-23 13:24:47 +00:00
pdfjs.GlobalWorkerOptions.workerSrc = new URL(
"pdfjs-dist/build/pdf.worker.min.js",
import.meta.url
).toString();
2023-05-13 14:13:57 +00:00
2023-03-19 12:32:23 +00:00
const App = () => {
const location = useLocation();
const userId = useUserStore((state) => state.userId);
const navigate = useNavigate();
useCustomTariffs({
url: "https://admin.pena.digital/strator/privilege/service",
onNewUser: setCustomTariffs,
onError: (error) => {
2023-08-23 13:24:47 +00:00
const errorMessage = getMessageFromFetchError(
error,
"Не удалось получить кастомные тарифы"
);
if (errorMessage) enqueueSnackbar(errorMessage);
},
});
useUser({
url: `https://hub.pena.digital/user/${userId}`,
userId,
onNewUser: setUser,
onError: (error) => {
const errorMessage = getMessageFromFetchError(error);
if (errorMessage) {
enqueueSnackbar(errorMessage);
clearUserData();
clearAuthToken();
}
},
});
2023-05-17 11:20:11 +00:00
useUserAccount({
url: "https://hub.pena.digital/customer/account",
userId,
onNewUserAccount: setUserAccount,
onError: (error) => {
const errorMessage = getMessageFromFetchError(error);
if (errorMessage) {
enqueueSnackbar(errorMessage);
clearUserData();
clearAuthToken();
navigate("/signin");
}
},
});
2023-06-24 18:17:43 +00:00
useDiscounts({
onNewDiscounts: setDiscounts,
onError: (error) => {
const message = getMessageFromFetchError(error);
if (message) enqueueSnackbar(message);
},
});
usePrivilegeFetcher({
onSuccess: setPrivileges,
onError: (error) => {
console.log("usePrivilegeFetcher error :>> ", error);
},
});
2023-08-08 12:59:54 +00:00
if (location.state?.redirectTo)
2023-08-23 13:24:47 +00:00
return (
<Navigate
to={location.state.redirectTo}
replace
state={{ backgroundLocation: location }}
/>
);
return (
<>
{location.state?.backgroundLocation && (
<Routes>
<Route path="/signin" element={<SigninDialog />} />
<Route path="/signup" element={<SignupDialog />} />
</Routes>
)}
<Routes location={location.state?.backgroundLocation || location}>
<Route path="/" element={<Landing />} />
2023-08-23 13:24:47 +00:00
<Route
path="/signin"
element={
<Navigate to="/" replace state={{ redirectTo: "/signin" }} />
}
/>
<Route
path="/signup"
element={
<Navigate to="/" replace state={{ redirectTo: "/signup" }} />
}
/>
<Route element={<Layout />}>
<Route element={<PrivateRoute />}>
<Route path="/tariffs" element={<Tariffs />} />
<Route path="/tariffs/time" element={<TariffPage />} />
<Route path="/tariffs/volume" element={<TariffPage />} />
<Route path="/faq" element={<Faq />} />
<Route path="/support" element={<Support />} />
<Route path="/support/:ticketId" element={<Support />} />
<Route path="/tariffconstructor" element={<TariffConstructor />} />
<Route path="/cart" element={<Cart />} />
<Route path="/wallet" element={<Wallet />} />
<Route path="/payment" element={<Payment />} />
<Route path="/settings" element={<AccountSettings />} />
<Route path="/history" element={<History />} />
2023-08-23 13:24:47 +00:00
<Route
path="/tariffconstructor/savedtariffs"
element={<SavedTariffs />}
/>
</Route>
</Route>
</Routes>
</>
);
};
2023-08-23 13:24:47 +00:00
const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement
);
2022-11-17 12:25:23 +00:00
root.render(
<React.StrictMode>
2023-08-22 10:28:22 +00:00
<ThemeProvider theme={theme}>
<BrowserRouter>
<CssBaseline />
<SnackbarProvider />
<App />
</BrowserRouter>
</ThemeProvider>
</React.StrictMode>
2022-11-17 12:25:23 +00:00
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();