diff --git a/packages/core/src/common/weblinks-store/weblink-store.injectable.ts b/packages/core/src/common/weblinks-store/weblink-store.injectable.ts index 843c8716e5..d0e7458f61 100644 --- a/packages/core/src/common/weblinks-store/weblink-store.injectable.ts +++ b/packages/core/src/common/weblinks-store/weblink-store.injectable.ts @@ -3,15 +3,8 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ import { getInjectable } from "@ogre-tools/injectable"; -import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import { baseStoreIpcChannelPrefixesInjectionToken } from "../base-store/channel-prefix"; -import { shouldBaseStoreDisableSyncInIpcListenerInjectionToken } from "../base-store/disable-sync"; +import createBaseStoreInjectable from "../base-store/create-base-store.injectable"; import storeMigrationsInjectable from "../base-store/migrations.injectable"; -import { persistStateToConfigInjectionToken } from "../base-store/save-to-file"; -import getConfigurationFileModelInjectable from "../get-configuration-file-model/get-configuration-file-model.injectable"; -import loggerInjectable from "../logger.injectable"; -import getBasenameOfPathInjectable from "../path/get-basename.injectable"; -import { enlistMessageChannelListenerInjectionToken } from "@k8slens/messaging"; import storeMigrationVersionInjectable from "../vars/store-migration-version.injectable"; import { weblinkStoreMigrationInjectionToken } from "./migration-token"; import { WeblinkStore } from "./weblink-store"; @@ -19,16 +12,9 @@ import { WeblinkStore } from "./weblink-store"; const weblinkStoreInjectable = getInjectable({ id: "weblink-store", instantiate: (di) => new WeblinkStore({ - directoryForUserData: di.inject(directoryForUserDataInjectable), - getConfigurationFileModel: di.inject(getConfigurationFileModelInjectable), - logger: di.inject(loggerInjectable), storeMigrationVersion: di.inject(storeMigrationVersionInjectable), migrations: di.inject(storeMigrationsInjectable, weblinkStoreMigrationInjectionToken), - getBasenameOfPath: di.inject(getBasenameOfPathInjectable), - ipcChannelPrefixes: di.inject(baseStoreIpcChannelPrefixesInjectionToken), - persistStateToConfig: di.inject(persistStateToConfigInjectionToken), - enlistMessageChannelListener: di.inject(enlistMessageChannelListenerInjectionToken), - shouldDisableSyncInListener: di.inject(shouldBaseStoreDisableSyncInIpcListenerInjectionToken), + createBaseStore: di.inject(createBaseStoreInjectable), }), }); diff --git a/packages/core/src/common/weblinks-store/weblink-store.ts b/packages/core/src/common/weblinks-store/weblink-store.ts index 2044ca08c1..0f4b7ba0a7 100644 --- a/packages/core/src/common/weblinks-store/weblink-store.ts +++ b/packages/core/src/common/weblinks-store/weblink-store.ts @@ -3,11 +3,11 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import { action, comparer, observable, makeObservable } from "mobx"; -import type { BaseStoreDependencies } from "../base-store/base-store"; -import { BaseStore } from "../base-store/base-store"; +import { action, comparer, observable, runInAction } from "mobx"; +import type { BaseStore } from "../base-store/base-store"; import * as uuid from "uuid"; -import { toJS } from "../utils"; +import type { CreateBaseStore } from "../base-store/create-base-store.injectable"; +import type { Migrations } from "conf/dist/source/types"; export interface WeblinkData { id: string; @@ -26,49 +26,55 @@ export interface WeblinkStoreModel { weblinks: WeblinkData[]; } -export class WeblinkStore extends BaseStore { - @observable weblinks: WeblinkData[] = []; +interface Dependencies { + readonly storeMigrationVersion: string; + readonly migrations: Migrations>; + createBaseStore: CreateBaseStore; +} - constructor(deps: BaseStoreDependencies) { - super(deps, { +export class WeblinkStore { + private readonly store: BaseStore; + + readonly weblinks = observable.array(); + + constructor(private readonly dependencies: Dependencies) { + this.store = this.dependencies.createBaseStore({ configName: "lens-weblink-store", accessPropertiesByDotNotation: false, // To make dots safe in cluster context names syncOptions: { equals: comparer.structural, }, + projectVersion: this.dependencies.storeMigrationVersion, + migrations: this.dependencies.migrations, + fromStore: action(({ weblinks = [] }) => { + this.weblinks.replace(weblinks); + }), + toJSON: () => ({ + weblinks: this.weblinks.toJSON(), + }), }); - makeObservable(this); - this.load(); - } - @action - protected fromStore(data: Partial = {}) { - this.weblinks = data.weblinks || []; + this.store.load(); } add(data: WeblinkCreateOptions) { - const { - id = uuid.v4(), - name, - url, - } = data; - const weblink: WeblinkData = { id, name, url }; + return runInAction(() => { + const { + id = uuid.v4(), + name, + url, + } = data; + const weblink: WeblinkData = { id, name, url }; - this.weblinks.push(weblink); + this.weblinks.push(weblink); - return weblink; + return weblink; + }); } - @action removeById(id: string) { - this.weblinks = this.weblinks.filter((w) => w.id !== id); - } - - toJSON(): WeblinkStoreModel { - const model: WeblinkStoreModel = { - weblinks: this.weblinks, - }; - - return toJS(model); + runInAction(() => { + this.weblinks.replace(this.weblinks.filter((w) => w.id !== id)); + }); } }