mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
93 lines
3.2 KiB
TypeScript
93 lines
3.2 KiB
TypeScript
/**
|
|
* Copyright (c) OpenLens Authors. All rights reserved.
|
|
* Licensed under MIT License. See LICENSE in root directory for more information.
|
|
*/
|
|
import type { Cluster } from "../../../../common/cluster/cluster";
|
|
import type { CatalogEntityRegistry } from "../../../api/catalog-entity-registry";
|
|
import logger from "../../../../main/logger";
|
|
import type { KubernetesCluster } from "../../../../common/catalog-entities";
|
|
import { Notifications } from "../../../components/notifications";
|
|
import type { AppEvent } from "../../../../common/app-event-bus/event-bus";
|
|
import type { CatalogEntity } from "../../../../common/catalog";
|
|
import { when } from "mobx";
|
|
import { unmountComponentAtNode } from "react-dom";
|
|
import type { ClusterFrameContext } from "../../../cluster-frame-context/cluster-frame-context";
|
|
import { KubeObjectStore } from "../../../../common/k8s-api/kube-object.store";
|
|
import { requestSetClusterFrameId } from "../../../ipc";
|
|
|
|
interface Dependencies {
|
|
hostedCluster: Cluster;
|
|
loadExtensions: (getCluster: () => CatalogEntity) => void;
|
|
catalogEntityRegistry: CatalogEntityRegistry;
|
|
frameRoutingId: number;
|
|
emitEvent: (event: AppEvent) => void;
|
|
|
|
// TODO: This dependency belongs to KubeObjectStore
|
|
clusterFrameContext: ClusterFrameContext;
|
|
}
|
|
|
|
const logPrefix = "[CLUSTER-FRAME]:";
|
|
|
|
export const initClusterFrame =
|
|
({ hostedCluster, loadExtensions, catalogEntityRegistry, frameRoutingId, emitEvent, clusterFrameContext }: Dependencies) =>
|
|
async (rootElem: HTMLElement) => {
|
|
|
|
// TODO: Make catalogEntityRegistry already initialized when passed as dependency
|
|
catalogEntityRegistry.init();
|
|
|
|
logger.info(
|
|
`${logPrefix} Init dashboard, clusterId=${hostedCluster.id}, frameId=${frameRoutingId}`,
|
|
);
|
|
|
|
await requestSetClusterFrameId(hostedCluster.id);
|
|
await hostedCluster.whenReady; // cluster.activate() is done at this point
|
|
|
|
catalogEntityRegistry.activeEntity = hostedCluster.id;
|
|
|
|
// Only load the extensions once the catalog has been populated.
|
|
// Note that the Catalog might still have unprocessed entities until the extensions are fully loaded.
|
|
when(
|
|
() => catalogEntityRegistry.items.length > 0,
|
|
() =>
|
|
loadExtensions(() => catalogEntityRegistry.activeEntity as KubernetesCluster),
|
|
{
|
|
timeout: 15_000,
|
|
onError: (error) => {
|
|
console.warn(
|
|
"[CLUSTER-FRAME]: error from activeEntity when()",
|
|
error,
|
|
);
|
|
|
|
Notifications.error(
|
|
"Failed to get KubernetesCluster for this view. Extensions will not be loaded.",
|
|
);
|
|
},
|
|
},
|
|
);
|
|
|
|
setTimeout(() => {
|
|
emitEvent({
|
|
name: "cluster",
|
|
action: "open",
|
|
params: {
|
|
clusterId: hostedCluster.id,
|
|
},
|
|
});
|
|
});
|
|
|
|
window.addEventListener("online", () => {
|
|
window.location.reload();
|
|
});
|
|
|
|
window.onbeforeunload = () => {
|
|
logger.info(
|
|
`${logPrefix} Unload dashboard, clusterId=${(hostedCluster.id)}, frameId=${frameRoutingId}`,
|
|
);
|
|
|
|
unmountComponentAtNode(rootElem);
|
|
};
|
|
|
|
// TODO: Make context dependency of KubeObjectStore
|
|
KubeObjectStore.defaultContext.set(clusterFrameContext);
|
|
};
|