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

responding to comments, dock-tab.store.ts refactoring

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman 2021-03-17 14:25:42 +02:00
parent cd1749f331
commit c48135e0f3
7 changed files with 45 additions and 31 deletions

View File

@ -6,7 +6,7 @@ import { dockStore, IDockTab, TabKind } from "./dock.store";
export class CreateResourceStore extends DockTabStore<string> { export class CreateResourceStore extends DockTabStore<string> {
constructor() { constructor() {
super({ super({
storageName: "create_resource" storageKey: "create_resource"
}); });
} }
} }

View File

@ -2,29 +2,39 @@ import { autorun, observable, reaction } from "mobx";
import { autobind, createStorage, StorageHelper } from "../../utils"; import { autobind, createStorage, StorageHelper } from "../../utils";
import { dockStore, TabId } from "./dock.store"; import { dockStore, TabId } from "./dock.store";
interface Options<T = any> { export interface DockTabStoreOptions {
storageName?: string; // persistence key autoInit?: boolean; // load data from storage when `storageKey` is provided and bind events, default: true
storageSerializer?: (data: T) => Partial<T>; // allow to customize data before saving storageKey?: string; // save data to persistent storage under the key
} }
export type DockTabStorageState<T> = Record<TabId, T>;
@autobind() @autobind()
export class DockTabStore<T = any> { export class DockTabStore<T> {
private storage?: StorageHelper<Record<TabId, T>>; private storage?: StorageHelper<DockTabStorageState<T>>;
protected data = observable.map<TabId, T>(); protected data = observable.map<TabId, T>();
constructor(protected options: Options<T> = {}) { constructor(protected options: DockTabStoreOptions = {}) {
this.init(); this.options = {
autoInit: true,
...this.options,
};
if (this.options.autoInit) {
this.init();
}
} }
protected async init() { protected init() {
const { storageName: storageKey } = this.options; const { storageKey } = this.options;
// auto-save to local-storage // auto-save to local-storage
if (storageKey) { if (storageKey) {
this.storage = createStorage(storageKey, {}); this.storage = createStorage(storageKey, {});
await this.storage.whenReady; this.storage.whenReady.then(() => {
this.data.replace(this.storage.get()); this.data.replace(this.storage.get());
reaction(() => this.serializeData(), (data: Record<TabId, T>) => this.storage.set(data)); reaction(() => this.getStorableData(), data => this.storage.set(data));
});
} }
// clear data for closed tabs // clear data for closed tabs
@ -39,21 +49,20 @@ export class DockTabStore<T = any> {
}); });
} }
protected serializeData(): Record<TabId, Partial<T>> { protected serializeBeforeSave(data: T): T {
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);
}
return data; return data;
} }
protected getStorableData(): DockTabStorageState<T> {
const allTabsData = this.data.toJSON();
return Object.entries(allTabsData).reduce((data, [tabId, tabData]) => {
data[tabId] = this.serializeBeforeSave(tabData);
return data;
}, allTabsData);
}
getData(tabId: TabId) { getData(tabId: TabId) {
return this.data.get(tabId); return this.data.get(tabId);
} }

View File

@ -16,8 +16,7 @@ export class EditResourceStore extends DockTabStore<KubeEditResource> {
constructor() { constructor() {
super({ super({
storageName: "edit_resource_store", storageKey: "edit_resource_store",
storageSerializer: ({ draft, ...data }) => data, // skip saving draft in local-storage
}); });
autorun(() => { autorun(() => {
@ -47,6 +46,10 @@ export class EditResourceStore extends DockTabStore<KubeEditResource> {
}); });
}); });
} }
protected serializeBeforeSave({ draft, ...data }: KubeEditResource) {
return data; // skip saving draft to local-storage
}
getTabByResource(object: KubeObject): IDockTab { getTabByResource(object: KubeObject): IDockTab {
const [tabId] = Array.from(this.data).find(([, { resource }]) => { const [tabId] = Array.from(this.data).find(([, { resource }]) => {

View File

@ -22,7 +22,7 @@ export class InstallChartStore extends DockTabStore<IChartInstallData> {
constructor() { constructor() {
super({ super({
storageName: "install_charts" storageKey: "install_charts"
}); });
autorun(() => { autorun(() => {
const { selectedTab, isOpen } = dockStore; const { selectedTab, isOpen } = dockStore;

View File

@ -27,7 +27,7 @@ interface WorkloadLogsTabData {
export class LogTabStore extends DockTabStore<LogTabData> { export class LogTabStore extends DockTabStore<LogTabData> {
constructor() { constructor() {
super({ super({
storageName: "pod_logs" storageKey: "pod_logs"
}); });
reaction(() => podsStore.items.length, () => { reaction(() => podsStore.items.length, () => {

View File

@ -16,7 +16,7 @@ export class UpgradeChartStore extends DockTabStore<IChartUpgradeData> {
constructor() { constructor() {
super({ super({
storageName: "chart_releases" storageKey: "chart_releases"
}); });
autorun(() => { autorun(() => {

View File

@ -32,7 +32,9 @@ export function createStorage<T>(key: string, defaultValue?: T, observableOption
reaction(() => storage.toJSON(), saveFile, { delay: 250 }); reaction(() => storage.toJSON(), saveFile, { delay: 250 });
// remove json-file when cluster deleted // 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 = {}) { async function saveFile(json = {}) {