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

refactor to use a registrator

Signed-off-by: Jim Ehrismann <jehrismann@mirantis.com>
This commit is contained in:
Jim Ehrismann 2022-06-16 19:51:16 -04:00
parent 7acebc3696
commit 8e816e872a
4 changed files with 141 additions and 36 deletions

View File

@ -0,0 +1,22 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { computed } from "mobx";
import { AutoUpdateComponent } from "./auto-update-status-bar-item";
import { statusBarItemInjectionToken } from "./status-bar-item-injection-token";
const autoUpdateStatusBarItemInjectable = getInjectable({
id: "quit-app-separator-tray-item",
instantiate: () => ({
component: AutoUpdateComponent,
position: "left" as const,
visible: computed(() => true),
}),
injectionToken: statusBarItemInjectionToken,
});
export default autoUpdateStatusBarItemInjectable;

View File

@ -0,0 +1,20 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
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>({
id: "status-bar-item",
});

View File

@ -0,0 +1,89 @@
/**
* 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";
import { extensionRegistratorInjectionToken } from "../../../extensions/extension-loader/extension-registrator-injection-token";
import type { LensRendererExtension } from "../../../extensions/lens-renderer-extension";
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 type React from "react";
const statusBarItemRegistratorInjectable = getInjectable({
id: "status-bar-item-registrator",
instantiate: (di) => (extension, installationCounter) => {
const rendererExtension = extension as LensRendererExtension;
pipeline(
rendererExtension.statusBarItems,
flatMap(toItemInjectablesFor(rendererExtension, installationCounter)),
(injectables) => di.register(...injectables),
);
},
injectionToken: extensionRegistratorInjectionToken,
});
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}`;
let component: React.ComponentType;
let position: "left" | "right";
if (registration.item) {
const { item } = registration;
// default for old API is "right"
component =
() => (
<>
{
typeof item === "function"
? item()
: item
}
</>
);
} else if (registration.components) {
const { position: pos, Item } = registration.components;
if (pos !== "left" && pos !== "right") {
throw new TypeError("StatusBarRegistration.components.position must be either 'right' or 'left'");
}
position = pos;
component = Item;
} else {
// throw?
}
return [getInjectable({
id,
instantiate: () => ({
component,
position,
visible: computed(() => true),
}),
injectionToken: statusBarItemInjectionToken,
})];
};
return _toItemInjectables();
};

View File

@ -2,16 +2,11 @@
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import React from "react";
import { getInjectable } from "@ogre-tools/injectable";
import type { IComputedValue } from "mobx";
import { computed } from "mobx";
import type {
StatusBarItemProps,
StatusBarRegistration,
} from "./status-bar-registration";
import registeredStatusBarItemsInjectable from "./registered-status-bar-items.injectable";
import { AutoUpdateComponent } from "./auto-update-status-bar-item";
import type { StatusBarItemProps } from "./status-bar-registration";
import { StatusBarItem, statusBarItemInjectionToken } from "./status-bar-item-injection-token";
export interface StatusBarItems {
right: React.ComponentType<StatusBarItemProps>[];
@ -19,7 +14,7 @@ export interface StatusBarItems {
}
interface Dependencies {
registrations: IComputedValue<StatusBarRegistration[]>;
registrations: StatusBarItem[];
}
function getStatusBarItems({ registrations }: Dependencies): IComputedValue<StatusBarItems> {
@ -29,39 +24,18 @@ function getStatusBarItems({ registrations }: Dependencies): IComputedValue<Stat
right: [],
};
// add Lens specific components
res.left.push(AutoUpdateComponent);
// add extension-registered components
for (const registration of registrations.get()) {
for (const registration of registrations) {
if (!registration || typeof registration !== "object") {
continue;
}
if (registration.item) {
const { item } = registration;
const { position = "right", component } = registration;
// default for old API is "right"
res.right.push(
() => (
<>
{
typeof item === "function"
? item()
: item
}
</>
),
);
} else if (registration.components) {
const { position = "right", Item } = registration.components;
if (position !== "left" && position !== "right") {
throw new TypeError("StatusBarRegistration.components.position must be either 'right' or 'left'");
}
res[position].push(Item);
if (position !== "left" && position !== "right") {
throw new TypeError("StatusBarRegistration.components.position must be either 'right' or 'left'");
}
res[position].push(component);
}
// This is done so that the first ones registered are closest to the corner
@ -75,7 +49,7 @@ const statusBarItemsInjectable = getInjectable({
id: "status-bar-items",
instantiate: (di) => getStatusBarItems({
registrations: di.inject(registeredStatusBarItemsInjectable),
registrations: di.injectMany(statusBarItemInjectionToken),
}),
});