diff --git a/packages/client/src/Shell.jsx b/packages/client/src/Shell.jsx index bf0165745d..4de18fa557 100644 --- a/packages/client/src/Shell.jsx +++ b/packages/client/src/Shell.jsx @@ -43,6 +43,7 @@ import { DeviceType, IndexedDBStores } from "@docspace/shared/enums"; import indexedDbHelper from "@docspace/shared/utils/indexedDBHelper"; import { useThemeDetector } from "@docspace/shared/hooks/useThemeDetector"; import { sendToastReport } from "@docspace/shared/utils/crashReport"; +import { combineUrl } from "@docspace/shared/utils/combineUrl"; import config from "PACKAGE_FILE"; @@ -77,6 +78,7 @@ const Shell = ({ items = [], page = "home", ...rest }) => { userTheme, //user, userId, + userLoginEventId, currentDeviceType, timezone, showArticleLoader, @@ -134,6 +136,7 @@ const Shell = ({ items = [], page = "home", ...rest }) => { command: "subscribe", data: { roomParts: "backup-restore" }, }); + socketHelper.on("restore-backup", () => { getRestoreProgress() .then((response) => { @@ -159,7 +162,22 @@ const Shell = ({ items = [], page = "home", ...rest }) => { command: "subscribe", data: { roomParts: "QUOTA", individual: true }, }); - }, [socketHelper]); + + socketHelper.emit({ + command: "subscribe", + data: { roomParts: "66faa6e4-f133-11ea-b126-00ffeec8b4ef" }, + }); + + socketHelper.on("s:logout-session", (loginEventId) => { + console.log(`[WS] "logout-session"`, loginEventId, userLoginEventId); + + if (userLoginEventId === loginEventId) { + window.location.replace( + combineUrl(window.ClientConfig?.proxy?.url, "/login"), + ); + } + }); + }, [socketHelper, userLoginEventId, setPreparationPortalDialogVisible]); const { t, ready } = useTranslation(["Common"]); //TODO: if enable banner ["Common", "SmartBanner"] @@ -533,6 +551,7 @@ const ShellWrapper = inject( setSnackbarExist, userTheme: isFrame ? frameConfig?.theme : userTheme, userId: userStore?.user?.id, + userLoginEventId: userStore?.user?.loginEventId, currentDeviceType, showArticleLoader: clientLoadingStore.showArticleLoader, setPortalTariff, diff --git a/packages/doceditor/src/components/Root.tsx b/packages/doceditor/src/components/Root.tsx index 7928e29e0e..378b9aac04 100644 --- a/packages/doceditor/src/components/Root.tsx +++ b/packages/doceditor/src/components/Root.tsx @@ -103,6 +103,7 @@ const Root = ({ const { filesSettings } = useFilesSettings({}); const { socketHelper } = useSocketHelper({ socketUrl: user ? settings?.socketUrl ?? "" : "", + user, }); const { onSDKRequestSaveAs, diff --git a/packages/doceditor/src/hooks/useSocketHelper.ts b/packages/doceditor/src/hooks/useSocketHelper.ts index 048796ead8..dbf4caad4e 100644 --- a/packages/doceditor/src/hooks/useSocketHelper.ts +++ b/packages/doceditor/src/hooks/useSocketHelper.ts @@ -29,12 +29,14 @@ import React from "react"; import SocketIOHelper from "@docspace/shared/utils/socket"; +import { combineUrl } from "@docspace/shared/utils/combineUrl"; import { getRestoreProgress } from "@docspace/shared/api/portal"; +import { getUser } from "@docspace/shared/api/people"; import { EDITOR_ID } from "@docspace/shared/constants"; import { UseSocketHelperProps } from "@/types"; -const useSocketHelper = ({ socketUrl }: UseSocketHelperProps) => { +const useSocketHelper = ({ socketUrl, user }: UseSocketHelperProps) => { const [socketHelper, setSocketHelper] = React.useState( null, ); @@ -48,6 +50,11 @@ const useSocketHelper = ({ socketUrl }: UseSocketHelperProps) => { data: { roomParts: "backup-restore" }, }); + socketIOHelper.emit({ + command: "subscribe", + data: { roomParts: user?.id || "" }, + }); + socketIOHelper.on("restore-backup", async () => { try { const response = await getRestoreProgress(); @@ -69,6 +76,21 @@ const useSocketHelper = ({ socketUrl }: UseSocketHelperProps) => { } }); + socketIOHelper.on("s:logout-session", async (loginEventId) => { + console.log(`[WS] "logout-session"`, loginEventId, user?.loginEventId); + + if (Number(loginEventId) === user?.loginEventId) { + const docEditor = + typeof window !== "undefined" && + window.DocEditor?.instances[EDITOR_ID]; + + docEditor?.requestClose(); + window.location.replace( + combineUrl(window.ClientConfig?.proxy?.url, "/login"), + ); + } + }); + setSocketHelper(socketIOHelper); }, [socketHelper, socketUrl]); @@ -76,4 +98,3 @@ const useSocketHelper = ({ socketUrl }: UseSocketHelperProps) => { }; export default useSocketHelper; - diff --git a/packages/doceditor/src/types/index.ts b/packages/doceditor/src/types/index.ts index 1446d3e59a..739282d2e6 100644 --- a/packages/doceditor/src/types/index.ts +++ b/packages/doceditor/src/types/index.ts @@ -334,6 +334,7 @@ export interface SelectFileDialogProps { export interface UseSocketHelperProps { socketUrl: string; + user?: TUser; } export interface UseEventsProps {