diff --git a/packages/core/src/renderer/bootstrap.tsx b/packages/core/src/renderer/bootstrap.tsx index 2bc726331a..c897c7a2de 100644 --- a/packages/core/src/renderer/bootstrap.tsx +++ b/packages/core/src/renderer/bootstrap.tsx @@ -10,7 +10,6 @@ import { render } from "react-dom"; import { DefaultProps } from "./mui-base-theme"; import { DiContextProvider } from "@ogre-tools/injectable-react"; import type { DiContainer } from "@ogre-tools/injectable"; -import initRootFrameInjectable from "./frames/root-frame/init-root-frame.injectable"; import { Router } from "react-router"; import historyInjectable from "./navigation/history.injectable"; import startFrameInjectable from "./start-frame/start-frame.injectable"; @@ -23,20 +22,6 @@ export async function bootstrap(di: DiContainer) { await startFrame(); - try { - // TODO: Introduce proper architectural boundaries between root and cluster iframes - if (process.isMainFrame) { - const initRootFrame = di.inject(initRootFrameInjectable); - - await initRootFrame(); - } - } catch (error) { - console.error(`[BOOTSTRAP]: view initialization error: ${error}`, { - origin: location.href, - isTopFrameView: process.isMainFrame, - }); - } - const App = process.isMainFrame ? RootFrame : ClusterFrame; diff --git a/packages/core/src/renderer/frames/root-frame/on-main-frame-close.global-override-for-injectable.ts b/packages/core/src/renderer/frames/root-frame/on-main-frame-close.global-override-for-injectable.ts new file mode 100644 index 0000000000..9c07167933 --- /dev/null +++ b/packages/core/src/renderer/frames/root-frame/on-main-frame-close.global-override-for-injectable.ts @@ -0,0 +1,10 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getGlobalOverride } from "../../../common/test-utils/get-global-override"; +import { noop } from "../../utils"; +import handleOnMainFrameCloseInjectable from "./on-main-frame-close.injectable"; + +export default getGlobalOverride(handleOnMainFrameCloseInjectable, () => noop); diff --git a/packages/core/src/renderer/frames/root-frame/init-root-frame.injectable.ts b/packages/core/src/renderer/frames/root-frame/on-main-frame-close.injectable.ts similarity index 78% rename from packages/core/src/renderer/frames/root-frame/init-root-frame.injectable.ts rename to packages/core/src/renderer/frames/root-frame/on-main-frame-close.injectable.ts index 5eb0f864c1..9d021257b4 100644 --- a/packages/core/src/renderer/frames/root-frame/init-root-frame.injectable.ts +++ b/packages/core/src/renderer/frames/root-frame/on-main-frame-close.injectable.ts @@ -6,19 +6,20 @@ import { getInjectable } from "@ogre-tools/injectable"; import loggerInjectable from "../../../common/logger.injectable"; import unmountRootComponentInjectable from "../../window/unmount-root-component.injectable"; -const initRootFrameInjectable = getInjectable({ - id: "init-root-frame", +const handleOnMainFrameCloseInjectable = getInjectable({ + id: "handle-on-main-frame-close", instantiate: (di) => { const logger = di.inject(loggerInjectable); const unmountRootComponent = di.inject(unmountRootComponentInjectable); - return async () => { + return () => { window.addEventListener("beforeunload", () => { logger.info("[ROOT-FRAME]: Unload app"); unmountRootComponent(); }); }; }, + causesSideEffects: true, }); -export default initRootFrameInjectable; +export default handleOnMainFrameCloseInjectable; diff --git a/packages/core/src/renderer/frames/root-frame/setup-unload-event.injectable.ts b/packages/core/src/renderer/frames/root-frame/setup-unload-event.injectable.ts new file mode 100644 index 0000000000..6eba2212ba --- /dev/null +++ b/packages/core/src/renderer/frames/root-frame/setup-unload-event.injectable.ts @@ -0,0 +1,22 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { beforeMainFrameStartsSecondInjectionToken } from "../../before-frame-starts/tokens"; +import handleOnMainFrameCloseInjectable from "./on-main-frame-close.injectable"; + +const setupUnloadEventHandlerInjectable = getInjectable({ + id: "setup-unload-event-handler", + instantiate: (di) => ({ + id: "setup-unload-event-handler", + run: () => { + const handleOnMainFrameClose = di.inject(handleOnMainFrameCloseInjectable); + + handleOnMainFrameClose(); + }, + }), + injectionToken: beforeMainFrameStartsSecondInjectionToken, +}); + +export default setupUnloadEventHandlerInjectable;