DocSpace-buildtools/web/ASC.Web.Client/src/Shell.jsx

253 lines
7.0 KiB
JavaScript

import React, { useEffect } from "react";
import { Router, Switch } from "react-router-dom";
import { inject, observer } from "mobx-react";
import NavMenu from "./components/NavMenu";
import Main from "./components/Main";
import Box from "@appserver/components/box";
import PrivateRoute from "@appserver/common/components/PrivateRoute";
import PublicRoute from "@appserver/common/components/PublicRoute";
import ErrorBoundary from "@appserver/common/components/ErrorBoundary";
import Layout from "./components/Layout";
import ScrollToTop from "./components/Layout/ScrollToTop";
import history from "@appserver/common/history";
import toastr from "studio/toastr";
import { updateTempContent } from "@appserver/common/utils";
import { Provider as MobxProvider } from "mobx-react";
import ThemeProvider from "@appserver/components/theme-provider";
import { Base } from "@appserver/components/themes";
import store from "studio/store";
import config from "../package.json";
import "./custom.scss";
import "./i18n";
import AppLoader from "./components/AppLoader";
import System from "./components/System";
const Payments = React.lazy(() => import("./components/pages/Payments"));
const Error404 = React.lazy(() => import("studio/Error404"));
const Error401 = React.lazy(() => import("studio/Error401"));
const Home = React.lazy(() => import("./components/pages/Home"));
const Login = React.lazy(() => import("login/app"));
const About = React.lazy(() => import("./components/pages/About"));
const Settings = React.lazy(() => import("./components/pages/Settings"));
const ComingSoon = React.lazy(() => import("./components/pages/ComingSoon"));
const SettingsRoute = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Settings {...props} />
</ErrorBoundary>
</React.Suspense>
);
const PaymentsRoute = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Payments {...props} />
</ErrorBoundary>
</React.Suspense>
);
const Error404Route = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Error404 {...props} />
</ErrorBoundary>
</React.Suspense>
);
const Error401Route = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Error401 {...props} />
</ErrorBoundary>
</React.Suspense>
);
const HomeRoute = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Home {...props} />
</ErrorBoundary>
</React.Suspense>
);
const LoginRoute = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Login {...props} />
</ErrorBoundary>
</React.Suspense>
);
const AboutRoute = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<About {...props} />
</ErrorBoundary>
</React.Suspense>
);
const ComingSoonRoute = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<ComingSoon {...props} />
</ErrorBoundary>
</React.Suspense>
);
const DynamicAppRoute = ({ link, appName, ...rest }) => {
const system = {
url: `${window.location.origin}${link}remoteEntry.js`,
scope: appName,
module: "./app",
};
return (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<System system={system} {...rest} />
</ErrorBoundary>
</React.Suspense>
);
};
const Shell = ({ items = [], page = "home", ...rest }) => {
// useEffect(() => {
// //utils.removeTempContent();
// const {
// getPortalSettings,
// getUser,
// getModules,
// setIsLoaded,
// getIsAuthenticated,
// } = rest;
// getIsAuthenticated()
// .then((isAuthenticated) => {
// if (isAuthenticated) updateTempContent(isAuthenticated);
// const requests = [];
// if (!isAuthenticated) {
// requests.push(getPortalSettings());
// } else if (
// !window.location.pathname.includes("confirm/EmailActivation")
// ) {
// requests.push(getUser());
// requests.push(getPortalSettings());
// requests.push(getModules());
// }
// return Promise.all(requests).finally(() => {
// updateTempContent();
// setIsLoaded();
// });
// })
// .catch((err) => toastr.error(err.message));
// }, []);
const { isLoaded, loadBaseInfo, isThirdPartyResponse, modules } = rest;
useEffect(() => {
try {
loadBaseInfo();
} catch (err) {
toastr.error(err);
}
}, []);
useEffect(() => {
if (isLoaded) updateTempContent();
}, [isLoaded]);
useEffect(() => {
console.log("Current page ", page);
// setModuleInfo(page, "e67be73d-f9ae-4ce1-8fec-1880cb518cb4");
}, [page]);
const pathname = window.location.pathname.toLowerCase();
const isEditor = pathname.indexOf("doceditor") !== -1;
const dynamicRoutes = modules.map((m) => (
<PrivateRoute
key={m.id}
path={m.link}
component={DynamicAppRoute}
link={m.link}
appName={m.appName}
/>
));
return (
<Layout>
<Router history={history}>
<Box>
{isEditor ? <></> : <NavMenu />}
<ScrollToTop />
<Main>
<Switch>
<PrivateRoute
exact
path={["/", "/error=:error"]}
component={HomeRoute}
/>
<PrivateRoute path={["/about"]} component={AboutRoute} />
<PublicRoute
exact
path={[
"/login",
"/login/error=:error",
"/login/confirmed-email=:confirmedEmail",
]}
component={LoginRoute}
/>
<PrivateRoute
exact
path={[
"/coming-soon",
"/products/mail",
"/products/projects",
"/products/crm",
"/products/calendar",
"/products/talk/",
]}
component={ComingSoonRoute}
/>
<PrivateRoute path="/payments" component={PaymentsRoute} />
<PrivateRoute
restricted
path="/settings"
component={SettingsRoute}
/>
{dynamicRoutes}
<PrivateRoute path="/error401" component={Error401Route} />
<PrivateRoute component={Error404Route} />
</Switch>
</Main>
</Box>
</Router>
</Layout>
);
};
const ShellWrapper = inject(({ auth }) => {
const { init, isLoaded } = auth;
const pathname = window.location.pathname.toLowerCase();
const isThirdPartyResponse = pathname.indexOf("thirdparty") !== -1;
return {
loadBaseInfo: () => {
init();
auth.setProductVersion(config.version);
},
isThirdPartyResponse,
isLoaded,
modules: auth.moduleStore.modules,
};
})(observer(Shell));
export default () => (
<ThemeProvider theme={Base}>
<MobxProvider {...store}>
<ShellWrapper />
</MobxProvider>
</ThemeProvider>
);