Web:Client: add declarative router object

This commit is contained in:
Timofey Boyko 2023-04-19 15:42:53 +03:00
parent c3725e3099
commit 56ab350cb4
10 changed files with 862 additions and 992 deletions

View File

@ -1,13 +1,16 @@
//import "@docspace/common/utils/wdyr";
import React from "react";
import { RouterProvider } from "react-router-dom";
import ErrorBoundary from "@docspace/common/components/ErrorBoundary";
import Shell from "client/shell";
import "@docspace/common/custom.scss";
import router from "./router";
const App = () => {
return (
<ErrorBoundary>
<Shell />
<RouterProvider router={router} />
</ErrorBoundary>
);
};

View File

@ -0,0 +1,188 @@
import React from "react";
import { inject, observer } from "mobx-react";
import { useLocation, Navigate, Route, Outlet } from "react-router-dom";
import { withTranslation } from "react-i18next";
import Article from "@docspace/common/components/Article";
import {
updateTempContent,
loadScript,
showLoader,
hideLoader,
} from "@docspace/common/utils";
import { regDesktop } from "@docspace/common/desktop";
import toastr from "@docspace/components/toast/toastr";
import FilesPanels from "./components/FilesPanels";
import GlobalEvents from "./components/GlobalEvents";
import {
ArticleBodyContent,
ArticleHeaderContent,
ArticleMainButtonContent,
} from "./components/Article";
const ClientArticle = React.memo(({ withMainButton }) => {
return (
<Article withMainButton={withMainButton}>
<Article.Header>
<ArticleHeaderContent />
</Article.Header>
<Article.MainButton>
<ArticleMainButtonContent />
</Article.MainButton>
<Article.Body>
<ArticleBodyContent />
</Article.Body>
</Article>
);
});
const ClientContent = (props) => {
const {
loadClientInfo,
setIsLoaded,
isAuthenticated,
user,
isEncryption,
encryptionKeys,
setEncryptionKeys,
isLoaded,
isDesktop,
showMenu,
isFrame,
withMainButton,
t,
setFirstLoad,
isLoading,
} = props;
const location = useLocation();
const isEditor = location.pathname.indexOf("doceditor") !== -1;
const isFormGallery = location.pathname.split("/").includes("form-gallery");
const [isDesktopInit, setIsDesktopInit] = React.useState(false);
React.useEffect(() => {
loadScript("/static/scripts/tiff.min.js", "img-tiff-script");
loadClientInfo()
.catch((err) => toastr.error(err))
.finally(() => {
setIsLoaded(true);
updateTempContent();
});
return () => {
const script = document.getElementById("img-tiff-script");
document.body.removeChild(script);
};
}, []);
React.useEffect(() => {
if (isAuthenticated && !isDesktopInit && isDesktop && isLoaded) {
setIsDesktopInit(true);
regDesktop(
user,
isEncryption,
encryptionKeys,
setEncryptionKeys,
isEditor,
null,
t
);
// console.log(
// "%c%s",
// "color: green; font: 1.2em bold;",
// "Current keys is: ",
// encryptionKeys
// );
}
}, [
t,
isAuthenticated,
user,
isEncryption,
encryptionKeys,
setEncryptionKeys,
isLoaded,
isDesktop,
isDesktopInit,
]);
React.useEffect(() => {
setFirstLoad(false);
}, [setFirstLoad]);
React.useEffect(() => {
if (isLoading) {
showLoader();
} else {
hideLoader();
}
}, [isLoading]);
return (
<>
<GlobalEvents />
<FilesPanels />
{!isFormGallery ? (
isFrame ? (
showMenu && <ClientArticle />
) : (
<ClientArticle withMainButton={withMainButton} />
)
) : (
<></>
)}
<Outlet />
</>
);
};
const Client = inject(({ auth, filesStore, peopleStore }) => {
const {
frameConfig,
isFrame,
isDesktopClient,
encryptionKeys,
setEncryptionKeys,
isEncryptionSupport,
} = auth.settingsStore;
if (!auth.userStore.user) return;
const { isVisitor } = auth.userStore.user;
const { setFirstLoad, isLoading } = filesStore;
const withMainButton = !isVisitor;
return {
isDesktop: isDesktopClient,
isFrame,
showMenu: frameConfig?.showMenu,
user: auth.userStore.user,
isAuthenticated: auth.isAuthenticated,
encryptionKeys: encryptionKeys,
isEncryption: isEncryptionSupport,
isLoaded: auth.isLoaded && filesStore.isLoaded,
setIsLoaded: filesStore.setIsLoaded,
withMainButton,
setFirstLoad,
isLoading,
setEncryptionKeys: setEncryptionKeys,
loadClientInfo: async () => {
const actions = [];
actions.push(filesStore.initFiles());
actions.push(peopleStore.init());
await Promise.all(actions);
},
};
})(withTranslation("Common")(observer(ClientContent)));
export default () => <Client />;

View File

@ -1,30 +1,22 @@
import React, { useEffect } from "react";
import {
BrowserRouter as Router,
Routes,
Route,
Navigate,
useLocation,
} from "react-router-dom";
import { inject, observer } from "mobx-react";
import { useLocation, useNavigate, Outlet } from "react-router-dom";
import { inject, observer, Provider as MobxProvider } from "mobx-react";
import NavMenu from "./components/NavMenu";
import Main from "./components/Main";
import PrivateRoute from "@docspace/common/components/PrivateRoute";
import PublicRoute from "@docspace/common/components/PublicRoute";
import ErrorBoundary from "@docspace/common/components/ErrorBoundary";
import Layout from "./components/Layout";
import ScrollToTop from "./components/Layout/ScrollToTop";
import Toast from "@docspace/components/toast";
import toastr from "@docspace/components/toast/toastr";
import { getLogoFromPath, updateTempContent } from "@docspace/common/utils";
import { Provider as MobxProvider } from "mobx-react";
import ThemeProvider from "@docspace/components/theme-provider";
import store from "client/store";
import config from "PACKAGE_FILE";
import { I18nextProvider, useTranslation } from "react-i18next";
import i18n from "./i18n";
import AppLoader from "@docspace/common/components/AppLoader";
import Snackbar from "@docspace/components/snackbar";
import moment from "moment";
import ReactSmartBanner from "./components/SmartBanner";
@ -34,130 +26,9 @@ import IndicatorLoader from "./components/IndicatorLoader";
import DialogsWrapper from "./components/dialogs/DialogsWrapper";
import MainBar from "./components/MainBar";
import { Portal } from "@docspace/components";
import queryString from "query-string";
const Error404 = React.lazy(() => import("client/Error404"));
const Error401 = React.lazy(() => import("client/Error401"));
const Files = React.lazy(() => import("./pages/Files")); //import("./components/pages/Home"));
const About = React.lazy(() => import("./pages/About"));
const Wizard = React.lazy(() => import("./pages/Wizard"));
const PortalSettings = React.lazy(() => import("./pages/PortalSettings"));
const Confirm = !IS_PERSONAL && React.lazy(() => import("./pages/Confirm"));
const PreparationPortal = React.lazy(() => import("./pages/PreparationPortal"));
const PortalUnavailable = React.lazy(() => import("./pages/PortalUnavailable"));
const FormGallery = React.lazy(() => import("./pages/FormGallery"));
const ErrorUnavailable = React.lazy(() => import("./pages/Errors/Unavailable"));
const PortalSettingsRoute = (props) => {
return (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<PortalSettings {...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 ErrorUnavailableRoute = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<ErrorUnavailable {...props} />
</ErrorBoundary>
</React.Suspense>
);
const FilesRoute = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Files {...props} />
</ErrorBoundary>
</React.Suspense>
);
const ConfirmRoute =
!IS_PERSONAL &&
((props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Confirm {...props} />
</ErrorBoundary>
</React.Suspense>
));
const PreparationPortalRoute = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<PreparationPortal {...props} />
</ErrorBoundary>
</React.Suspense>
);
const PortalUnavailableRoute = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<PortalUnavailable {...props} />
</ErrorBoundary>
</React.Suspense>
);
const AboutRoute = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<About {...props} />
</ErrorBoundary>
</React.Suspense>
);
const WizardRoute = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Wizard {...props} />
</ErrorBoundary>
</React.Suspense>
);
const FormGalleryRoute = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<FormGallery {...props} />
</ErrorBoundary>
</React.Suspense>
);
const ConfirmNavigate = () => {
const location = useLocation();
const type = queryString.parse(location.search).type;
return (
<Navigate
to={`/confirm/${type}`}
search={location.search}
state={{ from: location }}
/>
);
};
const Shell = ({ items = [], page = "home", ...rest }) => {
const {
isLoaded,
@ -451,120 +322,21 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
);
return (
<Router>
<Layout>
{toast}
<ReactSmartBanner t={t} ready={ready} />
{isEditor || !isMobileOnly ? <></> : <NavMenu />}
{isMobileOnly && <MainBar />}
<IndicatorLoader />
<ScrollToTop />
<DialogsWrapper t={t} />
<Main isDesktop={isDesktop}>
{!isMobileOnly && <MainBar />}
<div className="main-container">
<Routes>
<Route
caseSensitive
path="/Products/Files/"
element={<Navigate to="/rooms/shared" replace />}
/>
<Route
path="/*"
element={
<PrivateRoute>
<FilesRoute />
</PrivateRoute>
}
/>
<Route
path={"/form-gallery/:folderId"}
element={
<PrivateRoute>
<FormGalleryRoute />
</PrivateRoute>
}
/>
<Route
path={"/wizard"}
element={
<PublicRoute>
<WizardRoute />
</PublicRoute>
}
/>
<Route
path={"/about"}
element={
<PrivateRoute>
<AboutRoute />
</PrivateRoute>
}
/>
{/* <Route path={"/confirm/:type/*"} element={<ConfirmRoute />} /> */}
<Route path={"/confirm/*"} element={<ConfirmRoute />} />
<Route path={"/confirm.aspx/*"} element={<ConfirmRoute />} />
<Route
path={"/portal-settings/*"}
element={
<PrivateRoute restricted>
<PortalSettingsRoute />
</PrivateRoute>
}
/>
<Route
path={"/portal-unavailable"}
element={
<PrivateRoute>
<PortalUnavailableRoute />
</PrivateRoute>
}
/>
<Route
path={"/preparation-portal"}
element={
<PublicRoute>
<PreparationPortalRoute />
</PublicRoute>
}
/>
<Route
path={"/unavailable"}
element={
<PrivateRoute>
<ErrorUnavailableRoute />
</PrivateRoute>
}
/>
<Route
path={"/error401"}
element={
<PrivateRoute>
<Error401Route />
</PrivateRoute>
}
/>
<Route
element={
<PrivateRoute>
<Error404Route />
</PrivateRoute>
}
/>
</Routes>
</div>
</Main>
</Layout>
</Router>
<Layout>
{toast}
<ReactSmartBanner t={t} ready={ready} />
{isEditor || !isMobileOnly ? <></> : <NavMenu />}
{isMobileOnly && <MainBar />}
<IndicatorLoader />
<ScrollToTop />
<DialogsWrapper t={t} />
<Main isDesktop={isDesktop}>
{!isMobileOnly && <MainBar />}
<div className="main-container">
<Outlet />
</div>
</Main>
</Layout>
);
};

View File

@ -2,8 +2,7 @@ import React, { useEffect, useState } from "react";
import styled, { css } from "styled-components";
import PropTypes from "prop-types";
import MobileLayout from "./MobileLayout";
import history from "@docspace/common/history";
import { useNavigate, useLocation, useMatch } from "react-router-dom";
import { size } from "@docspace/components/utils/device";
import {
isIOS,
@ -41,9 +40,6 @@ const Layout = (props) => {
const [contentHeight, setContentHeight] = useState();
const [isPortrait, setIsPortrait] = useState();
history.navigate = useNavigate();
history.location = useLocation();
const intervalTime = 100;
const endTimeout = 300;
let intervalHandler;

View File

@ -1,9 +1,10 @@
import authStore from "@docspace/common/store/AuthStore";
import { toCommunityHostname, getLanguage } from "@docspace/common/utils";
import history from "@docspace/common/history";
import { CategoryType } from "./constants";
import { FolderType, ShareAccessRights } from "@docspace/common/constants";
import { translations } from "./autoGeneratedTranslations";
// import router from "SRC_DIR/router";
export const setDocumentTitle = (subTitle = null) => {
const { isAuthenticated, settingsStore, product: currentModule } = authStore;
@ -29,7 +30,7 @@ export function loadLanguagePath(homepage, fixedNS = null) {
return (lng, ns) => {
const language = getLanguage(lng instanceof Array ? lng[0] : lng);
const lngCollection = translations.get(language);
const lngCollection = translations?.get(language);
const data = lngCollection?.get(`${fixedNS || ns}`);
@ -95,7 +96,7 @@ export const onItemClick = (e) => {
return window.open(link, "_blank");
}
history.navigate(link);
// router.navigate(link);
};
export const getPasswordErrorMessage = (t, settings) => {

View File

@ -1,102 +0,0 @@
import React, { useEffect } from "react";
import { inject, observer } from "mobx-react";
import { Navigate, Routes, Route, useLocation } from "react-router-dom";
import ErrorBoundary from "@docspace/common/components/ErrorBoundary";
import toastr from "@docspace/components/toast/toastr";
import PrivateRoute from "@docspace/common/components/PrivateRoute";
import AppLoader from "@docspace/common/components/AppLoader";
import { /*combineUrl,*/ updateTempContent } from "@docspace/common/utils";
import Home from "./AccountsHome";
import Filter from "@docspace/common/api/people/filter";
import { showLoader, hideLoader } from "@docspace/common/utils";
const Error404 = React.lazy(() => import("client/Error404"));
const Error404Route = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Error404 {...props} />
</ErrorBoundary>
</React.Suspense>
);
const HomeRedirectToFilter = () => {
const filter = Filter.getDefault();
const urlFilter = filter.toUrlParams();
return <Navigate replace to={`/accounts/filter?${urlFilter}`} />;
};
const PeopleSection = React.memo(() => {
return (
<Routes>
<Route
path="/*"
element={
<PrivateRoute restricted withManager location={location}>
<HomeRedirectToFilter />
</PrivateRoute>
}
/>
<Route
path="/filter"
element={
<PrivateRoute restricted withManager location={location}>
<Home />
</PrivateRoute>
}
/>
<Route
element={
<PrivateRoute location={location}>
<Error404Route />
</PrivateRoute>
}
/>
</Routes>
);
});
const PeopleContent = (props) => {
const { loadBaseInfo, isLoading, setFirstLoad } = props;
useEffect(() => {
setFirstLoad(false);
}, [setFirstLoad]);
useEffect(() => {
if (isLoading) {
showLoader();
} else {
hideLoader();
}
}, [isLoading]);
useEffect(() => {
loadBaseInfo()
.catch((err) => toastr.error(err))
.finally(() => {
updateTempContent();
});
}, []);
return <PeopleSection />;
};
const People = inject(({ auth, filesStore, peopleStore }) => {
const { setFirstLoad, isLoading } = filesStore;
return {
loadBaseInfo: async () => {
await peopleStore.init();
//auth.setProductVersion(config.version);
},
setFirstLoad,
isLoading,
};
})(observer(PeopleContent));
export default (props) => <People {...props} />;

View File

@ -1,159 +1,10 @@
import React, { lazy } from "react";
import { Routes, Route } from "react-router-dom";
import ConfirmRoute from "../../helpers/confirmRoute";
const ActivateUserForm = lazy(() => import("./sub-components/activateUser"));
const CreateUserForm = lazy(() => import("./sub-components/createUser"));
const ChangePasswordForm = lazy(() =>
import("./sub-components/changePassword")
);
const ActivateEmailForm = lazy(() => import("./sub-components/activateEmail"));
const ChangeEmailForm = lazy(() => import("./sub-components/changeEmail"));
const ChangePhoneForm = lazy(() => import("./sub-components/changePhone"));
const ProfileRemoveForm = lazy(() => import("./sub-components/profileRemove"));
const ChangeOwnerForm = lazy(() => import("./sub-components/changeOwner"));
const TfaAuthForm = lazy(() => import("./sub-components/tfaAuth"));
const TfaActivationForm = lazy(() => import("./sub-components/tfaActivation"));
const RemovePortal = lazy(() => import("./sub-components/removePortal"));
const DeactivatePortal = lazy(() =>
import("./sub-components/deactivatePortal")
);
const ContinuePortal = lazy(() => import("./sub-components/continuePortal"));
const Auth = lazy(() => import("./sub-components/auth"));
const Error404 = lazy(() => import("../Errors/404"));
import React from "react";
import { Outlet } from "react-router-dom";
const Confirm = () => {
//console.log("Confirm render");
return (
<Routes>
<Route
path={`LinkInvite`}
element={
<ConfirmRoute forUnauthorized>
<CreateUserForm />
</ConfirmRoute>
}
/>
<Route
path={`Activation`}
element={
<ConfirmRoute forUnauthorized>
<ActivateUserForm />
</ConfirmRoute>
}
/>
<Route
path={`EmailActivation`}
element={
<ConfirmRoute>
<ActivateEmailForm />
</ConfirmRoute>
}
/>
<Route
path={`EmailChange`}
element={
<ConfirmRoute>
<ChangeEmailForm />
</ConfirmRoute>
}
/>
<Route
path={`PasswordChange`}
element={
<ConfirmRoute forUnauthorized>
<ChangePasswordForm />
</ConfirmRoute>
}
/>
<Route
path={`ProfileRemove`}
element={
<ConfirmRoute>
<ProfileRemoveForm />
</ConfirmRoute>
}
/>
<Route
path={`PhoneActivation`}
element={
<ConfirmRoute>
<ChangePhoneForm />
</ConfirmRoute>
}
/>
<Route
path={`PortalOwnerChange`}
element={
<ConfirmRoute>
<ChangeOwnerForm />
</ConfirmRoute>
}
/>
<Route
path={`TfaAuth`}
element={
<ConfirmRoute>
<TfaAuthForm />
</ConfirmRoute>
}
/>
<Route
path={`TfaActivation`}
element={
<ConfirmRoute>
<TfaActivationForm />
</ConfirmRoute>
}
/>
<Route
path={`PortalRemove`}
element={
<ConfirmRoute>
<RemovePortal />
</ConfirmRoute>
}
/>
<Route
path={`PortalSuspend`}
element={
<ConfirmRoute>
<DeactivatePortal />
</ConfirmRoute>
}
/>
<Route
path={`PortalContinue`}
element={
<ConfirmRoute>
<ContinuePortal />
</ConfirmRoute>
}
/>
<Route
path={`Auth`}
element={
<ConfirmRoute forUnauthorized>
<Auth />
</ConfirmRoute>
}
/>
</Routes>
);
return <Outlet />;
};
export default Confirm;

View File

@ -1,346 +0,0 @@
import React from "react";
//import { Provider as FilesProvider } from "mobx-react";
import { inject, observer } from "mobx-react";
import { Routes, useLocation, Navigate, Route } from "react-router-dom";
//import config from "PACKAGE_FILE";
import PrivateRoute from "@docspace/common/components/PrivateRoute";
import AppLoader from "@docspace/common/components/AppLoader";
import toastr from "@docspace/components/toast/toastr";
import {
//combineUrl,
updateTempContent,
loadScript,
} from "@docspace/common/utils";
//import i18n from "./i18n";
import { withTranslation } from "react-i18next";
import { regDesktop } from "@docspace/common/desktop";
import Home from "./Home";
import Settings from "./Settings";
//import VersionHistory from "./VersionHistory";
import PrivateRoomsPage from "./PrivateRoomsPage";
import ErrorBoundary from "@docspace/common/components/ErrorBoundary";
import Panels from "../components/FilesPanels";
import Article from "@docspace/common/components/Article";
import {
ArticleBodyContent,
ArticleHeaderContent,
ArticleMainButtonContent,
} from "../components/Article";
import GlobalEvents from "../components/GlobalEvents";
import Accounts from "./Accounts";
import Profile from "./Profile";
import NotificationComponent from "./Notifications";
// const homepage = config.homepage;
// const PROXY_HOMEPAGE_URL = combineUrl(window.DocSpaceConfig?.proxy?.url, homepage);
// const HOME_URL = combineUrl(PROXY_HOMEPAGE_URL, "/");
// const SETTINGS_URL = combineUrl(PROXY_HOMEPAGE_URL, "/settings/:setting");
// const HISTORY_URL = combineUrl(PROXY_HOMEPAGE_URL, "/:fileId/history");
// const PRIVATE_ROOMS_URL = combineUrl(PROXY_HOMEPAGE_URL, "/private");
// const FILTER_URL = combineUrl(PROXY_HOMEPAGE_URL, "/filter");
// const MEDIA_VIEW_URL = combineUrl(PROXY_HOMEPAGE_URL, "/#preview");
// const FORM_GALLERY_URL = combineUrl(
// PROXY_HOMEPAGE_URL,
// "/form-gallery/:folderId"
// );
// const ROOMS_URL = combineUrl(PROXY_HOMEPAGE_URL, "/rooms");
const Error404 = React.lazy(() => import("client/Error404"));
const FilesArticle = React.memo(({ withMainButton }) => {
const location = useLocation();
const isFormGallery = location.pathname.split("/").includes("form-gallery");
return !isFormGallery ? (
<Article withMainButton={withMainButton}>
<Article.Header>
<ArticleHeaderContent />
</Article.Header>
<Article.MainButton>
<ArticleMainButtonContent />
</Article.MainButton>
<Article.Body>
<ArticleBodyContent />
</Article.Body>
</Article>
) : (
<></>
);
});
const Error404Route = (props) => (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Error404 {...props} />
</ErrorBoundary>
</React.Suspense>
);
const FilesSection = React.memo(({ withMainButton }) => {
return (
<Routes>
<Route
path="/"
element={
<PrivateRoute location={location}>
<Navigate to="/rooms/shared" replace />
</PrivateRoute>
}
/>
<Route
path="/rooms"
element={
<PrivateRoute location={location}>
<Navigate to="/rooms/shared" replace />
</PrivateRoute>
}
/>
<Route
path="/rooms/personal/*"
element={
<PrivateRoute
restricted
withManager
withCollaborator
location={location}
>
<Home />
</PrivateRoute>
}
/>
<Route
path="/files/trash/*"
element={
<PrivateRoute
restricted
withManager
withCollaborator
location={location}
>
<Home />
</PrivateRoute>
}
/>
<Route
path="/rooms/shared/*"
element={
<PrivateRoute location={location}>
<Home />
</PrivateRoute>
}
/>
<Route
path="/rooms/archived/*"
element={
<PrivateRoute location={location}>
<Home />
</PrivateRoute>
}
/>
<Route
path="/products/files/"
element={
<PrivateRoute location={location}>
<Home />
</PrivateRoute>
}
/>
<Route
path="/accounts/*"
element={
<PrivateRoute restricted withManager location={location}>
<Accounts />
</PrivateRoute>
}
/>
<Route
path="/accounts/create/:type"
element={
<PrivateRoute restricted withManager location={location}>
<Accounts />
</PrivateRoute>
}
/>
<Route
path="/accounts/view/@self"
element={
<PrivateRoute location={location}>
<Profile />
</PrivateRoute>
}
/>
<Route
path="accounts/view/@self/notification"
element={
<PrivateRoute location={location}>
<NotificationComponent />
</PrivateRoute>
}
/>
<Route
path={"/settings"}
element={
<PrivateRoute withCollaborator restricted location={location}>
<Navigate to="/settings/common" replace />
</PrivateRoute>
}
/>
<Route
path={"/settings/*"}
element={
<PrivateRoute withCollaborator restricted location={location}>
<Settings />
</PrivateRoute>
}
/>
<Route
element={
<PrivateRoute location={location}>
<Error404Route />
</PrivateRoute>
}
/>
</Routes>
);
});
const FilesContent = (props) => {
const pathname = window.location.pathname.toLowerCase();
const isEditor = pathname.indexOf("doceditor") !== -1;
const [isDesktopInit, setIsDesktopInit] = React.useState(false);
const {
loadFilesInfo,
setIsLoaded,
isAuthenticated,
user,
isEncryption,
encryptionKeys,
setEncryptionKeys,
isLoaded,
isDesktop,
showMenu,
isFrame,
withMainButton,
t,
} = props;
React.useEffect(() => {
loadScript("/static/scripts/tiff.min.js", "img-tiff-script");
loadFilesInfo()
.catch((err) => toastr.error(err))
.finally(() => {
setIsLoaded(true);
updateTempContent();
});
return () => {
const script = document.getElementById("img-tiff-script");
document.body.removeChild(script);
};
}, []);
React.useEffect(() => {
if (isAuthenticated && !isDesktopInit && isDesktop && isLoaded) {
setIsDesktopInit(true);
regDesktop(
user,
isEncryption,
encryptionKeys,
setEncryptionKeys,
isEditor,
null,
t
);
console.log(
"%c%s",
"color: green; font: 1.2em bold;",
"Current keys is: ",
encryptionKeys
);
}
}, [
t,
isAuthenticated,
user,
isEncryption,
encryptionKeys,
setEncryptionKeys,
isLoaded,
isDesktop,
isDesktopInit,
]);
return (
<>
<GlobalEvents />
<Panels />
{isFrame ? (
showMenu && <FilesArticle />
) : (
<FilesArticle withMainButton={withMainButton} />
)}
<FilesSection withMainButton={withMainButton} />
</>
);
};
const Files = inject(({ auth, filesStore }) => {
const {
frameConfig,
isFrame,
isDesktopClient,
encryptionKeys,
setEncryptionKeys,
isEncryptionSupport,
} = auth.settingsStore;
if (!auth.userStore.user) return;
const { isVisitor } = auth.userStore.user;
const withMainButton = !isVisitor;
return {
isDesktop: isDesktopClient,
isFrame,
showMenu: frameConfig?.showMenu,
user: auth.userStore.user,
isAuthenticated: auth.isAuthenticated,
encryptionKeys: encryptionKeys,
isEncryption: isEncryptionSupport,
isLoaded: auth.isLoaded && filesStore.isLoaded,
setIsLoaded: filesStore.setIsLoaded,
withMainButton,
setEncryptionKeys: setEncryptionKeys,
loadFilesInfo: async () => {
await filesStore.initFiles();
//auth.setProductVersion(config.version);
},
};
})(withTranslation("Common")(observer(FilesContent)));
export default () => <Files />;

View File

@ -1,143 +1,14 @@
import React, { lazy } from "react";
import { Route, Routes, Navigate } from "react-router-dom";
import React from "react";
import { Outlet } from "react-router-dom";
import Layout from "./Layout";
import { combineUrl } from "@docspace/common/utils";
import Panels from "../../components/FilesPanels";
const SecuritySettings = lazy(() => import("./categories/security/index.js"));
const TfaPage = lazy(() => import("./categories/security/access-portal/tfa"));
const PasswordStrengthPage = lazy(() =>
import("./categories/security/access-portal/passwordStrength")
);
const TrustedMailPage = lazy(() =>
import("./categories/security/access-portal/trustedMail")
);
const IpSecurityPage = lazy(() =>
import("./categories/security/access-portal/ipSecurity")
);
const AdminMessagePage = lazy(() =>
import("./categories/security/access-portal/adminMessage")
);
const SessionLifetimePage = lazy(() =>
import("./categories/security/access-portal/sessionLifetime")
);
const CustomizationSettings = lazy(() =>
import("./categories/common/index.js")
);
const DeveloperTools = lazy(() =>
import("./categories/developer-tools/index.js")
);
const LanguageAndTimeZoneSettings = lazy(() =>
import("./categories/common/Customization/language-and-time-zone")
);
const WelcomePageSettings = lazy(() =>
import("./categories/common/Customization/welcome-page-settings")
);
const DNSSettings = lazy(() =>
import("./categories/common/Customization/dns-settings")
);
const PortalRenaming = lazy(() =>
import("./categories/common/Customization/portal-renaming")
);
const Integration = lazy(() => import("./categories/integration"));
const Payments = lazy(() => import("./categories/payments"));
const ThirdParty = lazy(() =>
import("./categories/integration/ThirdPartyServicesSettings")
);
const SingleSignOn = lazy(() =>
import("./categories/integration/SingleSignOn")
);
const Backup = lazy(() => import("./categories/data-management/index"));
const RestoreBackup = lazy(() =>
import("./categories/data-management/backup/restore-backup/index")
);
const DeleteDataPage = lazy(() => import("./categories/delete-data"));
const WhiteLabel = lazy(() =>
import("./categories/common/Branding/whitelabel")
);
const Branding = lazy(() => import("./categories/common/branding"));
const ERROR_404_URL = combineUrl(
window.DocSpaceConfig?.proxy?.url,
"/error/404"
);
const Settings = () => {
return (
<Layout key="1">
<Panels />
<Routes>
<Route path={"/*"} element={<CustomizationSettings />} />
<Route path={"/customization/*"} element={<CustomizationSettings />} />
<Route
path={"/customization/general/language-and-time-zone"}
element={<LanguageAndTimeZoneSettings />}
/>
<Route
path={"/customization/general/welcome-page-settings"}
element={<WelcomePageSettings />}
/>
<Route
path={"/customization/general/dns-settings"}
element={<DNSSettings />}
/>
<Route
path={"/customization/general/portal-renaming"}
element={<PortalRenaming />}
/>
<Route path={"/common/whitelabel"} element={<WhiteLabel />} />
<Route path={"/security/*"} element={<SecuritySettings />} />
<Route path={"security/access-portal"} element={<SecuritySettings />} />
<Route path={"/security/access-portal/tfa"} element={<TfaPage />} />
<Route
path={"/security/access-portal/password"}
element={<PasswordStrengthPage />}
/>
<Route
path={"/security/access-portal/trusted-mail"}
element={<TrustedMailPage />}
/>
<Route
path={"/security/access-portal/ip"}
element={<IpSecurityPage />}
/>
<Route
path={"/security/access-portal/admin-message"}
element={<AdminMessagePage />}
/>
<Route
path={"/security/access-portal/lifetime"}
element={<SessionLifetimePage />}
/>
<Route path={"/integration/*"} element={<Integration />} />
<Route path={"/payments/portal-payments"} element={<Payments />} />
<Route
path={"/integration/third-party-services"}
element={<ThirdParty />}
/>
<Route
path={"/integration/single-sign-on"}
element={<SingleSignOn />}
/>
<Route path={"/developer/*"} element={<DeveloperTools />} />
<Route path={"/backup/*"} element={<Backup />} />
<Route path={"/delete-data/*"} element={<DeleteDataPage />} />
<Route path={"/restore/*"} element={<RestoreBackup />} />
<Route element={<Navigate to={ERROR_404_URL} replace />} />
</Routes>
<Outlet />
</Layout>
);
};

View File

@ -0,0 +1,636 @@
import React from "react";
import { createBrowserRouter, Navigate } from "react-router-dom";
import PrivateRoute from "@docspace/common/components/PrivateRoute";
import PublicRoute from "@docspace/common/components/PublicRoute";
import ConfirmRoute from "./helpers/confirmRoute";
import ErrorBoundary from "@docspace/common/components/ErrorBoundary";
import AppLoader from "@docspace/common/components/AppLoader";
import Root from "./Shell";
const Client = React.lazy(() => import("./Client"));
const PortalSettings = React.lazy(() => import("./pages/PortalSettings"));
const Home = React.lazy(() => import("./pages/Home"));
const AccountsHome = React.lazy(() => import("./pages/AccountsHome"));
const Settings = React.lazy(() => import("./pages/Settings"));
const Profile = React.lazy(() => import("./pages/Profile"));
const NotificationComponent = React.lazy(() => import("./pages/Notifications"));
const Confirm = React.lazy(() => import("./pages/Confirm"));
const CustomizationSettings = React.lazy(() =>
import("./pages/PortalSettings/categories/common/index.js")
);
const LanguageAndTimeZoneSettings = React.lazy(() =>
import(
"./pages/PortalSettings/categories/common/Customization/language-and-time-zone"
)
);
const WelcomePageSettings = React.lazy(() =>
import(
"./pages/PortalSettings/categories/common/Customization/welcome-page-settings"
)
);
const DNSSettings = React.lazy(() =>
import("./pages/PortalSettings/categories/common/Customization/dns-settings")
);
const PortalRenaming = React.lazy(() =>
import(
"./pages/PortalSettings/categories/common/Customization/portal-renaming"
)
);
const WhiteLabel = React.lazy(() =>
import("./pages/PortalSettings/categories/common/Branding/whitelabel")
);
const SecuritySettings = React.lazy(() =>
import("./pages/PortalSettings/categories/security/index.js")
);
const TfaPage = React.lazy(() =>
import("./pages/PortalSettings/categories/security/access-portal/tfa")
);
const PasswordStrengthPage = React.lazy(() =>
import(
"./pages/PortalSettings/categories/security/access-portal/passwordStrength"
)
);
const TrustedMailPage = React.lazy(() =>
import("./pages/PortalSettings/categories/security/access-portal/trustedMail")
);
const IpSecurityPage = React.lazy(() =>
import("./pages/PortalSettings/categories/security/access-portal/ipSecurity")
);
const AdminMessagePage = React.lazy(() =>
import(
"./pages/PortalSettings/categories/security/access-portal/adminMessage"
)
);
const SessionLifetimePage = React.lazy(() =>
import(
"./pages/PortalSettings/categories/security/access-portal/sessionLifetime"
)
);
const Integration = React.lazy(() =>
import("./pages/PortalSettings/categories/integration")
);
const Payments = React.lazy(() =>
import("./pages/PortalSettings/categories/payments")
);
const ThirdParty = React.lazy(() =>
import(
"./pages/PortalSettings/categories/integration/ThirdPartyServicesSettings"
)
);
const SingleSignOn = React.lazy(() =>
import("./pages/PortalSettings/categories/integration/SingleSignOn")
);
const DeveloperTools = React.lazy(() =>
import("./pages/PortalSettings/categories/developer-tools/index.js")
);
const Backup = React.lazy(() =>
import("./pages/PortalSettings/categories/data-management/index")
);
const DeleteDataPage = React.lazy(() =>
import("./pages/PortalSettings/categories/delete-data")
);
const RestoreBackup = React.lazy(() =>
import(
"./pages/PortalSettings/categories/data-management/backup/restore-backup/index"
)
);
const FormGallery = React.lazy(() => import("./pages/FormGallery"));
const About = React.lazy(() => import("./pages/About"));
const Wizard = React.lazy(() => import("./pages/Wizard"));
const PreparationPortal = React.lazy(() => import("./pages/PreparationPortal"));
const PortalUnavailable = React.lazy(() => import("./pages/PortalUnavailable"));
const ErrorUnavailable = React.lazy(() => import("./pages/Errors/Unavailable"));
const ActivateUserForm = React.lazy(() =>
import("./pages/Confirm/sub-components/activateUser")
);
const CreateUserForm = React.lazy(() =>
import("./pages/Confirm/sub-components/createUser")
);
const ChangePasswordForm = React.lazy(() =>
import("./pages/Confirm/sub-components/changePassword")
);
const ActivateEmailForm = React.lazy(() =>
import("./pages/Confirm/sub-components/activateEmail")
);
const ChangeEmailForm = React.lazy(() =>
import("./pages/Confirm/sub-components/changeEmail")
);
const ChangePhoneForm = React.lazy(() =>
import("./pages/Confirm/sub-components/changePhone")
);
const ProfileRemoveForm = React.lazy(() =>
import("./pages/Confirm/sub-components/profileRemove")
);
const ChangeOwnerForm = React.lazy(() =>
import("./pages/Confirm/sub-components/changeOwner")
);
const TfaAuthForm = React.lazy(() =>
import("./pages/Confirm/sub-components/tfaAuth")
);
const TfaActivationForm = React.lazy(() =>
import("./pages/Confirm/sub-components/tfaActivation")
);
const RemovePortal = React.lazy(() =>
import("./pages/Confirm/sub-components/removePortal")
);
const DeactivatePortal = React.lazy(() =>
import("./pages/Confirm/sub-components/deactivatePortal")
);
const ContinuePortal = React.lazy(() =>
import("./pages/Confirm/sub-components/continuePortal")
);
const Auth = React.lazy(() => import("./pages/Confirm/sub-components/auth"));
const Error404 = React.lazy(() => import("client/Error404"));
const Error401 = React.lazy(() => import("client/Error401"));
const confirmRoutes = [
{
path: "LinkInvite",
element: (
<ConfirmRoute forUnauthorized>
<CreateUserForm />
</ConfirmRoute>
),
},
{
path: "Activation",
element: (
<ConfirmRoute forUnauthorized>
<ActivateUserForm />
</ConfirmRoute>
),
},
{
path: "EmailActivation",
element: (
<ConfirmRoute>
<ActivateEmailForm />
</ConfirmRoute>
),
},
{
path: "EmailChange",
element: (
<ConfirmRoute>
<ChangeEmailForm />
</ConfirmRoute>
),
},
{
path: "PasswordChange",
element: (
<ConfirmRoute forUnauthorized>
<ChangePasswordForm />
</ConfirmRoute>
),
},
{
path: "ProfileRemove",
element: (
<ConfirmRoute>
<ProfileRemoveForm />
</ConfirmRoute>
),
},
{
path: "PhoneActivation",
element: (
<ConfirmRoute>
<ChangePhoneForm />
</ConfirmRoute>
),
},
{
path: "PortalOwnerChange",
element: (
<ConfirmRoute>
<ChangeOwnerForm />
</ConfirmRoute>
),
},
{
path: "TfaAuth",
element: (
<ConfirmRoute>
<TfaAuthForm />
</ConfirmRoute>
),
},
{
path: "TfaActivation",
element: (
<ConfirmRoute>
<TfaActivationForm />
</ConfirmRoute>
),
},
{
path: "PortalRemove",
element: (
<ConfirmRoute>
<RemovePortal />
</ConfirmRoute>
),
},
{
path: "PortalSuspend",
element: (
<ConfirmRoute>
<DeactivatePortal />
</ConfirmRoute>
),
},
{
path: "PortalContinue",
element: (
<ConfirmRoute>
<ContinuePortal />
</ConfirmRoute>
),
},
{
path: "Auth",
element: (
<ConfirmRoute forUnauthorized>
<Auth />
</ConfirmRoute>
),
},
];
const NotFoundError = () => {
return (
<PrivateRoute>
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Error404 />
</ErrorBoundary>
</React.Suspense>
</PrivateRoute>
);
};
const router = createBrowserRouter([
{
path: "/",
element: <Root />,
errorElement: <NotFoundError />,
children: [
{
path: "/",
element: (
<PrivateRoute>
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Client />
</ErrorBoundary>
</React.Suspense>
</PrivateRoute>
),
errorElement: <NotFoundError />,
children: [
{
index: true,
element: (
<PrivateRoute>
<Navigate to="/rooms/shared" replace />
</PrivateRoute>
),
},
{
path: "rooms",
element: (
<PrivateRoute>
<Navigate to="/rooms/shared" replace />
</PrivateRoute>
),
},
{
path: "rooms/personal/*",
element: (
<PrivateRoute restricted withManager withCollaborator>
<Home />
</PrivateRoute>
),
},
{
path: "files/trash/*",
element: (
<PrivateRoute restricted withManager withCollaborator>
<Home />
</PrivateRoute>
),
},
{
path: "rooms/shared/*",
element: (
<PrivateRoute>
<Home />
</PrivateRoute>
),
},
{
path: "rooms/archived/*",
element: (
<PrivateRoute>
<Home />
</PrivateRoute>
),
},
{
path: "products/files/",
element: (
<PrivateRoute>
<Home />
</PrivateRoute>
),
},
{
path: "accounts",
element: (
<PrivateRoute restricted withManager>
<Navigate to="/accounts/filter" replace />
</PrivateRoute>
),
},
{
path: "accounts/filter",
element: (
<PrivateRoute restricted withManager>
<AccountsHome />
</PrivateRoute>
),
},
{
path: "accounts/view/@self",
element: (
<PrivateRoute>
<Profile />
</PrivateRoute>
),
},
{
path: "accounts/view/@self/notification",
element: (
<PrivateRoute>
<NotificationComponent />
</PrivateRoute>
),
},
{
path: "settings",
element: (
<PrivateRoute withCollaborator restricted>
<Navigate to="/settings/common" replace />
</PrivateRoute>
),
},
{
path: "settings/common",
element: (
<PrivateRoute withCollaborator restricted>
<Settings />
</PrivateRoute>
),
},
{
path: "settings/admin",
element: (
<PrivateRoute withCollaborator restricted>
<Settings />
</PrivateRoute>
),
},
],
},
{
path: "/portal-settings/",
element: (
<PrivateRoute restricted>
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<PortalSettings />
</ErrorBoundary>
</React.Suspense>
</PrivateRoute>
),
errorElement: <NotFoundError />,
children: [
{
index: true,
element: <CustomizationSettings />,
},
{
path: "customization",
element: <CustomizationSettings />,
},
{
path: "customization/general/language-and-time-zone",
element: <LanguageAndTimeZoneSettings />,
},
{
path: "customization/general/welcome-page-settings",
element: <WelcomePageSettings />,
},
{
path: "customization/general/dns-settings",
element: <DNSSettings />,
},
{
path: "customization/general/portal-renaming",
element: <PortalRenaming />,
},
{
path: "common/whitelabel",
element: <WhiteLabel />,
},
{
path: "security/*",
element: <SecuritySettings />,
},
{
path: "security/access-portal",
element: <SecuritySettings />,
},
{
path: "security/access-portal/tfa",
element: <TfaPage />,
},
{
path: "security/access-portal/password",
element: <PasswordStrengthPage />,
},
{
path: "security/access-portal/trusted-mail",
element: <TrustedMailPage />,
},
{
path: "security/access-portal/ip",
element: <IpSecurityPage />,
},
{
path: "security/access-portal/admin-message",
element: <AdminMessagePage />,
},
{
path: "security/access-portal/lifetime",
element: <SessionLifetimePage />,
},
{
path: "integration/*",
element: <Integration />,
},
{
path: "integration/third-party-services",
element: <ThirdParty />,
},
{
path: "integration/single-sign-on",
element: <SingleSignOn />,
},
{
path: "payments/portal-payments",
element: <Payments />,
},
{
path: "developer/*",
element: <DeveloperTools />,
},
{
path: "backup/*",
element: <Backup />,
},
{
path: "delete-data/*",
element: <DeleteDataPage />,
},
{
path: "restore/*",
element: <RestoreBackup />,
},
],
},
{
path: "/Products/Files/",
caseSensitive: true,
element: <Navigate to="/rooms/shared" replace />,
},
{
path: "/form-gallery/:folderId",
element: (
<PrivateRoute>
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<FormGallery />
</ErrorBoundary>
</React.Suspense>
</PrivateRoute>
),
},
{
path: "/wizard",
element: (
<PublicRoute>
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Wizard />
</ErrorBoundary>
</React.Suspense>
</PublicRoute>
),
},
{
path: "/about",
element: (
<PrivateRoute>
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<About />
</ErrorBoundary>
</React.Suspense>
</PrivateRoute>
),
},
{
path: "/confirm.aspx/*",
element: (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Confirm />
</ErrorBoundary>
</React.Suspense>
),
errorElement: <NotFoundError />,
children: [...confirmRoutes],
},
{
path: "/confirm/*",
element: (
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Confirm />
</ErrorBoundary>
</React.Suspense>
),
errorElement: <NotFoundError />,
children: [...confirmRoutes],
},
{
path: "/portal-unavailable",
element: (
<PrivateRoute>
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<PortalUnavailable />
</ErrorBoundary>
</React.Suspense>
</PrivateRoute>
),
},
{
path: "/unavailable",
element: (
<PrivateRoute>
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<ErrorUnavailable />
</ErrorBoundary>
</React.Suspense>
</PrivateRoute>
),
},
{
path: "/preparation-portal",
element: (
<PublicRoute>
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<PreparationPortal />
</ErrorBoundary>
</React.Suspense>
</PublicRoute>
),
},
{
path: "/error401",
element: (
<PrivateRoute>
<React.Suspense fallback={<AppLoader />}>
<ErrorBoundary>
<Error401 />
</ErrorBoundary>
</React.Suspense>
</PrivateRoute>
),
},
],
},
]);
export default router;