1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00
lens/src/renderer/frames/root-frame/init-root-frame/init-root-frame.ts
Sebastian Malton 3254f49f01 Replace all uses of requestMain with typed functions
Signed-off-by: Sebastian Malton <sebastian@malton.name>
2022-01-24 12:07:45 -05:00

75 lines
2.3 KiB
TypeScript

/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { delay } from "../../../../common/utils";
import { broadcastMessage } from "../../../../common/ipc";
import { registerIpcListeners } from "../../../ipc/register-listeners";
import logger from "../../../../common/logger";
import { unmountComponentAtNode } from "react-dom";
import type { ExtensionLoading } from "../../../../extensions/extension-loader";
import type { CatalogEntityRegistry } from "../../../api/catalog-entity-registry";
import { bundledExtensionsLoaded } from "../../../../common/ipc/extension-handling";
interface Dependencies {
loadExtensions: () => Promise<ExtensionLoading[]>;
// TODO: Move usages of third party library behind abstraction
ipcRenderer: { send: (name: string) => void };
// TODO: Remove dependencies being here only for correct timing of initialization
bindProtocolAddRouteHandlers: () => void;
lensProtocolRouterRenderer: { init: () => void };
catalogEntityRegistry: CatalogEntityRegistry;
}
const logPrefix = "[ROOT-FRAME]:";
export const initRootFrame =
({
loadExtensions,
bindProtocolAddRouteHandlers,
lensProtocolRouterRenderer,
ipcRenderer,
catalogEntityRegistry,
}: Dependencies) =>
async (rootElem: HTMLElement) => {
catalogEntityRegistry.init();
try {
// maximum time to let bundled extensions finish loading
const timeout = delay(10000);
const loadingExtensions = await loadExtensions();
const loadingBundledExtensions = loadingExtensions
.filter((e) => e.isBundled)
.map((e) => e.loaded);
const bundledExtensionsFinished = Promise.all(loadingBundledExtensions);
await Promise.race([bundledExtensionsFinished, timeout]);
} finally {
ipcRenderer.send(bundledExtensionsLoaded);
}
lensProtocolRouterRenderer.init();
bindProtocolAddRouteHandlers();
window.addEventListener("offline", () =>
broadcastMessage("network:offline"),
);
window.addEventListener("online", () => broadcastMessage("network:online"));
registerIpcListeners();
window.addEventListener("beforeunload", () => {
logger.info(`${logPrefix} Unload app`);
unmountComponentAtNode(rootElem);
});
};