mirror of
https://github.com/lensapp/lens.git
synced 2025-05-20 05:10:56 +00:00
Refactor ExtensionsStore (#1620)
Signed-off-by: Panu Horsmalahti <phorsmalahti@mirantis.com>
This commit is contained in:
parent
6630419457
commit
432b00b8cc
@ -1,9 +1,18 @@
|
|||||||
import { ExtensionLoader } from "../extension-loader";
|
import { ExtensionLoader } from "../extension-loader";
|
||||||
|
import { ipcRenderer } from "electron";
|
||||||
|
import { extensionsStore } from "../extensions-store";
|
||||||
|
|
||||||
const manifestPath = "manifest/path";
|
const manifestPath = "manifest/path";
|
||||||
const manifestPath2 = "manifest/path2";
|
const manifestPath2 = "manifest/path2";
|
||||||
const manifestPath3 = "manifest/path3";
|
const manifestPath3 = "manifest/path3";
|
||||||
|
|
||||||
|
jest.mock("../extensions-store", () => ({
|
||||||
|
extensionsStore: {
|
||||||
|
whenLoaded: Promise.resolve(true),
|
||||||
|
mergeState: jest.fn()
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
jest.mock(
|
jest.mock(
|
||||||
"electron",
|
"electron",
|
||||||
() => ({
|
() => ({
|
||||||
@ -129,4 +138,29 @@ describe("ExtensionLoader", () => {
|
|||||||
done();
|
done();
|
||||||
}, 10);
|
}, 10);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("updates ExtensionsStore after isEnabled is changed", async () => {
|
||||||
|
(extensionsStore.mergeState as any).mockClear();
|
||||||
|
|
||||||
|
// Disable sending events in this test
|
||||||
|
(ipcRenderer.on as any).mockImplementation();
|
||||||
|
|
||||||
|
const extensionLoader = new ExtensionLoader();
|
||||||
|
|
||||||
|
await extensionLoader.init();
|
||||||
|
|
||||||
|
expect(extensionsStore.mergeState).not.toHaveBeenCalled();
|
||||||
|
|
||||||
|
Array.from(extensionLoader.userExtensions.values())[0].isEnabled = false;
|
||||||
|
|
||||||
|
expect(extensionsStore.mergeState).toHaveBeenCalledWith({
|
||||||
|
"manifest/path": {
|
||||||
|
enabled: false,
|
||||||
|
name: "TestExtension"
|
||||||
|
},
|
||||||
|
"manifest/path2": {
|
||||||
|
enabled: true,
|
||||||
|
name: "TestExtension2"
|
||||||
|
}});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -51,6 +51,17 @@ export class ExtensionLoader {
|
|||||||
return extensions;
|
return extensions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Transform userExtensions to a state object for storing into ExtensionsStore
|
||||||
|
@computed get storeState() {
|
||||||
|
return Object.fromEntries(
|
||||||
|
Array.from(this.userExtensions)
|
||||||
|
.map(([extId, extension]) => [extId, {
|
||||||
|
enabled: extension.isEnabled,
|
||||||
|
name: extension.manifest.name,
|
||||||
|
}])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@action
|
@action
|
||||||
async init() {
|
async init() {
|
||||||
if (ipcRenderer) {
|
if (ipcRenderer) {
|
||||||
@ -59,7 +70,12 @@ export class ExtensionLoader {
|
|||||||
await this.initMain();
|
await this.initMain();
|
||||||
}
|
}
|
||||||
|
|
||||||
extensionsStore.manageState(this);
|
await Promise.all([this.whenLoaded, extensionsStore.whenLoaded]);
|
||||||
|
|
||||||
|
// save state on change `extension.isEnabled`
|
||||||
|
reaction(() => this.storeState, extensionsState => {
|
||||||
|
extensionsStore.mergeState(extensionsState);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
initExtensions(extensions?: Map<LensExtensionId, InstalledExtension>) {
|
initExtensions(extensions?: Map<LensExtensionId, InstalledExtension>) {
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
import type { LensExtensionId } from "./lens-extension";
|
import type { LensExtensionId } from "./lens-extension";
|
||||||
import type { ExtensionLoader } from "./extension-loader";
|
|
||||||
import { BaseStore } from "../common/base-store";
|
import { BaseStore } from "../common/base-store";
|
||||||
import { action, computed, observable, reaction, toJS } from "mobx";
|
import { action, computed, observable, toJS } from "mobx";
|
||||||
|
|
||||||
export interface LensExtensionsStoreModel {
|
export interface LensExtensionsStoreModel {
|
||||||
extensions: Record<LensExtensionId, LensExtensionState>;
|
extensions: Record<LensExtensionId, LensExtensionState>;
|
||||||
@ -28,29 +27,6 @@ export class ExtensionsStore extends BaseStore<LensExtensionsStoreModel> {
|
|||||||
|
|
||||||
protected state = observable.map<LensExtensionId, LensExtensionState>();
|
protected state = observable.map<LensExtensionId, LensExtensionState>();
|
||||||
|
|
||||||
protected getState(extensionLoader: ExtensionLoader) {
|
|
||||||
const state: Record<LensExtensionId, LensExtensionState> = {};
|
|
||||||
|
|
||||||
return Array.from(extensionLoader.userExtensions).reduce((state, [extId, ext]) => {
|
|
||||||
state[extId] = {
|
|
||||||
enabled: ext.isEnabled,
|
|
||||||
name: ext.manifest.name,
|
|
||||||
};
|
|
||||||
|
|
||||||
return state;
|
|
||||||
}, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
async manageState(extensionLoader: ExtensionLoader) {
|
|
||||||
await extensionLoader.whenLoaded;
|
|
||||||
await this.whenLoaded;
|
|
||||||
|
|
||||||
// save state on change `extension.isEnabled`
|
|
||||||
reaction(() => this.getState(extensionLoader), extensionsState => {
|
|
||||||
this.state.merge(extensionsState);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
isEnabled(extId: LensExtensionId) {
|
isEnabled(extId: LensExtensionId) {
|
||||||
const state = this.state.get(extId);
|
const state = this.state.get(extId);
|
||||||
|
|
||||||
@ -59,6 +35,11 @@ export class ExtensionsStore extends BaseStore<LensExtensionsStoreModel> {
|
|||||||
return Boolean(state?.enabled);
|
return Boolean(state?.enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@action
|
||||||
|
mergeState(extensionsState: Record<LensExtensionId, LensExtensionState>) {
|
||||||
|
this.state.merge(extensionsState);
|
||||||
|
}
|
||||||
|
|
||||||
@action
|
@action
|
||||||
protected fromStore({ extensions }: LensExtensionsStoreModel) {
|
protected fromStore({ extensions }: LensExtensionsStoreModel) {
|
||||||
this.state.merge(extensions);
|
this.state.merge(extensions);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user