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

refactor registering extensions

extension implementors do not need to be aware of disposer and registry internals

Signed-off-by: Jim Ehrismann <jehrismann@mirantis.com>
This commit is contained in:
Jim Ehrismann 2020-10-26 14:38:55 -04:00
parent e9ebd06664
commit aa1e18c148
7 changed files with 94 additions and 52 deletions

View File

@ -1,4 +1,4 @@
import { LensRendererExtension, Registry } from "@k8slens/extensions"; import { LensRendererExtension } from "@k8slens/extensions";
import { ExamplePage, ExampleIcon } from "./page" import { ExamplePage, ExampleIcon } from "./page"
import React from "react" import React from "react"
@ -7,17 +7,17 @@ export default class ExampleExtension extends LensRendererExtension {
console.log('EXAMPLE EXTENSION RENDERER: ACTIVATED', this.getMeta()); console.log('EXAMPLE EXTENSION RENDERER: ACTIVATED', this.getMeta());
} }
registerClusterPage(registry: Registry.ClusterPageRegistry) { clusterPages() {
this.disposers.push( return [
registry.add({ {
path: "/extension-example", path: "/extension-example",
title: "Example Extension", title: "Example Extension",
components: { components: {
Page: () => <ExamplePage extension={this} />, Page: () => <ExamplePage extension={this} />,
MenuIcon: ExampleIcon, MenuIcon: ExampleIcon,
} }
}) }
) ]
} }
onDeactivate() { onDeactivate() {

View File

@ -1,11 +1,11 @@
import { Registry, LensRendererExtension } from "@k8slens/extensions" import { LensRendererExtension } from "@k8slens/extensions"
import { MetricsFeature } from "./src/metrics-feature" import { MetricsFeature } from "./src/metrics-feature"
import React from "react" import React from "react"
export default class ClusterMetricsFeatureExtension extends LensRendererExtension { export default class ClusterMetricsFeatureExtension extends LensRendererExtension {
registerClusterFeatures(registry: Registry.ClusterFeatureRegistry) { clusterFeatures() {
this.disposers.push( return [
registry.add({ {
title: "Metrics Stack", title: "Metrics Stack",
components: { components: {
Description: () => { Description: () => {
@ -19,7 +19,7 @@ export default class ClusterMetricsFeatureExtension extends LensRendererExtensio
} }
}, },
feature: new MetricsFeature() feature: new MetricsFeature()
}) }
) ]
} }
} }

View File

@ -1,4 +1,4 @@
import { Registry, LensRendererExtension } from "@k8slens/extensions"; import { LensRendererExtension } from "@k8slens/extensions";
import React from "react" import React from "react"
import { NodeMenu } from "./src/node-menu" import { NodeMenu } from "./src/node-menu"
@ -7,15 +7,15 @@ export default class NodeMenuRendererExtension extends LensRendererExtension {
console.log("node-menu extension activated") console.log("node-menu extension activated")
} }
registerKubeObjectMenus(registry: Registry.KubeObjectMenuRegistry) { kubeObjectMenus() {
this.disposers.push( return [
registry.add({ {
kind: "Node", kind: "Node",
apiVersions: ["v1"], apiVersions: ["v1"],
components: { components: {
MenuItem: (props) => <NodeMenu {...props} /> MenuItem: (props) => <NodeMenu {...props} />
} }
}) }
) ]
} }
} }

View File

@ -1,4 +1,4 @@
import { Registry, LensRendererExtension } from "@k8slens/extensions"; import { LensRendererExtension } from "@k8slens/extensions";
import { PodShellMenu } from "./src/shell-menu" import { PodShellMenu } from "./src/shell-menu"
import { PodLogsMenu } from "./src/logs-menu" import { PodLogsMenu } from "./src/logs-menu"
import React from "react" import React from "react"
@ -8,24 +8,22 @@ export default class PodMenuRendererExtension extends LensRendererExtension {
console.log("pod-menu extension activated") console.log("pod-menu extension activated")
} }
registerKubeObjectMenus(registry: Registry.KubeObjectMenuRegistry) { kubeObjectMenus() {
this.disposers.push( return [
registry.add({ {
kind: "Pod", kind: "Pod",
apiVersions: ["v1"], apiVersions: ["v1"],
components: { components: {
MenuItem: (props) => <PodShellMenu {...props} /> MenuItem: (props) => <PodShellMenu {...props} />
} }
}) },
) {
this.disposers.push(
registry.add({
kind: "Pod", kind: "Pod",
apiVersions: ["v1"], apiVersions: ["v1"],
components: { components: {
MenuItem: (props) => <PodLogsMenu {...props} /> MenuItem: (props) => <PodLogsMenu {...props} />
} }
}) }
) ]
} }
} }

View File

@ -1,5 +1,5 @@
import React from "react"; import React from "react";
import { Component, LensRendererExtension, Navigation, Registry } from "@k8slens/extensions"; import { Component, LensRendererExtension, Navigation } from "@k8slens/extensions";
import { supportPageRoute, supportPageURL } from "./src/support.route"; import { supportPageRoute, supportPageURL } from "./src/support.route";
import { Support } from "./src/support"; import { Support } from "./src/support";
@ -8,22 +8,22 @@ export default class SupportPageRendererExtension extends LensRendererExtension
console.log("support page extension activated") console.log("support page extension activated")
} }
registerGlobalPage(registry: Registry.GlobalPageRegistry) { globalPages() {
this.disposers.push( return [
registry.add({ {
...supportPageRoute, ...supportPageRoute,
url: supportPageURL(), url: supportPageURL(),
hideInMenu: true, hideInMenu: true,
components: { components: {
Page: Support, Page: Support,
} }
}) }
) ]
} }
registerStatusBarItem(registry: Registry.StatusBarRegistry) { statusBarItems() {
this.disposers.push( return [
registry.add({ {
item: ( item: (
<div <div
className="flex align-center gaps hover-highlight" className="flex align-center gaps hover-highlight"
@ -33,7 +33,7 @@ export default class SupportPageRendererExtension extends LensRendererExtension
<span>Support</span> <span>Support</span>
</div> </div>
) )
}) }
) ]
} }
} }

View File

@ -1,4 +1,4 @@
import { LensRendererExtension, Registry } from "@k8slens/extensions"; import { LensRendererExtension } from "@k8slens/extensions";
import { telemetryPreferencesStore } from "./src/telemetry-preferences-store" import { telemetryPreferencesStore } from "./src/telemetry-preferences-store"
import { TelemetryPreferenceHint, TelemetryPreferenceInput } from "./src/telemetry-preference" import { TelemetryPreferenceHint, TelemetryPreferenceInput } from "./src/telemetry-preference"
import { tracker } from "./src/tracker" import { tracker } from "./src/tracker"
@ -11,16 +11,16 @@ export default class TelemetryRendererExtension extends LensRendererExtension {
await telemetryPreferencesStore.loadExtension(this) await telemetryPreferencesStore.loadExtension(this)
} }
registerAppPreferences(registry: Registry.AppPreferenceRegistry) { appPreferences() {
this.disposers.push( return [
registry.add({ {
title: "Telemetry & Usage Tracking", title: "Telemetry & Usage Tracking",
components: { components: {
Hint: () => <TelemetryPreferenceHint />, Hint: () => <TelemetryPreferenceHint />,
Input: () => <TelemetryPreferenceInput telemetry={telemetryPreferencesStore} /> Input: () => <TelemetryPreferenceInput telemetry={telemetryPreferencesStore} />
} }
}) }
) ]
} }
onDeactivate() { onDeactivate() {

View File

@ -1,28 +1,72 @@
import { LensExtension } from "./lens-extension" import { LensExtension } from "./lens-extension"
import type { GlobalPageRegistry, ClusterPageRegistry, AppPreferenceRegistry, StatusBarRegistry, KubeObjectMenuRegistry, ClusterFeatureRegistry } from "./registries" import type { GlobalPageRegistry, ClusterPageRegistry, AppPreferenceRegistry, StatusBarRegistry, KubeObjectMenuRegistry, ClusterFeatureRegistry,
PageRegistration, AppPreferenceRegistration, StatusBarRegistration, KubeObjectMenuRegistration, ClusterFeatureRegistration } from "./registries"
export class LensRendererExtension extends LensExtension { export class LensRendererExtension extends LensExtension {
/*
* Extensions must implement these
*/
globalPages(): PageRegistration[] {
return []
}
clusterPages(): PageRegistration[] {
return []
}
appPreferences(): AppPreferenceRegistration[] {
return []
}
clusterFeatures(): ClusterFeatureRegistration[] {
return []
}
statusBarItems(): StatusBarRegistration[] {
return []
}
kubeObjectMenus(): KubeObjectMenuRegistration[] {
return []
}
/*
* these don't need to be exposed to extension developers (can we hide them?)
*/
registerGlobalPage(registry: GlobalPageRegistry) { registerGlobalPage(registry: GlobalPageRegistry) {
return for (let page of this.globalPages()) {
this.disposers.push(registry.add(page))
}
} }
registerClusterPage(registry: ClusterPageRegistry) { registerClusterPage(registry: ClusterPageRegistry) {
return for (let page of this.clusterPages()) {
this.disposers.push(registry.add(page))
}
} }
registerAppPreferences(registry: AppPreferenceRegistry) { registerAppPreferences(registry: AppPreferenceRegistry) {
return for (let preference of this.appPreferences()) {
this.disposers.push(registry.add(preference))
}
} }
registerClusterFeatures(registry: ClusterFeatureRegistry) { registerClusterFeatures(registry: ClusterFeatureRegistry) {
return for (let feature of this.clusterFeatures()) {
this.disposers.push(registry.add(feature))
}
} }
registerStatusBarItem(registry: StatusBarRegistry) { registerStatusBarItem(registry: StatusBarRegistry) {
return for (let item of this.statusBarItems()) {
this.disposers.push(registry.add(item))
}
} }
registerKubeObjectMenus(registry: KubeObjectMenuRegistry) { registerKubeObjectMenus(registry: KubeObjectMenuRegistry) {
return for (let menu of this.kubeObjectMenus()) {
this.disposers.push(registry.add(menu))
}
} }
} }