Files
lens/src/renderer/components/dock/upgrade-chart.store.ts
T
Roman a0193a2cda Merge remote-tracking branch 'origin/master' into mobx-6.2
# Conflicts:
#	extensions/survey/package-lock.json
#	extensions/survey/package.json
#	extensions/survey/src/survey-preferences-store.ts
#	extensions/telemetry/src/telemetry-preferences-store.ts
#	src/common/user-store.ts
#	src/extensions/core-api/catalog.ts
#	src/extensions/extension-discovery.ts
#	src/extensions/lens-extension.ts
#	src/main/cluster-manager.ts
#	src/renderer/bootstrap.tsx
#	src/renderer/components/+apps-helm-charts/helm-chart.store.ts
#	src/renderer/components/+apps-releases/release.store.ts
#	src/renderer/components/+catalog/catalog.tsx
#	src/renderer/components/+extensions/extension-install.store.ts
#	src/renderer/components/+extensions/extensions.tsx
#	src/renderer/components/+preferences/preferences.tsx
#	src/renderer/components/dock/create-resource.store.ts
#	src/renderer/components/kube-object/kube-object-list-layout.tsx
#	src/renderer/theme.store.ts
#	src/renderer/utils/storageHelper.ts
2021-04-21 17:28:18 +03:00

139 lines
3.6 KiB
TypeScript

import { action, autorun, IReactionDisposer, reaction, makeObservable } from "mobx";
import { dockStore, IDockTab, TabId, TabKind } from "./dock.store";
import { DockTabStore } from "./dock-tab.store";
import { getReleaseValues, HelmRelease } from "../../api/endpoints/helm-releases.api";
import { releaseStore } from "../+apps-releases/release.store";
export interface IChartUpgradeData {
releaseName: string;
releaseNamespace: string;
}
export class UpgradeChartStore extends DockTabStore<IChartUpgradeData> {
private watchers = new Map<string, IReactionDisposer>();
values = new DockTabStore<string>();
constructor() {
super({
storageKey: "chart_releases"
});
makeObservable(this);
autorun(() => {
const { selectedTab, isOpen } = dockStore;
if (!isUpgradeChartTab(selectedTab)) return;
if (isOpen) {
this.loadData(selectedTab.id);
}
}, { delay: 250 });
autorun(() => {
const objects = [...this.data.values()];
objects.forEach(({ releaseName }) => this.createReleaseWatcher(releaseName));
});
}
private createReleaseWatcher(releaseName: string) {
if (this.watchers.get(releaseName)) {
return;
}
const dispose = reaction(() => {
const release = releaseStore.getByName(releaseName);
if (release) return release.getRevision(); // watch changes only by revision
},
release => {
const releaseTab = this.getTabByRelease(releaseName);
if (!releaseStore.isLoaded || !releaseTab) {
return;
}
// auto-reload values if was loaded before
if (release) {
if (dockStore.selectedTab === releaseTab && this.values.getData(releaseTab.id)) {
this.loadValues(releaseTab.id);
}
}
// clean up watcher, close tab if release not exists / was removed
else {
dispose();
this.watchers.delete(releaseName);
dockStore.closeTab(releaseTab.id);
}
});
this.watchers.set(releaseName, dispose);
}
isLoading(tabId = dockStore.selectedTabId) {
const values = this.values.getData(tabId);
return !releaseStore.isLoaded || values === undefined;
}
@action
async loadData(tabId: TabId) {
const values = this.values.getData(tabId);
await Promise.all([
!releaseStore.isLoaded && releaseStore.loadFromContextNamespaces(),
!values && this.loadValues(tabId)
]);
}
@action
async loadValues(tabId: TabId) {
this.values.clearData(tabId); // reset
const { releaseName, releaseNamespace } = this.getData(tabId);
const values = await getReleaseValues(releaseName, releaseNamespace, true);
this.values.setData(tabId, values);
}
getTabByRelease(releaseName: string): IDockTab {
const item = [...this.data].find(item => item[1].releaseName === releaseName);
if (item) {
const [tabId] = item;
return dockStore.getTabById(tabId);
}
}
}
export const upgradeChartStore = new UpgradeChartStore();
export function createUpgradeChartTab(release: HelmRelease, tabParams: Partial<IDockTab> = {}) {
let tab = upgradeChartStore.getTabByRelease(release.getName());
if (tab) {
dockStore.open();
dockStore.selectTab(tab.id);
}
if (!tab) {
tab = dockStore.createTab({
kind: TabKind.UPGRADE_CHART,
title: `Helm Upgrade: ${release.getName()}`,
...tabParams
}, false);
upgradeChartStore.setData(tab.id, {
releaseName: release.getName(),
releaseNamespace: release.getNs()
});
}
return tab;
}
export function isUpgradeChartTab(tab: IDockTab) {
return tab && tab.kind === TabKind.UPGRADE_CHART;
}