1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00
lens/src/renderer/components/status-bar/status-bar-item-registrator.injectable.tsx
Alex Andreev 491082f784
Add data-origin to status bar items for better observability (#6400)
* Passing id to status-bar-items

Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>

* Add data-origin prop for status bar items

Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>

* Fixing status bar tests

Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>

* Update snapshots

Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>

* Fix linter

Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>

* Rename id -> origin because it is not unique

Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>

Signed-off-by: Alex Andreev <alex.andreev.email@gmail.com>
2022-10-14 09:27:10 +03:00

89 lines
3.0 KiB
TypeScript

/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { Injectable } from "@ogre-tools/injectable";
import { getInjectable } from "@ogre-tools/injectable";
import type { IComputedValue } from "mobx";
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 React from "react";
import getRandomIdInjectable from "../../../common/utils/get-random-id.injectable";
import loggerInjectable from "../../../common/logger.injectable";
import type { Logger } from "../../../common/logger";
const statusBarItemRegistratorInjectable = getInjectable({
id: "status-bar-item-registrator",
instantiate: (di) => (extension) => {
const rendererExtension = extension as LensRendererExtension;
const getRandomId = di.inject(getRandomIdInjectable);
const logger = di.inject(loggerInjectable);
return rendererExtension.statusBarItems.flatMap(
toItemInjectableFor(rendererExtension, getRandomId, logger),
);
},
injectionToken: extensionRegistratorInjectionToken,
});
export default statusBarItemRegistratorInjectable;
const toItemInjectableFor = (extension: LensRendererExtension, getRandomId: () => string, logger: Logger) => {
return (registration: StatusBarRegistration): Injectable<StatusBarItem, StatusBarItem, void>[] => {
const id = `${getRandomId()}-status-bar-item-for-extension-${extension.sanitizedExtensionId}`;
let component: React.ComponentType;
let position: "left" | "right";
const visible: IComputedValue<boolean> | undefined = registration?.visible;
if (registration?.item) {
const { item } = registration;
position = "right";
component =
() => (
<>
{
typeof item === "function"
? item()
: item
}
</>
);
} else if (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'");
}
position = pos;
component = Item;
} else {
logger.warn("StatusBarRegistration must have valid item or components field");
return [];
}
return [getInjectable({
id,
instantiate: () => ({
origin: extension.sanitizedExtensionId,
component,
position,
visible: visible ?? computed(() => true),
}),
injectionToken: statusBarItemInjectionToken,
})];
};
};