From c48135e0f385de19d2cfa79c9467096f987e61eb Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 17 Mar 2021 14:25:42 +0200 Subject: [PATCH] responding to comments, dock-tab.store.ts refactoring Signed-off-by: Roman --- .../components/dock/create-resource.store.ts | 2 +- .../components/dock/dock-tab.store.ts | 57 +++++++++++-------- .../components/dock/edit-resource.store.ts | 7 ++- .../components/dock/install-chart.store.ts | 2 +- src/renderer/components/dock/log-tab.store.ts | 2 +- .../components/dock/upgrade-chart.store.ts | 2 +- src/renderer/utils/createStorage.ts | 4 +- 7 files changed, 45 insertions(+), 31 deletions(-) diff --git a/src/renderer/components/dock/create-resource.store.ts b/src/renderer/components/dock/create-resource.store.ts index 6b614db00b..8933ddf4d0 100644 --- a/src/renderer/components/dock/create-resource.store.ts +++ b/src/renderer/components/dock/create-resource.store.ts @@ -6,7 +6,7 @@ import { dockStore, IDockTab, TabKind } from "./dock.store"; export class CreateResourceStore extends DockTabStore { constructor() { super({ - storageName: "create_resource" + storageKey: "create_resource" }); } } diff --git a/src/renderer/components/dock/dock-tab.store.ts b/src/renderer/components/dock/dock-tab.store.ts index 3a9485712e..117d7118df 100644 --- a/src/renderer/components/dock/dock-tab.store.ts +++ b/src/renderer/components/dock/dock-tab.store.ts @@ -2,29 +2,39 @@ import { autorun, observable, reaction } from "mobx"; import { autobind, createStorage, StorageHelper } from "../../utils"; import { dockStore, TabId } from "./dock.store"; -interface Options { - storageName?: string; // persistence key - storageSerializer?: (data: T) => Partial; // allow to customize data before saving +export interface DockTabStoreOptions { + autoInit?: boolean; // load data from storage when `storageKey` is provided and bind events, default: true + storageKey?: string; // save data to persistent storage under the key } +export type DockTabStorageState = Record; + @autobind() -export class DockTabStore { - private storage?: StorageHelper>; +export class DockTabStore { + private storage?: StorageHelper>; protected data = observable.map(); - constructor(protected options: Options = {}) { - this.init(); + constructor(protected options: DockTabStoreOptions = {}) { + this.options = { + autoInit: true, + ...this.options, + }; + + if (this.options.autoInit) { + this.init(); + } } - protected async init() { - const { storageName: storageKey } = this.options; + protected init() { + const { storageKey } = this.options; // auto-save to local-storage if (storageKey) { this.storage = createStorage(storageKey, {}); - await this.storage.whenReady; - this.data.replace(this.storage.get()); - reaction(() => this.serializeData(), (data: Record) => this.storage.set(data)); + this.storage.whenReady.then(() => { + this.data.replace(this.storage.get()); + reaction(() => this.getStorableData(), data => this.storage.set(data)); + }); } // clear data for closed tabs @@ -39,21 +49,20 @@ export class DockTabStore { }); } - protected serializeData(): Record> { - const data = this.data.toJSON(); - const { storageSerializer } = this.options; - - if (storageSerializer) { - return Object.entries(data).reduce((data, [tabId, tabData]) => { - data[tabId] = storageSerializer(tabData) as T; - - return data; - }, data); - } - + protected serializeBeforeSave(data: T): T { return data; } + protected getStorableData(): DockTabStorageState { + const allTabsData = this.data.toJSON(); + + return Object.entries(allTabsData).reduce((data, [tabId, tabData]) => { + data[tabId] = this.serializeBeforeSave(tabData); + + return data; + }, allTabsData); + } + getData(tabId: TabId) { return this.data.get(tabId); } diff --git a/src/renderer/components/dock/edit-resource.store.ts b/src/renderer/components/dock/edit-resource.store.ts index ea41b78d55..1509289e28 100644 --- a/src/renderer/components/dock/edit-resource.store.ts +++ b/src/renderer/components/dock/edit-resource.store.ts @@ -16,8 +16,7 @@ export class EditResourceStore extends DockTabStore { constructor() { super({ - storageName: "edit_resource_store", - storageSerializer: ({ draft, ...data }) => data, // skip saving draft in local-storage + storageKey: "edit_resource_store", }); autorun(() => { @@ -47,6 +46,10 @@ export class EditResourceStore extends DockTabStore { }); }); } + + protected serializeBeforeSave({ draft, ...data }: KubeEditResource) { + return data; // skip saving draft to local-storage + } getTabByResource(object: KubeObject): IDockTab { const [tabId] = Array.from(this.data).find(([, { resource }]) => { diff --git a/src/renderer/components/dock/install-chart.store.ts b/src/renderer/components/dock/install-chart.store.ts index 4979bb28a0..7a11deb65a 100644 --- a/src/renderer/components/dock/install-chart.store.ts +++ b/src/renderer/components/dock/install-chart.store.ts @@ -22,7 +22,7 @@ export class InstallChartStore extends DockTabStore { constructor() { super({ - storageName: "install_charts" + storageKey: "install_charts" }); autorun(() => { const { selectedTab, isOpen } = dockStore; diff --git a/src/renderer/components/dock/log-tab.store.ts b/src/renderer/components/dock/log-tab.store.ts index 3eec7812be..ca5d49873b 100644 --- a/src/renderer/components/dock/log-tab.store.ts +++ b/src/renderer/components/dock/log-tab.store.ts @@ -27,7 +27,7 @@ interface WorkloadLogsTabData { export class LogTabStore extends DockTabStore { constructor() { super({ - storageName: "pod_logs" + storageKey: "pod_logs" }); reaction(() => podsStore.items.length, () => { diff --git a/src/renderer/components/dock/upgrade-chart.store.ts b/src/renderer/components/dock/upgrade-chart.store.ts index 63468f3180..78fb4d5072 100644 --- a/src/renderer/components/dock/upgrade-chart.store.ts +++ b/src/renderer/components/dock/upgrade-chart.store.ts @@ -16,7 +16,7 @@ export class UpgradeChartStore extends DockTabStore { constructor() { super({ - storageName: "chart_releases" + storageKey: "chart_releases" }); autorun(() => { diff --git a/src/renderer/utils/createStorage.ts b/src/renderer/utils/createStorage.ts index 0f1d6f55c2..623f657461 100755 --- a/src/renderer/utils/createStorage.ts +++ b/src/renderer/utils/createStorage.ts @@ -32,7 +32,9 @@ export function createStorage(key: string, defaultValue?: T, observableOption reaction(() => storage.toJSON(), saveFile, { delay: 250 }); // remove json-file when cluster deleted - when(() => clusterStore.removedClusters.has(clusterId)).then(removeFile); + if (clusterId !== undefined) { + when(() => clusterStore.removedClusters.has(clusterId)).then(removeFile); + } } async function saveFile(json = {}) {