From 6406ffabfde83cd2e05087bc34d80d3a999da4d0 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Wed, 17 Aug 2022 14:43:05 +0300 Subject: [PATCH] Move store subscription to injectable Signed-off-by: Alex Andreev --- .../components/+workloads-pods/pods.tsx | 41 +++++++++++++------ ...ubscribe-to-stores-disposers.injectable.ts | 29 +++++++++++++ 2 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 src/renderer/kube-watch-api/subscribe-to-stores-disposers.injectable.ts diff --git a/src/renderer/components/+workloads-pods/pods.tsx b/src/renderer/components/+workloads-pods/pods.tsx index 621077154e..ee54ab41bf 100644 --- a/src/renderer/components/+workloads-pods/pods.tsx +++ b/src/renderer/components/+workloads-pods/pods.tsx @@ -29,9 +29,10 @@ import nodeApiInjectable from "../../../common/k8s-api/endpoints/node.api.inject import eventStoreInjectable from "../+events/store.injectable"; import podStoreInjectable from "./store.injectable"; import { List } from "../list/list"; -import { createColumnHelper, getCoreRowModel } from '@tanstack/react-table' +import { ColumnDef, createColumnHelper, getCoreRowModel } from '@tanstack/react-table' import subscribeStoresInjectable from "../../kube-watch-api/subscribe-stores.injectable"; -import type { SubscribeStores } from "../../kube-watch-api/kube-watch-api"; +import type { SubscribableStore, SubscribeStores } from "../../kube-watch-api/kube-watch-api"; +import subscribeToStoresDisposersInjectable from "../../kube-watch-api/subscribe-to-stores-disposers.injectable"; enum columnId { name = "name", @@ -51,7 +52,7 @@ interface Dependencies { eventStore: EventStore; podStore: PodStore; nodeApi: NodeApi; - subscribeToStores: SubscribeStores; + subscribeToWatchStores: SubscribeStores; } const columnHelper = createColumnHelper() @@ -59,16 +60,9 @@ const columnHelper = createColumnHelper() @observer class NonInjectedPods extends React.Component { componentDidMount() { - const { podStore, eventStore, subscribeToStores } = this.props; - const stores = Array.from(new Set([podStore, eventStore])); + const storeDisposer = this.props.subscribeToWatchStores([this.props.podStore, this.props.eventStore]); - const reactions: Disposer[] = []; - - reactions.push( - subscribeToStores(stores), - ); - - disposeOnUnmount(this, reactions); + disposeOnUnmount(this, storeDisposer) } renderState(name: string, ready: boolean, key: string, data: Partial> | undefined) { @@ -162,6 +156,27 @@ class NonInjectedPods extends React.Component { render() { const { podStore } = this.props; + // const cols = React.useMemo[]>(() => ([ + // { + // header: "Name", + // cell: (pod) => pod.getValue() + // }, + // { + // id: "warning", + // cell: props => , + // enableSorting: false, + // enableResizing: false, + // minSize: 30, + // size: 30 + // }, + // { + // header: "Namespace", + // cell: info => info.getValue(), + // minSize: 110 + // }, + + // ]), []); + const columns = [ columnHelper.accessor(row => row.getName(), { id: "name", @@ -340,6 +355,6 @@ export const Pods = withInjectables(NonInjectedPods, { nodeApi: di.inject(nodeApiInjectable), eventStore: di.inject(eventStoreInjectable), podStore: di.inject(podStoreInjectable), - subscribeToStores: di.inject(subscribeStoresInjectable), + subscribeToWatchStores: di.inject(subscribeToStoresDisposersInjectable) }), }); diff --git a/src/renderer/kube-watch-api/subscribe-to-stores-disposers.injectable.ts b/src/renderer/kube-watch-api/subscribe-to-stores-disposers.injectable.ts new file mode 100644 index 0000000000..f1cf31b6ad --- /dev/null +++ b/src/renderer/kube-watch-api/subscribe-to-stores-disposers.injectable.ts @@ -0,0 +1,29 @@ +/** + * 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 type { SubscribableStore } from "../kube-watch-api/kube-watch-api"; +import type { Disposer } from "../utils"; +import subscribeStoresInjectable from "./subscribe-stores.injectable"; + +const subscribeToStoresDisposersInjectable = getInjectable({ + id: "subscribe-to-stores-disposers", + causesSideEffects: true, + instantiate: (di) => { + const subscribe = di.inject(subscribeStoresInjectable); + + return (stores: SubscribableStore[]) => { + const disposer: Disposer = subscribe(stores, { + onLoadFailure: error => { + console.warn("Failed to load store: ", error); + // TODO: Show notification + }, + }) + + return () => disposer(); + } + } +}); + +export default subscribeToStoresDisposersInjectable;