From c1d9e9b8991675010a3dca99d48817f83d348dbc Mon Sep 17 00:00:00 2001 From: Sami Tiilikainen <97873007+samitiilikainen@users.noreply.github.com> Date: Mon, 20 Mar 2023 10:11:18 +0200 Subject: [PATCH] Extract beforeunload listener to injectable Signed-off-by: Sami Tiilikainen <97873007+samitiilikainen@users.noreply.github.com> --- .../runnables/listen-unload.injectable.ts | 46 +++++++++++++++++++ packages/core/src/renderer/bootstrap.tsx | 4 +- .../init-cluster-frame.injectable.ts | 2 - .../init-cluster-frame/init-cluster-frame.ts | 13 +----- .../root-frame/init-root-frame.injectable.ts | 13 +----- 5 files changed, 50 insertions(+), 28 deletions(-) create mode 100644 packages/core/src/renderer/before-frame-starts/runnables/listen-unload.injectable.ts diff --git a/packages/core/src/renderer/before-frame-starts/runnables/listen-unload.injectable.ts b/packages/core/src/renderer/before-frame-starts/runnables/listen-unload.injectable.ts new file mode 100644 index 0000000000..6b6e0e751c --- /dev/null +++ b/packages/core/src/renderer/before-frame-starts/runnables/listen-unload.injectable.ts @@ -0,0 +1,46 @@ +/** + * 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 currentlyInClusterFrameInjectable from "../../routes/currently-in-cluster-frame.injectable"; +import { beforeFrameStartsSecondInjectionToken } from "../tokens"; +import loggerInjectable from "../../../common/logger.injectable"; +import hostedClusterInjectable from "../../cluster-frame-context/hosted-cluster.injectable"; +import frameRoutingIdInjectable from "../../frames/cluster-frame/init-cluster-frame/frame-routing-id/frame-routing-id.injectable"; +import closeRendererLogFileInjectable from "../../logger/close-renderer-log-file.injectable"; +import { unmountComponentAtNode } from "react-dom"; + +const listenUnloadInjectable = getInjectable({ + id: "listen-unload", + instantiate: (di) => ({ + run: () => { + const closeRendererLogFile = di.inject(closeRendererLogFileInjectable); + const isClusterFrame = di.inject(currentlyInClusterFrameInjectable); + const logger = di.inject(loggerInjectable); + + window.addEventListener("beforeunload", () => { + if (isClusterFrame) { + const hostedCluster = di.inject(hostedClusterInjectable); + const frameRoutingId = di.inject(frameRoutingIdInjectable); + + logger.info( + `[CLUSTER-FRAME] Unload dashboard, clusterId=${hostedCluster?.id}, frameId=${frameRoutingId}`, + ); + } else { + logger.info("[ROOT-FRAME]: Unload app"); + } + + closeRendererLogFile(); + const rootElem = document.getElementById("app"); + + if (rootElem) { + unmountComponentAtNode(rootElem); + } + }); + }, + }), + injectionToken: beforeFrameStartsSecondInjectionToken, +}); + +export default listenUnloadInjectable; diff --git a/packages/core/src/renderer/bootstrap.tsx b/packages/core/src/renderer/bootstrap.tsx index a811f07d5c..75439fce13 100644 --- a/packages/core/src/renderer/bootstrap.tsx +++ b/packages/core/src/renderer/bootstrap.tsx @@ -6,7 +6,7 @@ import "./components/app.scss"; import React from "react"; -import { render, unmountComponentAtNode } from "react-dom"; +import { render } from "react-dom"; import { DefaultProps } from "./mui-base-theme"; import { DiContextProvider } from "@ogre-tools/injectable-react"; import type { @@ -43,7 +43,7 @@ export async function bootstrap(di: DiContainerForInjection) { } try { - await initializeApp(() => unmountComponentAtNode(rootElem)); + await initializeApp(); } catch (error) { console.error(`[BOOTSTRAP]: view initialization error: ${error}`, { origin: location.href, diff --git a/packages/core/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.injectable.ts b/packages/core/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.injectable.ts index a9a923f860..c640264ee3 100644 --- a/packages/core/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.injectable.ts +++ b/packages/core/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.injectable.ts @@ -12,7 +12,6 @@ import emitAppEventInjectable from "../../../../common/app-event-bus/emit-event. import loadExtensionsInjectable from "../../load-extensions.injectable"; import loggerInjectable from "../../../../common/logger.injectable"; import showErrorNotificationInjectable from "../../../components/notifications/show-error-notification.injectable"; -import closeRendererLogFileInjectable from "../../../logger/close-renderer-log-file.injectable"; const initClusterFrameInjectable = getInjectable({ id: "init-cluster-frame", @@ -30,7 +29,6 @@ const initClusterFrameInjectable = getInjectable({ emitAppEvent: di.inject(emitAppEventInjectable), logger: di.inject(loggerInjectable), showErrorNotification: di.inject(showErrorNotificationInjectable), - closeFileLogging: di.inject(closeRendererLogFileInjectable), }); }, }); diff --git a/packages/core/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.ts b/packages/core/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.ts index 30be33145f..9e901a8060 100644 --- a/packages/core/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.ts +++ b/packages/core/src/renderer/frames/cluster-frame/init-cluster-frame/init-cluster-frame.ts @@ -18,7 +18,6 @@ interface Dependencies { emitAppEvent: EmitAppEvent; logger: Logger; showErrorNotification: ShowNotification; - closeFileLogging: () => void; } const logPrefix = "[CLUSTER-FRAME]:"; @@ -32,9 +31,8 @@ export const initClusterFrame = emitAppEvent, logger, showErrorNotification, - closeFileLogging, }: Dependencies) => - async (unmountRoot: () => void) => { + async () => { // TODO: Make catalogEntityRegistry already initialized when passed as dependency catalogEntityRegistry.init(); @@ -71,13 +69,4 @@ export const initClusterFrame = }, }); }); - - window.onbeforeunload = () => { - logger.info( - `${logPrefix} Unload dashboard, clusterId=${hostedCluster.id}, frameId=${frameRoutingId}`, - ); - - unmountRoot(); - closeFileLogging(); - }; }; diff --git a/packages/core/src/renderer/frames/root-frame/init-root-frame.injectable.ts b/packages/core/src/renderer/frames/root-frame/init-root-frame.injectable.ts index 023c237ae6..e1bedb0c88 100644 --- a/packages/core/src/renderer/frames/root-frame/init-root-frame.injectable.ts +++ b/packages/core/src/renderer/frames/root-frame/init-root-frame.injectable.ts @@ -9,11 +9,9 @@ import lensProtocolRouterRendererInjectable from "../../protocol-handler/lens-pr import catalogEntityRegistryInjectable from "../../api/catalog/entity/registry.injectable"; import registerIpcListenersInjectable from "../../ipc/register-ipc-listeners.injectable"; import loadExtensionsInjectable from "../load-extensions.injectable"; -import loggerInjectable from "../../../common/logger.injectable"; import { delay } from "@k8slens/utilities"; import { broadcastMessage } from "../../../common/ipc"; import { bundledExtensionsLoaded } from "../../../common/ipc/extension-handling"; -import closeRendererLogFileInjectable from "../../logger/close-renderer-log-file.injectable"; const initRootFrameInjectable = getInjectable({ id: "init-root-frame", @@ -24,10 +22,8 @@ const initRootFrameInjectable = getInjectable({ const bindProtocolAddRouteHandlers = di.inject(bindProtocolAddRouteHandlersInjectable); const lensProtocolRouterRenderer = di.inject(lensProtocolRouterRendererInjectable); const catalogEntityRegistry = di.inject(catalogEntityRegistryInjectable); - const logger = di.inject(loggerInjectable); - const closeRendererLogFile = di.inject(closeRendererLogFileInjectable); - return async (unmountRoot: () => void) => { + return async () => { catalogEntityRegistry.init(); try { @@ -58,13 +54,6 @@ const initRootFrameInjectable = getInjectable({ window.addEventListener("online", () => broadcastMessage("network:online")); registerIpcListeners(); - - window.addEventListener("beforeunload", () => { - logger.info("[ROOT-FRAME]: Unload app"); - - closeRendererLogFile(); - unmountRoot(); - }); }; }, });