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

PoC: Stale resource in details panel after update from apis/store, fix #7186

Updated currently for: Replication Controllers & Namespaces.

Signed-off-by: Roman <ixrock@gmail.com>
This commit is contained in:
Roman 2023-02-17 16:21:49 +02:00
parent 2959e01d1e
commit 998a9e8e96
4 changed files with 71 additions and 34 deletions

View File

@ -7,6 +7,8 @@ import kubeDetailsUrlParamInjectable from "../kube-detail-params/kube-details-ur
import apiManagerInjectable from "../../../common/k8s-api/api-manager/manager.injectable";
import { asyncComputed } from "@ogre-tools/injectable-react";
import type { KubeObject } from "../../../common/k8s-api/kube-object";
import type { IComputedValue } from "mobx";
import { action, computed, observable, runInAction } from "mobx";
export type CurrentKubeObject =
| undefined
@ -41,4 +43,36 @@ const currentKubeObjectInDetailsInjectable = getInjectable({
},
});
export type KubeObjectDetailsItemValue = KubeObject | Error | undefined;
export type KubeObjectDetailsItemComputed = IComputedValue<KubeObjectDetailsItemValue>;
export const currentKubeObjectInDetailsInjectable2 = getInjectable({
id: "current-kube-object-in-details-2",
instantiate(di): KubeObjectDetailsItemComputed {
const kubeObjectUrlParam = di.inject(kubeDetailsUrlParamInjectable);
const apiManager = di.inject(apiManagerInjectable);
const kubeObject = observable.box<KubeObjectDetailsItemValue>();
return computed(() => {
const kubeObjUrlPath = kubeObjectUrlParam.get();
if (!kubeObjUrlPath) return; // details panel is hidden
const store = apiManager.getStore(kubeObjUrlPath);
const object = store?.getByPath(kubeObjUrlPath);
if (!object) {
store?.loadFromPath(kubeObjUrlPath)
.then(action((obj) => kubeObject.set(obj)))
.catch(action((error) => kubeObject.set(Error(error))));
} else {
runInAction(() => kubeObject.set(object));
}
return kubeObject.get() ?? object;
});
},
});
export default currentKubeObjectInDetailsInjectable;

View File

@ -6,18 +6,23 @@ import { getInjectable } from "@ogre-tools/injectable";
import { kubeObjectDetailItemInjectionToken } from "../kube-object-detail-item-injection-token";
import { computed } from "mobx";
import { NamespaceDetails } from "../../../+namespaces";
import { kubeObjectMatchesToKindAndApiVersion } from "../kube-object-matches-to-kind-and-api-version";
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
import {
kubeObjectMatchesToKindAndApiVersion,
} from "../kube-object-matches-to-kind-and-api-version";
import {
currentKubeObjectInDetailsInjectable2,
} from "../../current-kube-object-in-details.injectable";
import type { KubeObject } from "../../../../../common/k8s-api/kube-object";
const namespacesDetailItemInjectable = getInjectable({
id: "namespaces-detail-item",
instantiate: (di) => {
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable2);
return {
Component: NamespaceDetails,
enabled: computed(() => isNamespace(kubeObject.value.get()?.object)),
enabled: computed(() => isNamespace(kubeObject.get() as KubeObject)),
orderNumber: 10,
};
},

View File

@ -8,18 +8,21 @@ import { computed } from "mobx";
import {
kubeObjectMatchesToKindAndApiVersion,
} from "../kube-object-matches-to-kind-and-api-version";
import currentKubeObjectInDetailsInjectable from "../../current-kube-object-in-details.injectable";
import {
currentKubeObjectInDetailsInjectable2,
} from "../../current-kube-object-in-details.injectable";
import { ReplicationControllerDetails } from "../../../+workloads-replicationcontrollers";
import type { KubeObject } from "../../../../../common/k8s-api/kube-object";
const replicationControllerDetailItemInjectable = getInjectable({
id: "replication-controller-detail-item",
instantiate(di) {
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable);
const kubeObject = di.inject(currentKubeObjectInDetailsInjectable2);
return {
Component: ReplicationControllerDetails,
enabled: computed(() => isReplicationController(kubeObject.value.get()?.object)),
enabled: computed(() => isReplicationController(kubeObject.get() as KubeObject)),
orderNumber: 10,
};
},

View File

@ -9,16 +9,20 @@ import React from "react";
import { observer } from "mobx-react";
import type { IComputedValue } from "mobx";
import { Drawer } from "../drawer";
import type { KubeObject } from "../../../common/k8s-api/kube-object";
import { KubeObject } from "../../../common/k8s-api/kube-object";
import { Spinner } from "../spinner";
import { KubeObjectMenu } from "../kube-object-menu";
import type { HideDetails } from "../kube-detail-params/hide-details.injectable";
import type { IAsyncComputed } from "@ogre-tools/injectable-react";
import { withInjectables } from "@ogre-tools/injectable-react";
import hideDetailsInjectable from "../kube-detail-params/hide-details.injectable";
import kubeObjectDetailItemsInjectable from "./kube-object-detail-items/kube-object-detail-items.injectable";
import type { CurrentKubeObject } from "./current-kube-object-in-details.injectable";
import currentKubeObjectInDetailsInjectable from "./current-kube-object-in-details.injectable";
import kubeObjectDetailItemsInjectable
from "./kube-object-detail-items/kube-object-detail-items.injectable";
import type {
KubeObjectDetailsItemComputed,
} from "./current-kube-object-in-details.injectable";
import {
currentKubeObjectInDetailsInjectable2,
} from "./current-kube-object-in-details.injectable";
export interface KubeObjectDetailsProps<Kube extends KubeObject = KubeObject> {
className?: string;
@ -27,7 +31,7 @@ export interface KubeObjectDetailsProps<Kube extends KubeObject = KubeObject> {
interface Dependencies {
detailComponents: IComputedValue<React.ElementType[]>;
kubeObject: IAsyncComputed<CurrentKubeObject>;
kubeObject: KubeObjectDetailsItemComputed;
hideDetails: HideDetails;
}
@ -38,36 +42,27 @@ const NonInjectedKubeObjectDetails = observer((props: Dependencies) => {
kubeObject,
} = props;
const currentKubeObject = kubeObject.value.get();
const isLoading = kubeObject.pending.get();
const object = kubeObject.get();
return (
<Drawer
className="KubeObjectDetails flex column"
open={Boolean(isLoading || currentKubeObject)}
title={(
currentKubeObject?.object
? `${currentKubeObject.object.kind}: ${currentKubeObject.object.getName()}`
: ""
)}
toolbar={currentKubeObject?.object && <KubeObjectMenu object={currentKubeObject.object} toolbar={true}/>}
open={!!object}
title={
object instanceof KubeObject ? `${object.kind}: ${object.getName()}` : ""
}
toolbar={object && <KubeObjectMenu object={object as KubeObject} toolbar />}
onClose={hideDetails}
>
{isLoading && <Spinner center/>}
{currentKubeObject?.error && (
{!object && <Spinner center />}
{object instanceof Error && (
<div className="box center">
Resource loading has failed:
<b>{currentKubeObject.error}</b>
<b>{object}</b>
</div>
)}
{currentKubeObject?.object && (
<>
{
detailComponents.get()
.map((Component, index) => <Component key={index} object={currentKubeObject.object} />)
}
</>
)}
{object && detailComponents.get()
.map((Component, index) => <Component key={index} object={object} />)}
</Drawer>
);
});
@ -77,6 +72,6 @@ export const KubeObjectDetails = withInjectables<Dependencies>(NonInjectedKubeOb
...props,
hideDetails: di.inject(hideDetailsInjectable),
detailComponents: di.inject(kubeObjectDetailItemsInjectable),
kubeObject: di.inject(currentKubeObjectInDetailsInjectable),
kubeObject: di.inject(currentKubeObjectInDetailsInjectable2),
}),
});