Skip to content

Commit e1c100a

Browse files
committed
CONSOLE-4840: Type improvements to DataModelProvider
1 parent cffd7e7 commit e1c100a

File tree

2 files changed

+23
-16
lines changed

2 files changed

+23
-16
lines changed

frontend/packages/console-dynamic-plugin-sdk/CHANGELOG-core.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ table in [Console dynamic plugins README](./README.md).
1919
- Add optional `fetch` property to extension `console.dashboards/overview/health/url` ([CONSOLE-4796], [#15526])
2020
- Add optional `infrastructure` parameter to `PrometheusHealthHandler` type ([CONSOLE-4796], [#15526])
2121
- Allow `K8sResourceKind` in `TopologyDataObject`, `TopologyResourcesObject`, and `OverviewItem` types ([CONSOLE-4840], [#15699])
22+
- Allow async functions for the `resources` property of `console.topology/data/factory` extension ([CONSOLE-4806], [#15641])
2223

2324
## 4.20.0-prerelease.1 - 2025-08-15
2425

@@ -136,6 +137,7 @@ table in [Console dynamic plugins README](./README.md).
136137
[CONSOLE-4654]: https://issues.redhat.com/browse/CONSOLE-4654
137138
[CONSOLE-4656]: https://issues.redhat.com/browse/CONSOLE-4656
138139
[CONSOLE-4796]: https://issues.redhat.com/browse/CONSOLE-4796
140+
[CONSOLE-4806]: https://issues.redhat.com/browse/CONSOLE-4806
139141
[CONSOLE-4840]: https://issues.redhat.com/browse/CONSOLE-4840
140142
[OCPBUGS-19048]: https://issues.redhat.com/browse/OCPBUGS-19048
141143
[OCPBUGS-30077]: https://issues.redhat.com/browse/OCPBUGS-30077
@@ -195,5 +197,6 @@ table in [Console dynamic plugins README](./README.md).
195197
[#15386]: https://github.com/openshift/console/pull/15386
196198
[#15509]: https://github.com/openshift/console/pull/15509
197199
[#15526]: https://github.com/openshift/console/pull/15526
200+
[#15641]: https://github.com/openshift/console/pull/15699
198201
[#15671]: https://github.com/openshift/console/pull/15671
199202
[#15699]: https://github.com/openshift/console/pull/15699

frontend/packages/topology/src/data-transforms/DataModelProvider.tsx

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import * as React from 'react';
1+
import { FC, useEffect, useState } from 'react';
22
import {
3-
isTopologyDataModelFactory as isDynamicTopologyDataModelFactory,
4-
TopologyDataModelFactory as DynamicTopologyDataModelFactory,
3+
isTopologyDataModelFactory,
4+
ResolvedExtension,
5+
TopologyDataModelFactory,
56
useResolvedExtensions,
7+
WatchK8sResourcesGeneric,
68
} from '@console/dynamic-plugin-sdk';
79
import DataModelExtension from './DataModelExtension';
810
import { ModelContext, ExtensibleModel } from './ModelContext';
@@ -13,43 +15,45 @@ interface DataModelProviderProps {
1315
children?: React.ReactNode;
1416
}
1517

16-
const DataModelProvider: React.FC<DataModelProviderProps> = ({ namespace, children }) => {
17-
const [model, setModel] = React.useState<ExtensibleModel>(new ExtensibleModel(namespace));
18+
const DataModelProvider: FC<DataModelProviderProps> = ({ namespace, children }) => {
19+
const [model, setModel] = useState<ExtensibleModel>(new ExtensibleModel(namespace));
1820

19-
React.useEffect(() => {
21+
useEffect(() => {
2022
setModel(new ExtensibleModel(namespace));
2123
}, [namespace]);
2224

2325
// Use useResolvedExtensions to automatically resolve all CodeRefs in the extensions
24-
const [dynamicModelFactories, dynamicResolved] = useResolvedExtensions<
25-
DynamicTopologyDataModelFactory
26-
>(isDynamicTopologyDataModelFactory);
26+
const [modelFactories, factoriesResolved] = useResolvedExtensions<TopologyDataModelFactory>(
27+
isTopologyDataModelFactory,
28+
);
2729

2830
// State to track resolved factories (with async resources resolved)
29-
const [resolvedFactories, setResolvedFactories] = React.useState<
31+
const [resolvedFactories, setResolvedFactories] = useState<
3032
| {
31-
properties: any;
33+
properties: ResolvedExtension<TopologyDataModelFactory>['properties'] & {
34+
resources?: WatchK8sResourcesGeneric;
35+
};
3236
pluginID: string;
3337
}[]
3438
| null
3539
>(null);
3640

3741
// Resolve any async resources from factories
38-
React.useEffect(() => {
39-
if (!dynamicResolved || !dynamicModelFactories) {
42+
useEffect(() => {
43+
if (!modelFactories || !factoriesResolved) {
4044
setResolvedFactories(null);
4145
return;
4246
}
4347

4448
const resolveFactories = async () => {
4549
const resolved = await Promise.all(
46-
dynamicModelFactories.map(async (factory) => {
50+
modelFactories.map(async (factory) => {
4751
const { resources, ...rest } = factory.properties;
4852

4953
// Check if resources is a function (CodeRef that returns Promise)
5054
if (typeof resources === 'function') {
5155
try {
52-
const resolvedResources = await resources();
56+
const resolvedResources: WatchK8sResourcesGeneric = await resources();
5357
return {
5458
properties: { ...rest, resources: resolvedResources },
5559
pluginID: factory.pluginID,
@@ -76,7 +80,7 @@ const DataModelProvider: React.FC<DataModelProviderProps> = ({ namespace, childr
7680
};
7781

7882
resolveFactories();
79-
}, [dynamicModelFactories, dynamicResolved]);
83+
}, [modelFactories, factoriesResolved]);
8084

8185
return (
8286
<ModelContext.Provider value={model}>

0 commit comments

Comments
 (0)