1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Add ContextProviders support to the Extension API

Signed-off-by: Panu Horsmalahti <phorsmalahti@mirantis.com>
This commit is contained in:
Panu Horsmalahti 2022-03-24 11:38:37 +02:00
parent ab4780f67c
commit 4dd6653a66
6 changed files with 57 additions and 12 deletions

View File

@ -250,6 +250,7 @@ export class ExtensionLoader {
registries.GlobalPageRegistry.getInstance().add(extension.globalPages, extension),
registries.EntitySettingRegistry.getInstance().add(extension.entitySettings),
registries.CatalogEntityDetailRegistry.getInstance().add(extension.catalogEntityDetailItems),
...(extension.getContextProviders ? [registries.ContextProviderRegistry.getInstance().add(await extension.getContextProviders())] : []),
];
this.events.on("remove", (removedExtension: LensRendererExtension) => {
@ -277,6 +278,7 @@ export class ExtensionLoader {
registries.ClusterPageRegistry.getInstance().add(extension.clusterPages, extension),
registries.ClusterPageMenuRegistry.getInstance().add(extension.clusterPageMenus, extension),
registries.KubeObjectDetailRegistry.getInstance().add(extension.kubeObjectDetailItems),
...(extension.getContextProviders ? [registries.ContextProviderRegistry.getInstance().add(await extension.getContextProviders())] : []),
];
this.events.on("remove", (removedExtension: LensRendererExtension) => {

View File

@ -41,6 +41,7 @@ export class LensRendererExtension extends LensExtension {
topBarItems: TopBarRegistration[] = [];
additionalCategoryColumns: AdditionalCategoryColumnRegistration[] = [];
customCategoryViews: CustomCategoryViewRegistration[] = [];
getContextProviders?: () => Promise<registries.ContextProviderRegistration[]>;
async navigate<P extends object>(pageId?: string, params?: P) {
const { navigate } = await import("../renderer/navigation");

View File

@ -0,0 +1,25 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type React from "react";
import { BaseRegistry } from "./base-registry";
export interface ContextProviderProps {
}
export interface ContextProviderComponents {
Provider: React.ComponentType<ContextProviderProps>;
}
export interface ContextProviderRegistration {
components: ContextProviderComponents;
}
export interface RegisteredContextProvider extends ContextProviderRegistration {
id: string;
}
export class ContextProviderRegistry extends BaseRegistry<ContextProviderRegistration, RegisteredContextProvider> {
}

View File

@ -10,4 +10,5 @@ export * from "./page-menu-registry";
export * from "./kube-object-detail-registry";
export * from "./entity-setting-registry";
export * from "./catalog-entity-detail-registry";
export * from "./context-provider-registry";
export * from "./protocol-handler";

View File

@ -18,6 +18,7 @@ import { ClusterFrameHandler } from "../../components/cluster-manager/lens-views
import historyInjectable from "../../navigation/history.injectable";
import { withInjectables } from "@ogre-tools/injectable-react";
import type { History } from "history";
import { ContextProviderRegistry, ContextProviderProps } from "../../../extensions/registries/context-provider-registry";
injectSystemCAs();
@ -39,9 +40,24 @@ class NonInjectedRootFrame extends React.Component<Dependencies> {
ipcRenderer.send(IpcRendererNavigationEvents.LOADED);
}
/**
* Recursively render all the React Context Providers with the children
*/
renderWithProviders(contextProviders: React.ComponentType<ContextProviderProps>[], children: React.ReactNode) {
if (contextProviders.length === 0) {
return children;
} else {
const [Provider, ...restProviders] = contextProviders;
return (<Provider>{this.renderWithProviders(restProviders, children)}</Provider>);
}
}
render() {
return (
<Router history={this.props.history}>
// Extensions may register React Context Provider components
const contextProviders = ContextProviderRegistry.getInstance().getItems().map(contextProvider => contextProvider.components.Provider);
return this.renderWithProviders(contextProviders, (<Router history={this.props.history}>
<ErrorBoundary>
<Switch>
<Route component={ClusterManager} />
@ -50,8 +66,7 @@ class NonInjectedRootFrame extends React.Component<Dependencies> {
<Notifications />
<ConfirmDialog />
<CommandContainer />
</Router>
);
</Router>));
}
}

View File

@ -12,4 +12,5 @@ export function initRegistries() {
registries.EntitySettingRegistry.createInstance();
registries.GlobalPageRegistry.createInstance();
registries.KubeObjectDetailRegistry.createInstance();
registries.ContextProviderRegistry.createInstance();
}