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

refactored for the simplified logic for injecting many instances PR

Signed-off-by: Jim Ehrismann <jehrismann@mirantis.com>
This commit is contained in:
Jim Ehrismann 2022-06-21 17:08:01 -04:00
parent 4be6bd02dc
commit 7cbcc184a0
3 changed files with 27 additions and 24 deletions

View File

@ -5,14 +5,11 @@
import { getInjectionToken } from "@ogre-tools/injectable";
import type { IComputedValue } from "mobx";
import type React from "react";
import type { LensRendererExtension } from "../../../extensions/lens-renderer-extension";
export interface StatusBarItem {
component: React.ComponentType<any>;
position: "left" | "right";
visible: IComputedValue<boolean>;
extension?: LensRendererExtension;
}
export const statusBarItemInjectionToken = getInjectionToken<StatusBarItem>({

View File

@ -2,8 +2,6 @@
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { pipeline } from "@ogre-tools/fp";
import { flatMap } from "lodash/fp";
import type { Injectable } from "@ogre-tools/injectable";
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
@ -12,21 +10,18 @@ import type { LensRendererExtension } from "../../../extensions/lens-renderer-ex
import type { StatusBarItem } from "./status-bar-item-injection-token";
import { statusBarItemInjectionToken } from "./status-bar-item-injection-token";
import type { StatusBarRegistration } from "./status-bar-registration";
import * as uuid from "uuid";
import React from "react";
import getRandomIdInjectable from "../../../common/utils/get-random-id.injectable";
const statusBarItemRegistratorInjectable = getInjectable({
id: "status-bar-item-registrator",
instantiate: (di) => (extension, installationCounter) => {
instantiate: (di) => (extension) => {
const rendererExtension = extension as LensRendererExtension;
const getRandomId = di.inject(getRandomIdInjectable);
pipeline(
rendererExtension.statusBarItems,
flatMap(toItemInjectablesFor(rendererExtension, installationCounter)),
(injectables) => di.register(...injectables),
return rendererExtension.statusBarItems.flatMap(
toItemInjectableFor(rendererExtension, getRandomId),
);
},
@ -35,9 +30,9 @@ const statusBarItemRegistratorInjectable = getInjectable({
export default statusBarItemRegistratorInjectable;
const toItemInjectablesFor = (extension: LensRendererExtension, installationCounter: number) => {
const _toItemInjectables = () => (registration: StatusBarRegistration): Injectable<StatusBarItem, StatusBarItem, void>[] => {
const id = `${uuid.v4()}-status-bar-item-for-extension-${extension.sanitizedExtensionId}-instance-${installationCounter}`;
const toItemInjectableFor = (extension: LensRendererExtension, getRandomId: () => string) => {
const _toItemInjectable = () => (registration: StatusBarRegistration): Injectable<StatusBarItem, StatusBarItem, void>[] => {
const id = `${getRandomId()}-status-bar-item-for-extension-${extension.sanitizedExtensionId}`;
let component: React.ComponentType;
let position: "left" | "right";
@ -56,7 +51,7 @@ const toItemInjectablesFor = (extension: LensRendererExtension, installationCoun
</>
);
} else if (registration.components) {
const { position: pos, Item } = registration.components;
const { position: pos = "right", Item } = registration.components;
if (pos !== "left" && pos !== "right") {
throw new TypeError("StatusBarRegistration.components.position must be either 'right' or 'left'");
@ -83,7 +78,7 @@ const toItemInjectablesFor = (extension: LensRendererExtension, installationCoun
};
return _toItemInjectables();
return _toItemInjectable();
};

View File

@ -8,6 +8,7 @@ import { computed } from "mobx";
import type { StatusBarItemProps } from "./status-bar-registration";
import type { StatusBarItem } from "./status-bar-item-injection-token";
import { statusBarItemInjectionToken } from "./status-bar-item-injection-token";
import { computedInjectManyInjectable } from "@ogre-tools/injectable-extension-for-mobx";
export interface StatusBarItems {
right: React.ComponentType<StatusBarItemProps>[];
@ -15,7 +16,7 @@ export interface StatusBarItems {
}
interface Dependencies {
registrations: StatusBarItem[];
registrations: IComputedValue<StatusBarItem[]>;
}
function getStatusBarItems({ registrations }: Dependencies): IComputedValue<StatusBarItems> {
@ -25,17 +26,21 @@ function getStatusBarItems({ registrations }: Dependencies): IComputedValue<Stat
right: [],
};
for (const registration of registrations) {
for (const registration of registrations.get()) {
if (!registration || typeof registration !== "object") {
continue;
}
const { position = "right", component } = registration;
const { position = "right", component, visible } = registration;
if (position !== "left" && position !== "right") {
throw new TypeError("StatusBarRegistration.components.position must be either 'right' or 'left'");
}
if (!visible) {
continue;
}
res[position].push(component);
}
@ -49,9 +54,15 @@ function getStatusBarItems({ registrations }: Dependencies): IComputedValue<Stat
const statusBarItemsInjectable = getInjectable({
id: "status-bar-items",
instantiate: (di) => getStatusBarItems({
registrations: di.injectMany(statusBarItemInjectionToken),
}),
instantiate: (di) => {
const computedInjectMany = di.inject(
computedInjectManyInjectable,
);
return getStatusBarItems({
registrations: computedInjectMany(statusBarItemInjectionToken),
});
},
});