mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Register/reregister injectables by id.
Signed-off-by: Panu Horsmalahti <phorsmalahti@mirantis.com>
This commit is contained in:
parent
7a8c3effd0
commit
2b3862b39e
@ -2,7 +2,9 @@
|
|||||||
* 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 type { Injectable } from "@ogre-tools/injectable";
|
||||||
import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable";
|
import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable";
|
||||||
|
import { difference, find, map } from "lodash";
|
||||||
import { reaction, runInAction } from "mobx";
|
import { reaction, runInAction } from "mobx";
|
||||||
import { disposer } from "../../../common/utils/disposer";
|
import { disposer } from "../../../common/utils/disposer";
|
||||||
import type { LensExtension } from "../../lens-extension";
|
import type { LensExtension } from "../../lens-extension";
|
||||||
@ -13,6 +15,16 @@ export interface Extension {
|
|||||||
deregister: () => void;
|
deregister: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const idsToInjectables = (ids: string[], injectables: Injectable<any, any, any>[]) => ids.map(id => {
|
||||||
|
const injectable = find(injectables, { id });
|
||||||
|
|
||||||
|
if (!injectable) {
|
||||||
|
throw new Error(`Injectable ${id} not found`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return injectable;
|
||||||
|
});
|
||||||
|
|
||||||
const extensionInjectable = getInjectable({
|
const extensionInjectable = getInjectable({
|
||||||
id: "extension",
|
id: "extension",
|
||||||
|
|
||||||
@ -34,13 +46,20 @@ const extensionInjectable = getInjectable({
|
|||||||
// we need to update the registered injectables with a reaction every time they change
|
// we need to update the registered injectables with a reaction every time they change
|
||||||
reaction(
|
reaction(
|
||||||
() => Array.isArray(injectables) ? injectables : injectables.get(),
|
() => Array.isArray(injectables) ? injectables : injectables.get(),
|
||||||
(currentInjectables, previousInjectables) => {
|
(currentInjectables, previousInjectables = []) => {
|
||||||
// On the second reaction remove the previously registered injectables to avoid duplicate injectables
|
// Register new injectables and deregister removed injectables by id
|
||||||
if (previousInjectables) {
|
const currentIds = map(currentInjectables, "id");
|
||||||
childDi.deregister(...previousInjectables);
|
const previousIds = map(previousInjectables, "id");
|
||||||
|
const idsToAdd = difference(currentIds, previousIds);
|
||||||
|
const idsToRemove = previousIds.filter(previousId => !currentIds.includes(previousId));
|
||||||
|
|
||||||
|
if (idsToRemove.length > 0) {
|
||||||
|
childDi.deregister(...idsToInjectables(idsToRemove, previousInjectables));
|
||||||
}
|
}
|
||||||
|
|
||||||
childDi.register(...currentInjectables);
|
if (idsToAdd.length > 0) {
|
||||||
|
childDi.register(...idsToInjectables(idsToAdd, currentInjectables));
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
fireImmediately: true,
|
fireImmediately: true,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -258,5 +258,21 @@ describe("preferences: extension adding tray items", () => {
|
|||||||
),
|
),
|
||||||
).toBeNull();
|
).toBeNull();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("given items are removed and one added, it's shown", async () => {
|
||||||
|
menuItems.replace([]);
|
||||||
|
menuItems.push({
|
||||||
|
id: "some-added",
|
||||||
|
label: "some-added",
|
||||||
|
click: () => {},
|
||||||
|
visible: computed(() => true),
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(
|
||||||
|
builder.tray.get(
|
||||||
|
"some-added-tray-menu-item-for-extension-some-extension",
|
||||||
|
),
|
||||||
|
).not.toBeNull();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user