Merge branch 'feature/workspaces' of https://github.com/ONLYOFFICE/AppServer into feature/workspaces
This commit is contained in:
commit
ad913d34cb
@ -56,69 +56,84 @@ class ModuleStore {
|
||||
iconName = null,
|
||||
iconUrl = null
|
||||
) => {
|
||||
switch (item.id) {
|
||||
case "6743007c-6f95-4d20-8c88-a8601ce5e76d":
|
||||
item.iconName = "CrmIcon";
|
||||
item.iconUrl = "/static/images/crm.react.svg";
|
||||
item.imageUrl = "/images/crm.svg";
|
||||
item.helpUrl = "https://helpcenter.onlyoffice.com/userguides/crm.aspx";
|
||||
break;
|
||||
case "1e044602-43b5-4d79-82f3-fd6208a11960":
|
||||
item.iconName = "ProjectsIcon";
|
||||
item.iconUrl = "/static/images/projects.react.svg";
|
||||
item.imageUrl = "/images/projects.svg";
|
||||
item.helpUrl =
|
||||
"https://helpcenter.onlyoffice.com/userguides/projects.aspx";
|
||||
break;
|
||||
case "2A923037-8B2D-487b-9A22-5AC0918ACF3F":
|
||||
item.iconName = "MailIcon";
|
||||
item.iconUrl = "/static/images/mail.react.svg";
|
||||
item.imageUrl = "/images/mail.svg";
|
||||
break;
|
||||
case "32D24CB5-7ECE-4606-9C94-19216BA42086":
|
||||
item.iconName = "CalendarCheckedIcon";
|
||||
item.iconUrl = "/static/images/calendar.checked.react.svg";
|
||||
item.imageUrl = "/images/calendar.svg";
|
||||
break;
|
||||
case "BF88953E-3C43-4850-A3FB-B1E43AD53A3E":
|
||||
item.iconName = "ChatIcon";
|
||||
item.iconUrl = "/static/images/chat.react.svg";
|
||||
item.imageUrl = "/images/talk.svg";
|
||||
item.isolateMode = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
const id =
|
||||
item.id && typeof item.id === "string" ? item.id.toLowerCase() : null;
|
||||
|
||||
const actions = noAction
|
||||
? null
|
||||
: {
|
||||
onClick: (e) => {
|
||||
if (e) {
|
||||
window.open(item.link, "_self");
|
||||
e.preventDefault();
|
||||
}
|
||||
},
|
||||
onBadgeClick: (e) => console.log(iconName + " Badge Clicked", e),
|
||||
};
|
||||
|
||||
const description = noAction ? { description: item.description } : null;
|
||||
|
||||
return {
|
||||
id: item.id,
|
||||
const result = {
|
||||
id,
|
||||
appName: "none",
|
||||
title: item.title,
|
||||
link: item.link,
|
||||
originUrl: item.originUrl,
|
||||
helpUrl: item.helpUrl,
|
||||
notifications: 0,
|
||||
iconName: item.iconName || iconName || "/static/images/people.react.svg", //TODO: Change to URL
|
||||
iconUrl: item.iconUrl || iconUrl,
|
||||
imageUrl: item.imageUrl,
|
||||
notifications: 0,
|
||||
isolateMode: item.isolateMode,
|
||||
isPrimary: item.isPrimary,
|
||||
...description,
|
||||
...actions,
|
||||
};
|
||||
|
||||
switch (id) {
|
||||
case "6743007c-6f95-4d20-8c88-a8601ce5e76d":
|
||||
result.appName = "crm";
|
||||
result.iconName = "CrmIcon";
|
||||
result.iconUrl = "/static/images/crm.react.svg";
|
||||
result.imageUrl = "/images/crm.svg";
|
||||
result.helpUrl =
|
||||
"https://helpcenter.onlyoffice.com/userguides/crm.aspx";
|
||||
break;
|
||||
case "1e044602-43b5-4d79-82f3-fd6208a11960":
|
||||
result.appName = "projects";
|
||||
result.iconName = "ProjectsIcon";
|
||||
result.iconUrl = "/static/images/projects.react.svg";
|
||||
result.imageUrl = "/images/projects.svg";
|
||||
result.helpUrl =
|
||||
"https://helpcenter.onlyoffice.com/userguides/projects.aspx";
|
||||
break;
|
||||
case "2a923037-8b2d-487b-9a22-5ac0918acf3f":
|
||||
result.appName = "mail";
|
||||
result.iconName = "MailIcon";
|
||||
result.iconUrl = "/static/images/mail.react.svg";
|
||||
result.imageUrl = "/images/mail.svg";
|
||||
break;
|
||||
case "32d24cb5-7ece-4606-9c94-19216ba42086":
|
||||
result.appName = "calendar";
|
||||
result.iconName = "CalendarCheckedIcon";
|
||||
result.iconUrl = "/static/images/calendar.checked.react.svg";
|
||||
result.imageUrl = "/images/calendar.svg";
|
||||
break;
|
||||
case "bf88953e-3c43-4850-a3fb-b1e43ad53a3e":
|
||||
result.appName = "chat";
|
||||
result.iconName = "ChatIcon";
|
||||
result.iconUrl = "/static/images/chat.react.svg";
|
||||
result.imageUrl = "/images/talk.svg";
|
||||
result.isolateMode = true;
|
||||
break;
|
||||
case "e67be73d-f9ae-4ce1-8fec-1880cb518cb4":
|
||||
result.appName = "files";
|
||||
break;
|
||||
case "f4d98afd-d336-4332-8778-3c6945c81ea0":
|
||||
result.appName = "people";
|
||||
break;
|
||||
default:
|
||||
result.appName = "none";
|
||||
break;
|
||||
}
|
||||
|
||||
if (!noAction) {
|
||||
result.onClick = (e) => {
|
||||
if (e) {
|
||||
window.open(item.link, "_self");
|
||||
e.preventDefault();
|
||||
}
|
||||
};
|
||||
result.onBadgeClick = (e) => console.log(iconName + " Badge Clicked", e);
|
||||
} else {
|
||||
result.description = item.description;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
get totalNotificationsCount() {
|
||||
|
@ -1,7 +1,6 @@
|
||||
import React from "react";
|
||||
import PropTypes from "prop-types";
|
||||
import { ReactSVG } from "react-svg";
|
||||
import { Icons } from "../icons";
|
||||
import { handleAnyClick } from "../utils/event";
|
||||
import Text from "../text";
|
||||
import {
|
||||
@ -16,7 +15,6 @@ class MainButton extends React.PureComponent {
|
||||
super(props);
|
||||
|
||||
this.ref = React.createRef();
|
||||
this.iconNames = Object.keys(Icons);
|
||||
|
||||
this.state = {
|
||||
isOpen: props.opened,
|
||||
@ -96,13 +94,7 @@ class MainButton extends React.PureComponent {
|
||||
{...this.props}
|
||||
onClick={this.onSecondaryButtonClick}
|
||||
>
|
||||
{this.iconNames.includes(this.props.iconName) && (
|
||||
// React.createElement(Icons[this.props.iconName], {
|
||||
// size: "medium",
|
||||
// color: "#ffffff",
|
||||
// })}
|
||||
<ReactSVG src={this.props.iconName} />
|
||||
)}
|
||||
{this.props.iconName && <ReactSVG src={this.props.iconName} />}
|
||||
</StyledSecondaryButton>
|
||||
)}
|
||||
</GroupMainButton>
|
||||
|
@ -1,5 +1,4 @@
|
||||
import React, { useEffect } from "react";
|
||||
import styled from "styled-components";
|
||||
import { Router, Switch } from "react-router-dom";
|
||||
import { inject, observer } from "mobx-react";
|
||||
import NavMenu from "./components/NavMenu";
|
||||
@ -12,9 +11,6 @@ import Layout from "./components/Layout";
|
||||
import ScrollToTop from "./components/Layout/ScrollToTop";
|
||||
import history from "@appserver/common/history";
|
||||
import toastr from "studio/toastr";
|
||||
import Loader from "@appserver/components/loader";
|
||||
import Grid from "@appserver/components/grid";
|
||||
import PageLayout from "@appserver/common/components/PageLayout";
|
||||
import { updateTempContent } from "@appserver/common/utils";
|
||||
import { Provider as MobxProvider } from "mobx-react";
|
||||
import ThemeProvider from "@appserver/components/theme-provider";
|
||||
@ -24,35 +20,27 @@ import config from "../package.json";
|
||||
import "./custom.scss";
|
||||
import { I18nextProvider } from "react-i18next";
|
||||
import i18n from "./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 People = React.lazy(() => import("people/app"));
|
||||
const Files = React.lazy(() => import("files/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 LoadingShell = () => (
|
||||
<PageLayout>
|
||||
<PageLayout.SectionBody>
|
||||
<Loader className="pageLoader" type="rombs" size="40px" />
|
||||
</PageLayout.SectionBody>
|
||||
</PageLayout>
|
||||
);
|
||||
|
||||
const SettingsRoute = (props) => (
|
||||
<React.Suspense fallback={<LoadingShell />}>
|
||||
<React.Suspense fallback={<AppLoader />}>
|
||||
<ErrorBoundary>
|
||||
<Settings {...props} />
|
||||
</ErrorBoundary>
|
||||
</React.Suspense>
|
||||
);
|
||||
const PaymentsRoute = (props) => (
|
||||
<React.Suspense fallback={<LoadingShell />}>
|
||||
<React.Suspense fallback={<AppLoader />}>
|
||||
<ErrorBoundary>
|
||||
<Payments {...props} />
|
||||
</ErrorBoundary>
|
||||
@ -60,7 +48,7 @@ const PaymentsRoute = (props) => (
|
||||
);
|
||||
|
||||
const Error404Route = (props) => (
|
||||
<React.Suspense fallback={<LoadingShell />}>
|
||||
<React.Suspense fallback={<AppLoader />}>
|
||||
<ErrorBoundary>
|
||||
<Error404 {...props} />
|
||||
</ErrorBoundary>
|
||||
@ -68,14 +56,14 @@ const Error404Route = (props) => (
|
||||
);
|
||||
|
||||
const Error401Route = (props) => (
|
||||
<React.Suspense fallback={<LoadingShell />}>
|
||||
<React.Suspense fallback={<AppLoader />}>
|
||||
<ErrorBoundary>
|
||||
<Error401 {...props} />
|
||||
</ErrorBoundary>
|
||||
</React.Suspense>
|
||||
);
|
||||
const HomeRoute = (props) => (
|
||||
<React.Suspense fallback={<LoadingShell />}>
|
||||
<React.Suspense fallback={<AppLoader />}>
|
||||
<ErrorBoundary>
|
||||
<Home {...props} />
|
||||
</ErrorBoundary>
|
||||
@ -83,35 +71,15 @@ const HomeRoute = (props) => (
|
||||
);
|
||||
|
||||
const LoginRoute = (props) => (
|
||||
<React.Suspense fallback={<LoadingShell />}>
|
||||
<React.Suspense fallback={<AppLoader />}>
|
||||
<ErrorBoundary>
|
||||
<Login {...props} />
|
||||
</ErrorBoundary>
|
||||
</React.Suspense>
|
||||
);
|
||||
|
||||
const PeopleRoute = (props) => {
|
||||
return (
|
||||
<React.Suspense fallback={<LoadingShell />}>
|
||||
<ErrorBoundary>
|
||||
<People {...props} />
|
||||
</ErrorBoundary>
|
||||
</React.Suspense>
|
||||
);
|
||||
};
|
||||
|
||||
const FilesRoute = (props) => {
|
||||
return (
|
||||
<React.Suspense fallback={<LoadingShell />}>
|
||||
<ErrorBoundary>
|
||||
<Files {...props} />
|
||||
</ErrorBoundary>
|
||||
</React.Suspense>
|
||||
);
|
||||
};
|
||||
|
||||
const AboutRoute = (props) => (
|
||||
<React.Suspense fallback={<LoadingShell />}>
|
||||
<React.Suspense fallback={<AppLoader />}>
|
||||
<ErrorBoundary>
|
||||
<About {...props} />
|
||||
</ErrorBoundary>
|
||||
@ -119,12 +87,28 @@ const AboutRoute = (props) => (
|
||||
);
|
||||
|
||||
const ComingSoonRoute = (props) => (
|
||||
<React.Suspense fallback={<LoadingShell />}>
|
||||
<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();
|
||||
@ -160,7 +144,7 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
|
||||
// .catch((err) => toastr.error(err.message));
|
||||
// }, []);
|
||||
|
||||
const { isLoaded, loadBaseInfo, isThirdPartyResponse } = rest;
|
||||
const { isLoaded, loadBaseInfo, isThirdPartyResponse, modules } = rest;
|
||||
|
||||
useEffect(() => {
|
||||
try {
|
||||
@ -168,7 +152,7 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
|
||||
} catch (err) {
|
||||
toastr.error(err);
|
||||
}
|
||||
}, [loadBaseInfo]);
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
if (isLoaded) updateTempContent();
|
||||
@ -182,6 +166,16 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
|
||||
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}>
|
||||
@ -195,14 +189,6 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
|
||||
path={["/", "/error=:error"]}
|
||||
component={HomeRoute}
|
||||
/>
|
||||
<PrivateRoute
|
||||
path={["/products/people", "/products/people/filter"]}
|
||||
component={PeopleRoute}
|
||||
/>
|
||||
<PrivateRoute
|
||||
path={["/products/files", "/products/files/filter"]}
|
||||
component={FilesRoute}
|
||||
/>
|
||||
<PrivateRoute path={["/about"]} component={AboutRoute} />
|
||||
<PublicRoute
|
||||
exact
|
||||
@ -231,6 +217,7 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
|
||||
path="/settings"
|
||||
component={SettingsRoute}
|
||||
/>
|
||||
{dynamicRoutes}
|
||||
<PrivateRoute path="/error401" component={Error401Route} />
|
||||
<PrivateRoute component={Error404Route} />
|
||||
</Switch>
|
||||
@ -243,7 +230,6 @@ const Shell = ({ items = [], page = "home", ...rest }) => {
|
||||
|
||||
const ShellWrapper = inject(({ auth }) => {
|
||||
const { init, isLoaded } = auth;
|
||||
|
||||
const pathname = window.location.pathname.toLowerCase();
|
||||
const isThirdPartyResponse = pathname.indexOf("thirdparty") !== -1;
|
||||
|
||||
@ -254,6 +240,7 @@ const ShellWrapper = inject(({ auth }) => {
|
||||
},
|
||||
isThirdPartyResponse,
|
||||
isLoaded,
|
||||
modules: auth.moduleStore.modules,
|
||||
};
|
||||
})(observer(Shell));
|
||||
|
||||
@ -261,7 +248,7 @@ export default () => (
|
||||
<ThemeProvider theme={Base}>
|
||||
<MobxProvider {...store}>
|
||||
<I18nextProvider i18n={i18n}>
|
||||
<ShellWrapper />
|
||||
<ShellWrapper />
|
||||
</I18nextProvider>
|
||||
</MobxProvider>
|
||||
</ThemeProvider>
|
||||
|
13
web/ASC.Web.Client/src/components/AppLoader/index.js
Normal file
13
web/ASC.Web.Client/src/components/AppLoader/index.js
Normal file
@ -0,0 +1,13 @@
|
||||
import React from "react";
|
||||
import PageLayout from "@appserver/common/components/PageLayout";
|
||||
import Loader from "@appserver/components/loader";
|
||||
|
||||
const AppLoader = () => (
|
||||
<PageLayout>
|
||||
<PageLayout.SectionBody>
|
||||
<Loader className="pageLoader" type="rombs" size="40px" />
|
||||
</PageLayout.SectionBody>
|
||||
</PageLayout>
|
||||
);
|
||||
|
||||
export default AppLoader;
|
107
web/ASC.Web.Client/src/components/System/index.js
Normal file
107
web/ASC.Web.Client/src/components/System/index.js
Normal file
@ -0,0 +1,107 @@
|
||||
import React from "react";
|
||||
import AppLoader from "../AppLoader";
|
||||
import ErrorBoundary from "@appserver/common/components/ErrorBoundary";
|
||||
import Error520 from "studio/Error520";
|
||||
import Error404 from "studio/Error404";
|
||||
|
||||
function loadComponent(scope, module) {
|
||||
return async () => {
|
||||
// Initializes the share scope. This fills it with known provided modules from this build and all remotes
|
||||
await __webpack_init_sharing__("default");
|
||||
const container = window[scope]; // or get the container somewhere else
|
||||
// Initialize the container, it may provide shared modules
|
||||
await container.init(__webpack_share_scopes__.default);
|
||||
const factory = await window[scope].get(module);
|
||||
const Module = factory();
|
||||
return Module;
|
||||
};
|
||||
}
|
||||
|
||||
const useDynamicScript = (args) => {
|
||||
const [ready, setReady] = React.useState(false);
|
||||
const [failed, setFailed] = React.useState(false);
|
||||
|
||||
React.useEffect(() => {
|
||||
if (!args.url) {
|
||||
return;
|
||||
}
|
||||
|
||||
const exists = document.getElementById(args.id);
|
||||
|
||||
if (exists) {
|
||||
setReady(true);
|
||||
setFailed(false);
|
||||
return;
|
||||
}
|
||||
|
||||
const element = document.createElement("script");
|
||||
|
||||
element.id = args.id;
|
||||
element.src = args.url;
|
||||
element.type = "text/javascript";
|
||||
element.async = true;
|
||||
|
||||
setReady(false);
|
||||
setFailed(false);
|
||||
|
||||
element.onload = () => {
|
||||
console.log(`Dynamic Script Loaded: ${args.url}`);
|
||||
setReady(true);
|
||||
};
|
||||
|
||||
element.onerror = () => {
|
||||
console.error(`Dynamic Script Error: ${args.url}`);
|
||||
setReady(false);
|
||||
setFailed(true);
|
||||
};
|
||||
|
||||
document.head.appendChild(element);
|
||||
|
||||
//TODO: Uncomment if you need to remove loaded remoteEntry
|
||||
// return () => {
|
||||
// console.log(`Dynamic Script Removed: ${args.url}`);
|
||||
// document.head.removeChild(element);
|
||||
// };
|
||||
}, [args.url]);
|
||||
|
||||
return {
|
||||
ready,
|
||||
failed,
|
||||
};
|
||||
};
|
||||
|
||||
const System = (props) => {
|
||||
const { ready, failed } = useDynamicScript({
|
||||
url: props.system && props.system.url,
|
||||
id: props.system && props.system.scope,
|
||||
});
|
||||
|
||||
if (!props.system) {
|
||||
console.log(`Not system specified`);
|
||||
return <Error404 />;
|
||||
}
|
||||
|
||||
if (!ready) {
|
||||
console.log(`Loading dynamic script: ${props.system.url}`);
|
||||
return <AppLoader />;
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
console.log(`Failed to load dynamic script: ${props.system.url}`);
|
||||
return <Error520 />;
|
||||
}
|
||||
|
||||
const Component = React.lazy(
|
||||
loadComponent(props.system.scope, props.system.module)
|
||||
);
|
||||
|
||||
return (
|
||||
<React.Suspense fallback={<AppLoader />}>
|
||||
<ErrorBoundary>
|
||||
<Component />
|
||||
</ErrorBoundary>
|
||||
</React.Suspense>
|
||||
);
|
||||
};
|
||||
|
||||
export default System;
|
@ -126,8 +126,6 @@ const config = {
|
||||
filename: "remoteEntry.js",
|
||||
remotes: {
|
||||
studio: `studio@${homepage}/remoteEntry.js`,
|
||||
people: `people@${homepage}/products/people/remoteEntry.js`,
|
||||
files: `files@${homepage}/products/files/remoteEntry.js`,
|
||||
login: `login@${homepage}/login/remoteEntry.js`,
|
||||
},
|
||||
exposes: {
|
||||
|
36
yarn.lock
36
yarn.lock
@ -5778,9 +5778,9 @@ can-use-dom@^0.1.0:
|
||||
integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo=
|
||||
|
||||
caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001181:
|
||||
version "1.0.30001198"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001198.tgz#ed2d9b5f060322ba2efa42afdc56dee3255473f4"
|
||||
integrity sha512-r5GGgESqOPZzwvdLVER374FpQu2WluCF1Z2DSiFJ89KSmGjT0LVKjgv4NcAqHmGWF9ihNpqRI9KXO9Ex4sKsgA==
|
||||
version "1.0.30001199"
|
||||
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001199.tgz#062afccaad21023e2e647d767bac4274b8b8fd7f"
|
||||
integrity sha512-ifbK2eChUCFUwGhlEzIoVwzFt1+iriSjyKKFYNfv6hN34483wyWpLLavYQXhnR036LhkdUYaSDpHg1El++VgHQ==
|
||||
|
||||
capture-exit@^2.0.0:
|
||||
version "2.0.0"
|
||||
@ -7428,9 +7428,9 @@ ejs@^3.1.2:
|
||||
jake "^10.6.1"
|
||||
|
||||
electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.649:
|
||||
version "1.3.685"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.685.tgz#f636d17c9c232c925f8bbfbff4f86303da091ff9"
|
||||
integrity sha512-C3oFZNkJ8lz85ADqr3hzpjBc2ciejMRN2SCd/D0hwcqpr6MGxfdN/j89VN6l+ERTuCUvhg0VYsf40Q4qTz4bhQ==
|
||||
version "1.3.687"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.687.tgz#c336184b7ab70427ffe2ee79eaeaedbc1ad8c374"
|
||||
integrity sha512-IpzksdQNl3wdgkzf7dnA7/v10w0Utf1dF2L+B4+gKrloBrxCut+au+kky3PYvle3RMdSxZP+UiCZtLbcYRxSNQ==
|
||||
|
||||
element-resize-detector@^1.2.1:
|
||||
version "1.2.2"
|
||||
@ -12219,9 +12219,9 @@ node-modules-regexp@^1.0.0:
|
||||
integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
|
||||
|
||||
node-notifier@^5.4.2:
|
||||
version "5.4.3"
|
||||
resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50"
|
||||
integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==
|
||||
version "5.4.5"
|
||||
resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.5.tgz#0cbc1a2b0f658493b4025775a13ad938e96091ef"
|
||||
integrity sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==
|
||||
dependencies:
|
||||
growly "^1.3.0"
|
||||
is-wsl "^1.1.0"
|
||||
@ -13758,9 +13758,9 @@ react-dev-utils@^11.0.3:
|
||||
text-table "0.2.0"
|
||||
|
||||
react-device-detect@^1.14.0, react-device-detect@^1.15.0:
|
||||
version "1.16.0"
|
||||
resolved "https://registry.yarnpkg.com/react-device-detect/-/react-device-detect-1.16.0.tgz#59fe791cc09e88bf9d4fcdea2d14e96dd7c71c2b"
|
||||
integrity sha512-PWyN13MEdRIiFoHnKir/wkkfWVFMFYhKA3JYg9Hy4xezK4VvMQQ1aSyCTFJhGKNS69kn3GepCvLjuQoI7Okjjg==
|
||||
version "1.17.0"
|
||||
resolved "https://registry.yarnpkg.com/react-device-detect/-/react-device-detect-1.17.0.tgz#a00b4fd6880cebfab3fd8a42a79dc0290cdddca9"
|
||||
integrity sha512-bBblIStwpHmoS281JFIVqeimcN3LhpoP5YKDWzxQdBIUP8S2xPvHDgizLDhUq2ScguLfVPmwfF5y268EEQR60w==
|
||||
dependencies:
|
||||
ua-parser-js "^0.7.24"
|
||||
|
||||
@ -13886,9 +13886,9 @@ react-hotkeys@2.0.0:
|
||||
prop-types "^15.6.1"
|
||||
|
||||
react-i18next@^11.7.3, react-i18next@^11.8.8:
|
||||
version "11.8.9"
|
||||
resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.8.9.tgz#188039708f99a6114b4437f0e620bf99a6c3c7dd"
|
||||
integrity sha512-HVW4/KtBvXcnzkYeS32IqdGBJJ1fksvqVDnnspsyruO99fhHQaAw1vTSrRpcNE5D8vrOu7B9c6sawfmQJ6OWRg==
|
||||
version "11.8.10"
|
||||
resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.8.10.tgz#aa64bc20410ee8f660a5b918d53f4e41271edf00"
|
||||
integrity sha512-ckjNzMjYkmx4fQ8zzuaYTosYN3Co6ebrgCQJzuZCcGFYSR/kGHZzSu0xw9VhtnbjJVKx0gEMV3DLRvzi4xDZUw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.13.6"
|
||||
html-parse-stringify2 "^2.0.1"
|
||||
@ -16554,9 +16554,9 @@ uglify-js@3.4.x:
|
||||
source-map "~0.6.1"
|
||||
|
||||
uglify-js@^3.1.4:
|
||||
version "3.13.0"
|
||||
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.0.tgz#66ed69f7241f33f13531d3d51d5bcebf00df7f69"
|
||||
integrity sha512-TWYSWa9T2pPN4DIJYbU9oAjQx+5qdV5RUDxwARg8fmJZrD/V27Zj0JngW5xg1DFz42G0uDYl2XhzF6alSzD62w==
|
||||
version "3.13.1"
|
||||
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.1.tgz#2749d4b8b5b7d67460b4a418023ff73c3fefa60a"
|
||||
integrity sha512-EWhx3fHy3M9JbaeTnO+rEqzCe1wtyQClv6q3YWq0voOj4E+bMZBErVS1GAHPDiRGONYq34M1/d8KuQMgvi6Gjw==
|
||||
|
||||
uid-number@0.0.6:
|
||||
version "0.0.6"
|
||||
|
Loading…
Reference in New Issue
Block a user