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

View File

@ -2,8 +2,6 @@
* Copyright (c) OpenLens Authors. All rights reserved. * Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information. * 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 type { Injectable } from "@ogre-tools/injectable";
import { getInjectable } from "@ogre-tools/injectable"; import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx"; 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 type { StatusBarItem } from "./status-bar-item-injection-token";
import { statusBarItemInjectionToken } from "./status-bar-item-injection-token"; import { statusBarItemInjectionToken } from "./status-bar-item-injection-token";
import type { StatusBarRegistration } from "./status-bar-registration"; import type { StatusBarRegistration } from "./status-bar-registration";
import * as uuid from "uuid";
import React from "react"; import React from "react";
import getRandomIdInjectable from "../../../common/utils/get-random-id.injectable";
const statusBarItemRegistratorInjectable = getInjectable({ const statusBarItemRegistratorInjectable = getInjectable({
id: "status-bar-item-registrator", id: "status-bar-item-registrator",
instantiate: (di) => (extension, installationCounter) => { instantiate: (di) => (extension) => {
const rendererExtension = extension as LensRendererExtension; const rendererExtension = extension as LensRendererExtension;
const getRandomId = di.inject(getRandomIdInjectable);
pipeline( return rendererExtension.statusBarItems.flatMap(
rendererExtension.statusBarItems, toItemInjectableFor(rendererExtension, getRandomId),
flatMap(toItemInjectablesFor(rendererExtension, installationCounter)),
(injectables) => di.register(...injectables),
); );
}, },
@ -35,9 +30,9 @@ const statusBarItemRegistratorInjectable = getInjectable({
export default statusBarItemRegistratorInjectable; export default statusBarItemRegistratorInjectable;
const toItemInjectablesFor = (extension: LensRendererExtension, installationCounter: number) => { const toItemInjectableFor = (extension: LensRendererExtension, getRandomId: () => string) => {
const _toItemInjectables = () => (registration: StatusBarRegistration): Injectable<StatusBarItem, StatusBarItem, void>[] => { const _toItemInjectable = () => (registration: StatusBarRegistration): Injectable<StatusBarItem, StatusBarItem, void>[] => {
const id = `${uuid.v4()}-status-bar-item-for-extension-${extension.sanitizedExtensionId}-instance-${installationCounter}`; const id = `${getRandomId()}-status-bar-item-for-extension-${extension.sanitizedExtensionId}`;
let component: React.ComponentType; let component: React.ComponentType;
let position: "left" | "right"; let position: "left" | "right";
@ -56,7 +51,7 @@ const toItemInjectablesFor = (extension: LensRendererExtension, installationCoun
</> </>
); );
} else if (registration.components) { } else if (registration.components) {
const { position: pos, Item } = registration.components; const { position: pos = "right", Item } = registration.components;
if (pos !== "left" && pos !== "right") { if (pos !== "left" && pos !== "right") {
throw new TypeError("StatusBarRegistration.components.position must be either 'right' or 'left'"); 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 { StatusBarItemProps } from "./status-bar-registration";
import type { StatusBarItem } from "./status-bar-item-injection-token"; import type { StatusBarItem } from "./status-bar-item-injection-token";
import { statusBarItemInjectionToken } 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 { export interface StatusBarItems {
right: React.ComponentType<StatusBarItemProps>[]; right: React.ComponentType<StatusBarItemProps>[];
@ -15,7 +16,7 @@ export interface StatusBarItems {
} }
interface Dependencies { interface Dependencies {
registrations: StatusBarItem[]; registrations: IComputedValue<StatusBarItem[]>;
} }
function getStatusBarItems({ registrations }: Dependencies): IComputedValue<StatusBarItems> { function getStatusBarItems({ registrations }: Dependencies): IComputedValue<StatusBarItems> {
@ -25,17 +26,21 @@ function getStatusBarItems({ registrations }: Dependencies): IComputedValue<Stat
right: [], right: [],
}; };
for (const registration of registrations) { for (const registration of registrations.get()) {
if (!registration || typeof registration !== "object") { if (!registration || typeof registration !== "object") {
continue; continue;
} }
const { position = "right", component } = registration; const { position = "right", component, visible } = registration;
if (position !== "left" && position !== "right") { if (position !== "left" && position !== "right") {
throw new TypeError("StatusBarRegistration.components.position must be either 'right' or 'left'"); throw new TypeError("StatusBarRegistration.components.position must be either 'right' or 'left'");
} }
if (!visible) {
continue;
}
res[position].push(component); res[position].push(component);
} }
@ -49,9 +54,15 @@ function getStatusBarItems({ registrations }: Dependencies): IComputedValue<Stat
const statusBarItemsInjectable = getInjectable({ const statusBarItemsInjectable = getInjectable({
id: "status-bar-items", id: "status-bar-items",
instantiate: (di) => getStatusBarItems({ instantiate: (di) => {
registrations: di.injectMany(statusBarItemInjectionToken), const computedInjectMany = di.inject(
}), computedInjectManyInjectable,
);
return getStatusBarItems({
registrations: computedInjectMany(statusBarItemInjectionToken),
});
},
}); });