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:
parent
ab4780f67c
commit
4dd6653a66
@ -250,6 +250,7 @@ export class ExtensionLoader {
|
|||||||
registries.GlobalPageRegistry.getInstance().add(extension.globalPages, extension),
|
registries.GlobalPageRegistry.getInstance().add(extension.globalPages, extension),
|
||||||
registries.EntitySettingRegistry.getInstance().add(extension.entitySettings),
|
registries.EntitySettingRegistry.getInstance().add(extension.entitySettings),
|
||||||
registries.CatalogEntityDetailRegistry.getInstance().add(extension.catalogEntityDetailItems),
|
registries.CatalogEntityDetailRegistry.getInstance().add(extension.catalogEntityDetailItems),
|
||||||
|
...(extension.getContextProviders ? [registries.ContextProviderRegistry.getInstance().add(await extension.getContextProviders())] : []),
|
||||||
];
|
];
|
||||||
|
|
||||||
this.events.on("remove", (removedExtension: LensRendererExtension) => {
|
this.events.on("remove", (removedExtension: LensRendererExtension) => {
|
||||||
@ -277,6 +278,7 @@ export class ExtensionLoader {
|
|||||||
registries.ClusterPageRegistry.getInstance().add(extension.clusterPages, extension),
|
registries.ClusterPageRegistry.getInstance().add(extension.clusterPages, extension),
|
||||||
registries.ClusterPageMenuRegistry.getInstance().add(extension.clusterPageMenus, extension),
|
registries.ClusterPageMenuRegistry.getInstance().add(extension.clusterPageMenus, extension),
|
||||||
registries.KubeObjectDetailRegistry.getInstance().add(extension.kubeObjectDetailItems),
|
registries.KubeObjectDetailRegistry.getInstance().add(extension.kubeObjectDetailItems),
|
||||||
|
...(extension.getContextProviders ? [registries.ContextProviderRegistry.getInstance().add(await extension.getContextProviders())] : []),
|
||||||
];
|
];
|
||||||
|
|
||||||
this.events.on("remove", (removedExtension: LensRendererExtension) => {
|
this.events.on("remove", (removedExtension: LensRendererExtension) => {
|
||||||
|
|||||||
@ -41,6 +41,7 @@ export class LensRendererExtension extends LensExtension {
|
|||||||
topBarItems: TopBarRegistration[] = [];
|
topBarItems: TopBarRegistration[] = [];
|
||||||
additionalCategoryColumns: AdditionalCategoryColumnRegistration[] = [];
|
additionalCategoryColumns: AdditionalCategoryColumnRegistration[] = [];
|
||||||
customCategoryViews: CustomCategoryViewRegistration[] = [];
|
customCategoryViews: CustomCategoryViewRegistration[] = [];
|
||||||
|
getContextProviders?: () => Promise<registries.ContextProviderRegistration[]>;
|
||||||
|
|
||||||
async navigate<P extends object>(pageId?: string, params?: P) {
|
async navigate<P extends object>(pageId?: string, params?: P) {
|
||||||
const { navigate } = await import("../renderer/navigation");
|
const { navigate } = await import("../renderer/navigation");
|
||||||
|
|||||||
25
src/extensions/registries/context-provider-registry.ts
Normal file
25
src/extensions/registries/context-provider-registry.ts
Normal 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> {
|
||||||
|
}
|
||||||
@ -10,4 +10,5 @@ export * from "./page-menu-registry";
|
|||||||
export * from "./kube-object-detail-registry";
|
export * from "./kube-object-detail-registry";
|
||||||
export * from "./entity-setting-registry";
|
export * from "./entity-setting-registry";
|
||||||
export * from "./catalog-entity-detail-registry";
|
export * from "./catalog-entity-detail-registry";
|
||||||
|
export * from "./context-provider-registry";
|
||||||
export * from "./protocol-handler";
|
export * from "./protocol-handler";
|
||||||
|
|||||||
@ -18,6 +18,7 @@ import { ClusterFrameHandler } from "../../components/cluster-manager/lens-views
|
|||||||
import historyInjectable from "../../navigation/history.injectable";
|
import historyInjectable from "../../navigation/history.injectable";
|
||||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||||
import type { History } from "history";
|
import type { History } from "history";
|
||||||
|
import { ContextProviderRegistry, ContextProviderProps } from "../../../extensions/registries/context-provider-registry";
|
||||||
|
|
||||||
injectSystemCAs();
|
injectSystemCAs();
|
||||||
|
|
||||||
@ -39,19 +40,33 @@ class NonInjectedRootFrame extends React.Component<Dependencies> {
|
|||||||
ipcRenderer.send(IpcRendererNavigationEvents.LOADED);
|
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() {
|
render() {
|
||||||
return (
|
// Extensions may register React Context Provider components
|
||||||
<Router history={this.props.history}>
|
const contextProviders = ContextProviderRegistry.getInstance().getItems().map(contextProvider => contextProvider.components.Provider);
|
||||||
<ErrorBoundary>
|
|
||||||
<Switch>
|
return this.renderWithProviders(contextProviders, (<Router history={this.props.history}>
|
||||||
<Route component={ClusterManager} />
|
<ErrorBoundary>
|
||||||
</Switch>
|
<Switch>
|
||||||
</ErrorBoundary>
|
<Route component={ClusterManager} />
|
||||||
<Notifications />
|
</Switch>
|
||||||
<ConfirmDialog />
|
</ErrorBoundary>
|
||||||
<CommandContainer />
|
<Notifications />
|
||||||
</Router>
|
<ConfirmDialog />
|
||||||
);
|
<CommandContainer />
|
||||||
|
</Router>));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -12,4 +12,5 @@ export function initRegistries() {
|
|||||||
registries.EntitySettingRegistry.createInstance();
|
registries.EntitySettingRegistry.createInstance();
|
||||||
registries.GlobalPageRegistry.createInstance();
|
registries.GlobalPageRegistry.createInstance();
|
||||||
registries.KubeObjectDetailRegistry.createInstance();
|
registries.KubeObjectDetailRegistry.createInstance();
|
||||||
|
registries.ContextProviderRegistry.createInstance();
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user