mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Simplify logic for injecting many instances which can reactively change e.g. based on extension being enabled or disabled (#5662)
* Reorganize stuff to prevent circular dependencies Signed-off-by: Janne Savolainen <janne.savolainen@live.fi> * Install injectable extension to allow injecting reactively many implementations Signed-off-by: Janne Savolainen <janne.savolainen@live.fi> * Switch to using computedInjectMany over filtering injectMany based on enabled extensions for simplicity Signed-off-by: Janne Savolainen <janne.savolainen@live.fi> * Remove await for not being needed Signed-off-by: Janne Savolainen <janne.savolainen@live.fi> * Sort dependencies alphabetically Signed-off-by: Janne Savolainen <janne.savolainen@live.fi>
This commit is contained in:
1 parent
d0ed4e46b1
commit
f87f5f245c
35 files changed
+245
-333
No files matched your search
+5
-9
@@ -13,10 +13,11 @@ const extensionPreferenceItemRegistratorInjectable = getInjectable({
|
||||
id: "extension-preference-item-registrator",
|
||||
|
||||
instantiate:
|
||||
(di) =>
|
||||
(ext, extensionInstallationCount) => {
|
||||
() =>
|
||||
(ext) => {
|
||||
const extension = ext as LensRendererExtension;
|
||||
const injectables = pipeline(
|
||||
|
||||
return pipeline(
|
||||
extension.appPreferences,
|
||||
|
||||
filter(
|
||||
@@ -27,13 +28,12 @@ const extensionPreferenceItemRegistratorInjectable = getInjectable({
|
||||
const id = `extension-preferences-item-${registration.id}-for-extension-${extension.sanitizedExtensionId}`;
|
||||
|
||||
return getInjectable({
|
||||
id: `${id}-for-instance-${extensionInstallationCount}`,
|
||||
id,
|
||||
injectionToken: extensionPreferenceItemInjectionToken,
|
||||
|
||||
instantiate: () => ({
|
||||
id: registration.id || id,
|
||||
title: registration.title,
|
||||
extension,
|
||||
|
||||
components: {
|
||||
Hint: registration.components.Hint,
|
||||
@@ -43,10 +43,6 @@ const extensionPreferenceItemRegistratorInjectable = getInjectable({
|
||||
});
|
||||
}),
|
||||
);
|
||||
|
||||
di.register(...injectables);
|
||||
|
||||
return;
|
||||
},
|
||||
|
||||
injectionToken: extensionRegistratorInjectionToken,
|
||||
|
||||
@@ -2,19 +2,11 @@
|
||||
* 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 { getInjectable, getInjectionToken } from "@ogre-tools/injectable";
|
||||
import { filter, overSome } from "lodash/fp";
|
||||
import { computed } from "mobx";
|
||||
import rendererExtensionsInjectable from "../../../extensions/renderer-extensions.injectable";
|
||||
import type { LensRendererExtension } from "../../../extensions/lens-renderer-extension";
|
||||
import { computedInjectManyInjectable } from "@ogre-tools/injectable-extension-for-mobx";
|
||||
import type { RegisteredAppPreference } from "./app-preferences/app-preference-registration";
|
||||
|
||||
interface ExtensionPreferenceItem extends RegisteredAppPreference {
|
||||
extension: LensRendererExtension;
|
||||
}
|
||||
|
||||
export const extensionPreferenceItemInjectionToken = getInjectionToken<ExtensionPreferenceItem>({
|
||||
export const extensionPreferenceItemInjectionToken = getInjectionToken<RegisteredAppPreference>({
|
||||
id: "extension-preference-item-injection-token",
|
||||
});
|
||||
|
||||
@@ -22,29 +14,10 @@ const extensionsPreferenceItemsInjectable = getInjectable({
|
||||
id: "extension-preference-items",
|
||||
|
||||
instantiate: (di) => {
|
||||
const extensions = di.inject(rendererExtensionsInjectable);
|
||||
const computedInjectMany = di.inject(computedInjectManyInjectable);
|
||||
|
||||
return computed(() => {
|
||||
const enabledExtensions = extensions.get();
|
||||
|
||||
return pipeline(
|
||||
di.injectMany(extensionPreferenceItemInjectionToken),
|
||||
|
||||
filter((item) =>
|
||||
overSome([
|
||||
isNonExtensionItem,
|
||||
isEnabledExtensionItemFor(enabledExtensions),
|
||||
])(item),
|
||||
),
|
||||
);
|
||||
});
|
||||
return computedInjectMany(extensionPreferenceItemInjectionToken);
|
||||
},
|
||||
});
|
||||
|
||||
const isNonExtensionItem = (item: ExtensionPreferenceItem) => !item.extension;
|
||||
|
||||
const isEnabledExtensionItemFor =
|
||||
(enabledExtensions: LensRendererExtension[]) => (item: ExtensionPreferenceItem) =>
|
||||
!!enabledExtensions.find((extension) => extension === item.extension);
|
||||
|
||||
export default extensionsPreferenceItemsInjectable;
|
||||
+5
-9
@@ -13,10 +13,11 @@ const extensionTelemetryPreferenceItemRegistratorInjectable = getInjectable({
|
||||
id: "extension-telemetry-preference-item-registrator",
|
||||
|
||||
instantiate:
|
||||
(di) =>
|
||||
(ext, extensionInstallationCount) => {
|
||||
() =>
|
||||
(ext) => {
|
||||
const extension = ext as LensRendererExtension;
|
||||
const injectables = pipeline(
|
||||
|
||||
return pipeline(
|
||||
extension.appPreferences,
|
||||
|
||||
filter(
|
||||
@@ -27,13 +28,12 @@ const extensionTelemetryPreferenceItemRegistratorInjectable = getInjectable({
|
||||
const id = `telemetry-preferences-item-${registration.id}-for-extension-${extension.sanitizedExtensionId}`;
|
||||
|
||||
return getInjectable({
|
||||
id: `${id}-for-instance-${extensionInstallationCount}`,
|
||||
id,
|
||||
injectionToken: telemetryPreferenceItemInjectionToken,
|
||||
|
||||
instantiate: () => ({
|
||||
id: registration.id || id,
|
||||
title: registration.title,
|
||||
extension,
|
||||
|
||||
components: {
|
||||
Hint: registration.components.Hint,
|
||||
@@ -43,10 +43,6 @@ const extensionTelemetryPreferenceItemRegistratorInjectable = getInjectable({
|
||||
});
|
||||
}),
|
||||
);
|
||||
|
||||
di.register(...injectables);
|
||||
|
||||
return;
|
||||
},
|
||||
|
||||
injectionToken: extensionRegistratorInjectionToken,
|
||||
|
||||
@@ -3,48 +3,22 @@
|
||||
* Licensed under MIT License. See LICENSE in root directory for more information.
|
||||
*/
|
||||
import { getInjectable, getInjectionToken } from "@ogre-tools/injectable";
|
||||
import rendererExtensionsInjectable from "../../../extensions/renderer-extensions.injectable";
|
||||
import { pipeline } from "@ogre-tools/fp";
|
||||
import { filter, overSome } from "lodash/fp";
|
||||
import { computed } from "mobx";
|
||||
import type { LensRendererExtension } from "../../../extensions/lens-renderer-extension";
|
||||
import { computedInjectManyInjectable } from "@ogre-tools/injectable-extension-for-mobx";
|
||||
import type { AppPreferenceRegistration } from "./app-preferences/app-preference-registration";
|
||||
|
||||
export interface ExtensionTelemetryPreferenceRegistration extends AppPreferenceRegistration {
|
||||
extension?: LensRendererExtension;
|
||||
}
|
||||
|
||||
export const telemetryPreferenceItemInjectionToken = getInjectionToken<ExtensionTelemetryPreferenceRegistration>({
|
||||
export const telemetryPreferenceItemInjectionToken = getInjectionToken<AppPreferenceRegistration>({
|
||||
id: "telemetry-preference-item-injection-token",
|
||||
});
|
||||
|
||||
const telemetryPreferenceItemsInjectable = getInjectable({
|
||||
id: "telemetry-preference-items",
|
||||
|
||||
instantiate: (di) => {
|
||||
const extensions = di.inject(rendererExtensionsInjectable);
|
||||
const computedInjectMany = di.inject(computedInjectManyInjectable);
|
||||
|
||||
return computed(() => {
|
||||
const enabledExtensions = extensions.get();
|
||||
|
||||
return pipeline(
|
||||
di.injectMany(telemetryPreferenceItemInjectionToken),
|
||||
filter((item) =>
|
||||
overSome([
|
||||
isNonExtensionItem,
|
||||
isEnabledExtensionItemFor(enabledExtensions),
|
||||
])(item),
|
||||
),
|
||||
);
|
||||
});
|
||||
return computedInjectMany(telemetryPreferenceItemInjectionToken);
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
const isNonExtensionItem = (item: ExtensionTelemetryPreferenceRegistration) => !item.extension;
|
||||
|
||||
const isEnabledExtensionItemFor =
|
||||
(enabledExtensions: LensRendererExtension[]) => (item: ExtensionTelemetryPreferenceRegistration) =>
|
||||
!!enabledExtensions.find((extension) => extension === item.extension);
|
||||
|
||||
|
||||
export default telemetryPreferenceItemsInjectable;
|
||||
|
||||
@@ -11,13 +11,13 @@ import { ExtensionSettings } from "./extension-settings";
|
||||
import type { IComputedValue } from "mobx";
|
||||
import { withInjectables } from "@ogre-tools/injectable-react";
|
||||
import { Preferences } from "./preferences";
|
||||
import type { ExtensionTelemetryPreferenceRegistration } from "./telemetry-preference-items.injectable";
|
||||
import telemetryPreferenceItemsInjectable from "./telemetry-preference-items.injectable";
|
||||
import sentryDnsUrlInjectable from "./sentry-dns-url.injectable";
|
||||
import userStoreInjectable from "../../../common/user-store/user-store.injectable";
|
||||
import type { AppPreferenceRegistration } from "./app-preferences/app-preference-registration";
|
||||
|
||||
interface Dependencies {
|
||||
telemetryPreferenceItems: IComputedValue<ExtensionTelemetryPreferenceRegistration[]>;
|
||||
telemetryPreferenceItems: IComputedValue<AppPreferenceRegistration[]>;
|
||||
sentryDnsUrl: string;
|
||||
userStore: UserStore;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user