diff --git a/src/renderer/components/+namespaces/metrics-details-component.tsx b/src/renderer/components/+namespaces/metrics-details-component.injectable.tsx similarity index 100% rename from src/renderer/components/+namespaces/metrics-details-component.tsx rename to src/renderer/components/+namespaces/metrics-details-component.injectable.tsx diff --git a/src/renderer/components/+network-ingresses/ingress-details.tsx b/src/renderer/components/+network-ingresses/ingress-details.tsx index 00c02050b1..d49d1e49a5 100644 --- a/src/renderer/components/+network-ingresses/ingress-details.tsx +++ b/src/renderer/components/+network-ingresses/ingress-details.tsx @@ -6,56 +6,26 @@ import "./ingress-details.scss"; import React from "react"; -import { disposeOnUnmount, observer } from "mobx-react"; -import { makeObservable, observable, reaction } from "mobx"; +import { observer } from "mobx-react"; import { DrawerItem, DrawerTitle } from "../drawer"; import type { ILoadBalancerIngress } from "../../../common/k8s-api/endpoints"; import { Ingress } from "../../../common/k8s-api/endpoints"; import { Table, TableCell, TableHead, TableRow } from "../table"; -import { ResourceMetrics } from "../resource-metrics"; import type { KubeObjectDetailsProps } from "../kube-object-details"; -import { IngressCharts } from "./ingress-charts"; -import { KubeObjectMeta } from "../kube-object-meta"; import { computeRuleDeclarations } from "../../../common/k8s-api/endpoints/ingress.api"; -import { ClusterMetricsResourceType } from "../../../common/cluster-types"; -import logger from "../../../common/logger"; -import type { IngressMetricData, RequestIngressMetrics } from "../../../common/k8s-api/endpoints/metrics.api/request-ingress-metrics.injectable"; +import type { Logger } from "../../../common/logger"; import { withInjectables } from "@ogre-tools/injectable-react"; -import requestIngressMetricsInjectable from "../../../common/k8s-api/endpoints/metrics.api/request-ingress-metrics.injectable"; -import type { GetActiveClusterEntity } from "../../api/catalog/entity/get-active-cluster-entity.injectable"; -import getActiveClusterEntityInjectable from "../../api/catalog/entity/get-active-cluster-entity.injectable"; +import loggerInjectable from "../../../common/logger.injectable"; export interface IngressDetailsProps extends KubeObjectDetailsProps { } interface Dependencies { - requestIngressMetrics: RequestIngressMetrics; - getActiveClusterEntity: GetActiveClusterEntity; + logger: Logger; } @observer class NonInjectedIngressDetails extends React.Component { - @observable metrics: IngressMetricData | null = null; - - constructor(props: IngressDetailsProps & Dependencies) { - super(props); - makeObservable(this); - } - - componentDidMount() { - disposeOnUnmount(this, [ - reaction(() => this.props.object, () => { - this.metrics = null; - }), - ]); - } - - loadMetrics = async () => { - const { object: ingress, requestIngressMetrics } = this.props; - - this.metrics = await requestIngressMetrics(ingress.getName(), ingress.getNs()); - }; - renderPaths(ingress: Ingress) { return ingress.getRules() .map((rule, index) => ( @@ -126,7 +96,7 @@ class NonInjectedIngressDetails extends React.Component - {!isMetricHidden && ( - - - - )} - {ingress.getPorts()} @@ -183,7 +138,6 @@ class NonInjectedIngressDetails extends React.Component(NonInjectedIngressDetails, { getProps: (di, props) => ({ ...props, - requestIngressMetrics: di.inject(requestIngressMetricsInjectable), - getActiveClusterEntity: di.inject(getActiveClusterEntityInjectable), + logger: di.inject(loggerInjectable), }), }); diff --git a/src/renderer/components/+network-ingresses/metrics-details-component.injectable.tsx b/src/renderer/components/+network-ingresses/metrics-details-component.injectable.tsx new file mode 100644 index 0000000000..64cc187feb --- /dev/null +++ b/src/renderer/components/+network-ingresses/metrics-details-component.injectable.tsx @@ -0,0 +1,49 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { asyncComputed } from "@ogre-tools/injectable-react"; +import { computed } from "mobx"; +import { now } from "mobx-utils"; +import React from "react"; +import { ClusterMetricsResourceType } from "../../../common/cluster-types"; +import type { Ingress } from "../../../common/k8s-api/endpoints"; +import requestIngressMetricsInjectable from "../../../common/k8s-api/endpoints/metrics.api/request-ingress-metrics.injectable"; +import getActiveClusterEntityInjectable from "../../api/catalog/entity/get-active-cluster-entity.injectable"; +import type { KubeObjectDetailsProps } from "../kube-object-details"; +import { kubeObjectDetailItemInjectionToken } from "../kube-object-details/kube-object-detail-items/kube-object-detail-item-injection-token"; +import { ResourceMetrics } from "../resource-metrics"; +import { IngressCharts } from "./ingress-charts"; + +const ingressMetricsDetailsComponentInjectable = getInjectable({ + id: "ingress-metrics-details-component", + instantiate: (di) => { + const getActiveClusterEntity = di.inject(getActiveClusterEntityInjectable); + const requestIngressMetrics = di.inject(requestIngressMetricsInjectable); + + return { + Component: ({ object }: KubeObjectDetailsProps) => ( + { + now(60 * 1000); // Update every minute + + return requestIngressMetrics(object.getName(), object.getNs()); + })} + > + + + ), + enabled: computed(() => !getActiveClusterEntity()?.isMetricHidden(ClusterMetricsResourceType.Ingress)), + orderNumber: -1, + }; + }, + injectionToken: kubeObjectDetailItemInjectionToken, +}); + +export default ingressMetricsDetailsComponentInjectable;