From 0b172de7414975b7e777286bc0436411be6831f4 Mon Sep 17 00:00:00 2001 From: Janne Savolainen Date: Fri, 10 Dec 2021 13:52:25 +0200 Subject: [PATCH] Adapt to change in DI to minimize boilerplate Signed-off-by: Janne Savolainen --- package.json | 4 +- .../components/kube-object-menu/index.ts | 2 +- .../kube-object-menu-container.tsx | 24 ------ .../kube-object-menu/kube-object-menu.tsx | 75 ++++++++++++------- yarn.lock | 30 ++++---- 5 files changed, 68 insertions(+), 67 deletions(-) delete mode 100644 src/renderer/components/kube-object-menu/kube-object-menu-container.tsx diff --git a/package.json b/package.json index a5db133e96..9f708ba1e5 100644 --- a/package.json +++ b/package.json @@ -198,8 +198,8 @@ "@kubernetes/client-node": "^0.16.1", "@sentry/electron": "^2.5.4", "@sentry/integrations": "^6.15.0", - "@ogre-tools/injectable": "^1.3.0", - "@ogre-tools/injectable-react": "^1.3.1", + "@ogre-tools/injectable": "^1.4.1", + "@ogre-tools/injectable-react": "^1.4.1", "abort-controller": "^3.0.0", "auto-bind": "^4.0.0", "autobind-decorator": "^2.4.0", diff --git a/src/renderer/components/kube-object-menu/index.ts b/src/renderer/components/kube-object-menu/index.ts index 2a9f7fb5c6..d043de2fa0 100644 --- a/src/renderer/components/kube-object-menu/index.ts +++ b/src/renderer/components/kube-object-menu/index.ts @@ -20,4 +20,4 @@ */ export type { KubeObjectMenuProps } from "./kube-object-menu"; -export { KubeObjectMenu } from "./kube-object-menu-container"; +export { KubeObjectMenu } from "./kube-object-menu"; diff --git a/src/renderer/components/kube-object-menu/kube-object-menu-container.tsx b/src/renderer/components/kube-object-menu/kube-object-menu-container.tsx deleted file mode 100644 index 9ac49a131e..0000000000 --- a/src/renderer/components/kube-object-menu/kube-object-menu-container.tsx +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2021 OpenLens Authors - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ -import { getInjectedComponent } from "@ogre-tools/injectable-react"; -import KubeObjectMenuInjectable from "./kube-object-menu.injectable"; - -export const KubeObjectMenu = getInjectedComponent(KubeObjectMenuInjectable); diff --git a/src/renderer/components/kube-object-menu/kube-object-menu.tsx b/src/renderer/components/kube-object-menu/kube-object-menu.tsx index ed382956c2..53ae44e447 100644 --- a/src/renderer/components/kube-object-menu/kube-object-menu.tsx +++ b/src/renderer/components/kube-object-menu/kube-object-menu.tsx @@ -25,34 +25,45 @@ import type { KubeObject } from "../../../common/k8s-api/kube-object"; import { MenuActions, MenuActionsProps } from "../menu"; import identity from "lodash/identity"; import type { ApiManager } from "../../../common/k8s-api/api-manager"; +import { withInjectables } from "@ogre-tools/injectable-react"; +import clusterNameInjectable from "./dependencies/cluster-name.injectable"; +import editResourceTabInjectable from "./dependencies/edit-resource-tab.injectable"; +import hideDetailsInjectable from "./dependencies/hide-details.injectable"; +import kubeObjectMenuItemsInjectable from "./dependencies/kube-object-menu-items/kube-object-menu-items.injectable"; +import apiManagerInjectable from "./dependencies/api-manager.injectable"; -export interface KubeObjectMenuDependencies { - apiManager: ApiManager; - kubeObjectMenuItems: React.ElementType[]; - clusterName: string; - hideDetails: () => void; - editResourceTab: (kubeObject: TKubeObject) => void; -} - +// TODO: Replace with KubeObjectMenuProps2 export interface KubeObjectMenuProps extends MenuActionsProps { object: TKubeObject | null | undefined; editable?: boolean; removable?: boolean; } -export interface KubeObjectMenuPropsAndDependencies - extends KubeObjectMenuProps, - KubeObjectMenuDependencies {} +interface KubeObjectMenuProps2 extends MenuActionsProps { + object: KubeObject | null | undefined; + editable?: boolean; + removable?: boolean; -export class KubeObjectMenu< - TKubeObject extends KubeObject, -> extends React.Component> { + dependencies: { + apiManager: ApiManager; + kubeObjectMenuItems: React.ElementType[]; + clusterName: string; + hideDetails: () => void; + editResourceTab: (kubeObject: KubeObject) => void; + }; +} + +class NonInjectedKubeObjectMenu extends React.Component { + get dependencies() { + return this.props.dependencies; + } + get store() { const { object } = this.props; if (!object) return null; - return this.props.apiManager.getStore(object.selfLink); + return this.props.dependencies.apiManager.getStore(object.selfLink); } get isEditable() { @@ -65,13 +76,13 @@ export class KubeObjectMenu< @boundMethod async update() { - this.props.hideDetails(); - this.props.editResourceTab(this.props.object); + this.props.dependencies.hideDetails(); + this.props.dependencies.editResourceTab(this.props.object); } @boundMethod async remove() { - this.props.hideDetails(); + this.props.dependencies.hideDetails(); const { object, removeAction } = this.props; if (removeAction) await removeAction(); @@ -92,7 +103,8 @@ export class KubeObjectMenu< return (

- Remove {object.kind} {breadcrumb} from {this.props.clusterName}? + Remove {object.kind} {breadcrumb} from{" "} + {this.props.dependencies.clusterName}?

); } @@ -100,12 +112,8 @@ export class KubeObjectMenu< getMenuItems(): React.ReactChild[] { const { object, toolbar } = this.props; - return this.props.kubeObjectMenuItems.map((MenuItem, index) => ( - + return this.props.dependencies.kubeObjectMenuItems.map((MenuItem, index) => ( + )); } @@ -126,3 +134,20 @@ export class KubeObjectMenu< ); } } + +export const KubeObjectMenu = withInjectables(NonInjectedKubeObjectMenu, { + getProps: (di, props) => ({ + dependencies: { + clusterName: di.inject(clusterNameInjectable), + apiManager: di.inject(apiManagerInjectable), + editResourceTab: di.inject(editResourceTabInjectable), + hideDetails: di.inject(hideDetailsInjectable), + + kubeObjectMenuItems: di.inject(kubeObjectMenuItemsInjectable, { + kubeObject: props.object, + }), + }, + + ...props, + }), +}); diff --git a/yarn.lock b/yarn.lock index fe53a30161..ed4bf8571a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -972,28 +972,28 @@ "@nodelib/fs.scandir" "2.1.3" fastq "^1.6.0" -"@ogre-tools/fp@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@ogre-tools/fp/-/fp-1.0.2.tgz#26c2c5cf60aa01cc94763cc68beba7052fdadfd9" - integrity sha512-ftvi/aoi5PaojWnuhHzp0YiecUd22HzW5gErsSiKyO2bps90WI4WjgY6d9hWdlzM9eukVmwM+dC6rGNlltNHNw== +"@ogre-tools/fp@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@ogre-tools/fp/-/fp-1.4.0.tgz#94c50378c5bc51ea1571f775e4428256f22c61b5" + integrity sha512-Eh/pK67CoYU/tJPWHeuNFEp+YdE8RPAAxZlSDAoXUDAd8sta3e+1vG7OEJlkYIJW4L8sCGKLWZu2DZ8uI6URhA== dependencies: lodash "^4.17.21" -"@ogre-tools/injectable-react@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@ogre-tools/injectable-react/-/injectable-react-1.3.1.tgz#dec3829ac8cf295c32cfe636ca2cd39a495d56ce" - integrity sha512-5jHL9Zcb3QkrttdzqJpN6iCXaV2+fEuDNigwH6NJ3uyV1iQWuRIctnlXxfa9qtZESwaAz7o0hAwkyqEl7YSA4g== +"@ogre-tools/injectable-react@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@ogre-tools/injectable-react/-/injectable-react-1.4.1.tgz#48d8633462189939292596a66631d6717e39e47f" + integrity sha512-SRk3QXvFCEQk4MeVG8TAomGcOt0Pf06hZ5kBh+iNIug3FLYeyWagH6OSVylZRu4u2Izd89J0taS1GmSfYDoHaA== dependencies: - "@ogre-tools/fp" "^1.0.2" - "@ogre-tools/injectable" "^1.3.0" + "@ogre-tools/fp" "^1.4.0" + "@ogre-tools/injectable" "^1.4.1" lodash "^4.17.21" -"@ogre-tools/injectable@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@ogre-tools/injectable/-/injectable-1.3.0.tgz#87d329a81575c9345b3af5c1afb0b45537f8f70e" - integrity sha512-rBy8HSExUy1r53ATvk823GXevwultKuSn3mmyRlIj7opJDVRp7Usx0bvOPs+X169jmAZNzsT6HBXbDLXt4Jl4A== +"@ogre-tools/injectable@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@ogre-tools/injectable/-/injectable-1.4.1.tgz#45414c6e13c870d7d84f4fa8e0dd67b33f6cc23e" + integrity sha512-vX4QXS/2d3g7oUenOKcv3mZRnJ5XewUMPsSsELjCyhL2caJlD0eB9J7y3y0eeFu/I18L8GC3DRs9o3QNshwN5Q== dependencies: - "@ogre-tools/fp" "^1.0.2" + "@ogre-tools/fp" "^1.4.0" lodash "^4.17.21" "@panva/asn1.js@^1.0.0":