diff --git a/src/extensions/example-extension/example-extension.tsx b/src/extensions/example-extension/example-extension.tsx index 8ee52e6f66..52a169a2c9 100644 --- a/src/extensions/example-extension/example-extension.tsx +++ b/src/extensions/example-extension/example-extension.tsx @@ -2,31 +2,22 @@ import { Button, DynamicPageType, Icon, LensExtension } from "@lens/extensions"; import React from "react"; import path from "path"; -let extension: ExampleExtension; // todo: provide instance from context - export default class ExampleExtension extends LensExtension { - protected unRegisterPage = Function(); - onActivate() { - extension = this - console.log('EXAMPLE EXTENSION: ACTIVATE', this.getMeta()) - const { dynamicPages } = this.runtime; - - this.unRegisterPage = dynamicPages.register({ + console.log('EXAMPLE EXTENSION: ACTIVATED', this.getMeta()); + this.registerPage({ type: DynamicPageType.CLUSTER, path: "/extension-example", menuTitle: "Example Extension", components: { - Page: ExtensionPage, + Page: () => , MenuIcon: ExtensionIcon, } }) } onDeactivate() { - extension = null; - console.log('EXAMPLE EXTENSION: DEACTIVATE', this.getMeta()); - this.unRegisterPage(); + console.log('EXAMPLE EXTENSION: DEACTIVATED', this.getMeta()); } } @@ -34,14 +25,15 @@ export function ExtensionIcon(props: {} /*IconProps |*/) { return } -export class ExtensionPage extends React.Component { +export class ExtensionPage extends React.Component<{ extension: ExampleExtension }> { deactivate = () => { + const { extension } = this.props; extension.runtime.navigate("/") extension.disable(); } render() { - const { MainLayout } = extension.runtime.components; + const { MainLayout } = this.props.extension.runtime.components; return (
diff --git a/src/extensions/extension-api.ts b/src/extensions/extension-api.ts index 803698f71f..8e5951a12e 100644 --- a/src/extensions/extension-api.ts +++ b/src/extensions/extension-api.ts @@ -2,7 +2,7 @@ export type { LensRuntimeRendererEnv } from "./lens-runtime"; // APIs -export * from "./extension" +export * from "./lens-extension" export { DynamicPageType } from "./register-page"; // Common UI components diff --git a/src/extensions/extension-store.ts b/src/extensions/extension-store.ts index 640a0e88e4..a7eb75db88 100644 --- a/src/extensions/extension-store.ts +++ b/src/extensions/extension-store.ts @@ -3,8 +3,8 @@ import path from "path"; import fs from "fs-extra"; import { action, observable, reaction, toJS, } from "mobx"; import { BaseStore } from "../common/base-store"; -import { ExtensionId, ExtensionManifest, ExtensionVersion, LensExtension } from "./extension"; -import { isDevelopment, isProduction, isTestEnv } from "../common/vars"; +import { ExtensionId, ExtensionManifest, ExtensionVersion, LensExtension } from "./lens-extension"; +import { isDevelopment } from "../common/vars"; import logger from "../main/logger"; export interface ExtensionStoreModel { @@ -47,7 +47,7 @@ export class ExtensionStore extends BaseStore { if (isDevelopment) { return path.resolve(__static, "../src/extensions"); } - return path.resolve(__static, "../extensions"); //todo figure out prod + return path.resolve(__static, "../extensions"); } async load() { diff --git a/src/extensions/extension.ts b/src/extensions/lens-extension.ts similarity index 83% rename from src/extensions/extension.ts rename to src/extensions/lens-extension.ts index e4bc683ea9..a285cf095e 100644 --- a/src/extensions/extension.ts +++ b/src/extensions/lens-extension.ts @@ -1,17 +1,20 @@ import type { ExtensionModel } from "./extension-store"; import type { LensRuntimeRendererEnv } from "./lens-runtime"; +import type { PageRegistration } from "./register-page"; import { readJsonSync } from "fs-extra"; import { action, observable, toJS } from "mobx"; import extensionManifest from "./example-extension/package.json" import logger from "../main/logger"; -export type ExtensionId = string; // instance-id or abs path to "%lens-extension/manifest.json" +export type ExtensionId = string | ExtensionPackageJsonPath; +export type ExtensionPackageJsonPath = string; export type ExtensionVersion = string | number; export type ExtensionManifest = typeof extensionManifest & ExtensionModel; export class LensExtension implements ExtensionModel { public id: ExtensionId; public updateUrl: string; + protected disposers: Function[] = []; @observable name = ""; @observable description = ""; @@ -48,6 +51,8 @@ export class LensExtension implements ExtensionModel { this.onDeactivate(); this.isEnabled = false; this.runtime = null; + this.disposers.forEach(cleanUp => cleanUp()); + this.disposers.length = 0; console.log(`[EXTENSION]: disabled ${this.name}@${this.version}`, this.getMeta()); } @@ -99,4 +104,12 @@ export class LensExtension implements ExtensionModel { recurseEverything: true, }) } + + // Runtime helpers + protected registerPage(params: PageRegistration, autoDisable = true) { + const dispose = this.runtime.dynamicPages.register(params); + if (autoDisable) { + this.disposers.push(dispose); + } + } }