/** * Copyright (c) OpenLens Authors. All rights reserved. * Licensed under MIT License. See LICENSE in root directory for more information. */ import "./extensions.scss"; import type { IComputedValue } from "mobx"; import { makeObservable, observable, reaction, when, } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; import React from "react"; import type { InstalledExtension } from "../../../extensions/extension-discovery/extension-discovery"; import { DropFileInput } from "../input"; import { Install } from "./install"; import { InstalledExtensions } from "./installed-extensions"; import { Notice } from "./notice"; import { SettingLayout } from "../layout/setting-layout"; import { docsUrl } from "../../../common/vars"; import { withInjectables } from "@ogre-tools/injectable-react"; import userExtensionsInjectable from "./user-extensions/user-extensions.injectable"; import enableExtensionInjectable from "./enable-extension/enable-extension.injectable"; import disableExtensionInjectable from "./disable-extension/disable-extension.injectable"; import type { ConfirmUninstallExtension } from "./confirm-uninstall-extension.injectable"; import confirmUninstallExtensionInjectable from "./confirm-uninstall-extension.injectable"; import installFromInputInjectable from "./install-from-input/install-from-input.injectable"; import installFromSelectFileDialogInjectable from "./install-from-select-file-dialog.injectable"; import type { LensExtensionId } from "../../../extensions/lens-extension"; import installOnDropInjectable from "./install-on-drop/install-on-drop.injectable"; import { supportedExtensionFormats } from "./supported-extension-formats"; import extensionInstallationStateStoreInjectable from "../../../extensions/extension-installation-state-store/extension-installation-state-store.injectable"; import type { ExtensionInstallationStateStore } from "../../../extensions/extension-installation-state-store/extension-installation-state-store"; interface Dependencies { userExtensions: IComputedValue; enableExtension: (id: LensExtensionId) => void; disableExtension: (id: LensExtensionId) => void; confirmUninstallExtension: ConfirmUninstallExtension; installFromInput: (input: string) => Promise; installFromSelectFileDialog: () => Promise; installOnDrop: (files: File[]) => Promise; extensionInstallationStateStore: ExtensionInstallationStateStore; } @observer class NonInjectedExtensions extends React.Component { @observable installPath = ""; constructor(props: Dependencies) { super(props); makeObservable(this); } componentDidMount() { disposeOnUnmount(this, [ reaction(() => this.props.userExtensions.get().length, (curSize, prevSize) => { if (curSize > prevSize) { disposeOnUnmount(this, [ when(() => !this.props.extensionInstallationStateStore.anyInstalling, () => this.installPath = ""), ]); } }), ]); } render() { const userExtensions = this.props.userExtensions.get(); return (

Extensions

Add new features via Lens Extensions.{" "} Check out docs{" "} and list of available extensions.

(this.installPath = value)} installFromInput={() => this.props.installFromInput(this.installPath)} installFromSelectFileDialog={this.props.installFromSelectFileDialog} installPath={this.installPath} /> {userExtensions.length > 0 &&
}
); } } export const Extensions = withInjectables(NonInjectedExtensions, { getProps: (di) => ({ userExtensions: di.inject(userExtensionsInjectable), enableExtension: di.inject(enableExtensionInjectable), disableExtension: di.inject(disableExtensionInjectable), confirmUninstallExtension: di.inject(confirmUninstallExtensionInjectable), installFromInput: di.inject(installFromInputInjectable), installOnDrop: di.inject(installOnDropInjectable), installFromSelectFileDialog: di.inject(installFromSelectFileDialogInjectable), extensionInstallationStateStore: di.inject(extensionInstallationStateStoreInjectable), }), });