1
0
mirror of https://github.com/lensapp/lens.git synced 2025-05-20 05:10:56 +00:00

Make BaseStore abstract (#1431)

* make BaseStore abstract so that implementers are forced to decide how to store data

Signed-off-by: Sebastian Malton <sebastian@malton.name>
This commit is contained in:
Sebastian Malton 2020-11-19 09:24:41 -05:00 committed by Alex Andreev
parent 4079214dc1
commit 4b56ab7c61
3 changed files with 27 additions and 23 deletions

View File

@ -1,11 +1,13 @@
import { Store } from "@k8slens/extensions"; import { Store } from "@k8slens/extensions";
import { toJS } from "mobx" import { toJS } from "mobx"
export type TelemetryPreferencesModel = { export type TelemetryPreferencesModel = {
enabled: boolean; enabled: boolean;
} }
export class TelemetryPreferencesStore extends Store.ExtensionStore<TelemetryPreferencesModel> { export class TelemetryPreferencesStore extends Store.ExtensionStore<TelemetryPreferencesModel> {
enabled = true;
private constructor() { private constructor() {
super({ super({
configName: "preferences-store", configName: "preferences-store",
@ -15,17 +17,13 @@ export class TelemetryPreferencesStore extends Store.ExtensionStore<TelemetryPre
}) })
} }
get enabled() { protected fromStore({ enabled }: TelemetryPreferencesModel): void {
return this.data.enabled this.enabled = enabled
}
set enabled(v: boolean) {
this.data.enabled = v
} }
toJSON(): TelemetryPreferencesModel { toJSON(): TelemetryPreferencesModel {
return toJS({ return toJS({
enabled: this.data.enabled enabled: this.enabled
}, { }, {
recurseEverything: true recurseEverything: true
}) })

View File

@ -15,7 +15,10 @@ export interface BaseStoreParams<T = any> extends ConfOptions<T> {
syncOptions?: IReactionOptions; syncOptions?: IReactionOptions;
} }
export class BaseStore<T = any> extends Singleton { /**
* Note: T should only contain base JSON serializable types.
*/
export abstract class BaseStore<T = any> extends Singleton {
protected storeConfig: Config<T>; protected storeConfig: Config<T>;
protected syncDisposers: Function[] = []; protected syncDisposers: Function[] = [];
@ -146,16 +149,19 @@ export class BaseStore<T = any> extends Singleton {
} }
} }
@action /**
protected fromStore(data: T) { * fromStore is called internally when a child class syncs with the file
if (!data) return; * system.
this.data = data; * @param data the parsed information read from the stored JSON file
} */
protected abstract fromStore(data: T): void;
// todo: use "serializr" ? /**
toJSON(): T { * toJSON is called when syncing the store to the filesystem. It should
return toJS(this.data, { * produce a JSON serializable object representaion of the current state.
recurseEverything: true, *
}) * It is recommended that a round trip is valid. Namely, calling
} * `this.fromStore(this.toJSON())` shouldn't change the state.
*/
abstract toJSON(): T;
} }

View File

@ -2,17 +2,17 @@ import { BaseStore } from "../common/base-store"
import * as path from "path" import * as path from "path"
import { LensExtension } from "./lens-extension" import { LensExtension } from "./lens-extension"
export class ExtensionStore<T = any> extends BaseStore<T> { export abstract class ExtensionStore<T> extends BaseStore<T> {
protected extension: LensExtension protected extension: LensExtension
async loadExtension(extension: LensExtension) { async loadExtension(extension: LensExtension) {
this.extension = extension this.extension = extension
await super.load() return super.load()
} }
async load() { async load() {
if (!this.extension) { return } if (!this.extension) { return }
await super.load() return super.load()
} }
protected cwd() { protected cwd() {