Skip to content

Commit 628cdcd

Browse files
committed
fix
1 parent 815fe43 commit 628cdcd

File tree

3 files changed

+94
-171
lines changed

3 files changed

+94
-171
lines changed

src/components/ComponentsSelection/ComponentsSelectionContainer.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import IllustratedError from '../Shared/IllustratedError.tsx';
44
import Loading from '../Shared/Loading.tsx';
55
import { ComponentsListItem } from '../../lib/api/types/crate/createManagedControlPlane.ts';
66
import { useTranslation } from 'react-i18next';
7-
import { useComponentsSelection } from './ComponentsSelectionProvider.tsx';
87

98
export interface ComponentsSelectionProps {
109
componentsList: ComponentsListItem[];
1110
setComponentsList: (components: ComponentsListItem[]) => void;
11+
isLoading: boolean;
12+
error: unknown;
13+
templateDefaultsError?: string;
1214
}
1315

1416
/**
@@ -27,11 +29,13 @@ export const getSelectedComponents = (components: ComponentsListItem[]) => {
2729
export const ComponentsSelectionContainer: React.FC<ComponentsSelectionProps> = ({
2830
setComponentsList,
2931
componentsList,
32+
isLoading,
33+
error,
34+
templateDefaultsError,
3035
}) => {
3136
const { t } = useTranslation();
32-
const { isLoading, error, templateDefaultsError, hasInitialized } = useComponentsSelection();
3337

34-
if (isLoading || !hasInitialized) {
38+
if (isLoading) {
3539
return <Loading />;
3640
}
3741

src/components/ComponentsSelection/ComponentsSelectionProvider.tsx

Lines changed: 0 additions & 168 deletions
This file was deleted.
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import { useEffect, useState } from 'react';
2+
import { ManagedControlPlaneTemplate } from '../../../lib/api/types/templates/mcpTemplate.ts';
3+
import { ComponentsListItem } from '../../../lib/api/types/crate/createManagedControlPlane.ts';
4+
import { useApiResource } from '../../../lib/api/useApiResource.ts';
5+
import { ListManagedComponents } from '../../../lib/api/types/crate/listManagedComponents.ts';
6+
import { sortVersions } from '../../../utils/componentsVersions.ts';
7+
import { removeComponents } from '../../../lib/api/types/crate/createManagedControlPlane.ts';
8+
9+
export type ComponentsHookResult = {
10+
isLoading: boolean;
11+
error: unknown;
12+
templateDefaultsError: string | null;
13+
};
14+
15+
export const useComponentsSelectionData = (
16+
selectedTemplate: ManagedControlPlaneTemplate | undefined,
17+
initialSelection: Record<string, { isSelected: boolean; version: string }> | undefined,
18+
isOnMcpPage: boolean,
19+
setValue: (name: 'componentsList', value: ComponentsListItem[], options?: { shouldValidate?: boolean }) => void,
20+
): ComponentsHookResult => {
21+
const { data, error, isLoading } = useApiResource(ListManagedComponents(), undefined, !!isOnMcpPage);
22+
23+
useEffect(() => {
24+
const items = data?.items ?? [];
25+
if (!items || items.length === 0) {
26+
setValue('componentsList', [], { shouldValidate: false });
27+
return;
28+
}
29+
const newComponentsList: ComponentsListItem[] = items
30+
.map((item) => {
31+
const rawVersions = Array.isArray(item.status?.versions) ? (item.status?.versions as string[]) : [];
32+
const versions = sortVersions(rawVersions);
33+
const name = item.metadata?.name ?? '';
34+
const initSel = initialSelection?.[name];
35+
const templateDefault = selectedTemplate?.spec?.spec?.components?.defaultComponents?.find(
36+
(dc) => dc.name === name,
37+
);
38+
let isSelected = Boolean(initSel?.isSelected);
39+
let selectedVersion = initSel?.version && versions.includes(initSel.version) ? initSel.version : '';
40+
if (!initSel) {
41+
isSelected = Boolean(templateDefault);
42+
const templateVersion = templateDefault?.version;
43+
selectedVersion = templateVersion && versions.includes(templateVersion) ? templateVersion : '';
44+
}
45+
if (!initSel && !templateDefault) {
46+
selectedVersion = versions[0] ?? '';
47+
}
48+
return {
49+
name,
50+
versions,
51+
selectedVersion,
52+
isSelected,
53+
documentationUrl: '',
54+
} as ComponentsListItem;
55+
})
56+
.filter((component) => !removeComponents.find((item) => item === component.name));
57+
58+
setValue('componentsList', newComponentsList, { shouldValidate: false });
59+
// eslint-disable-next-line react-hooks/exhaustive-deps
60+
}, [JSON.stringify(data?.items), selectedTemplate, initialSelection]);
61+
62+
const [defaultsError, setDefaultsError] = useState<string | null>(null);
63+
useEffect(() => {
64+
const items = data?.items ?? [];
65+
const defaults = selectedTemplate?.spec?.spec?.components?.defaultComponents ?? [];
66+
if (!items.length || !defaults.length) {
67+
setDefaultsError(null);
68+
return;
69+
}
70+
const errors: string[] = [];
71+
defaults.forEach((dc) => {
72+
if (!dc?.name) return;
73+
const item = items.find((it) => it.metadata?.name === dc.name);
74+
if (!item) {
75+
errors.push(`Component "${dc.name}" from template is not available.`);
76+
return;
77+
}
78+
const versions: string[] = Array.isArray(item.status?.versions) ? (item.status?.versions as string[]) : [];
79+
if (dc.version && !versions.includes(dc.version)) {
80+
errors.push(`Component "${dc.name}" version "${dc.version}" from template is not available.`);
81+
}
82+
});
83+
setDefaultsError(errors.length ? errors.join('\n') : null);
84+
}, [data, selectedTemplate]);
85+
86+
return { isLoading: Boolean(isLoading), error, templateDefaultsError: defaultsError };
87+
};

0 commit comments

Comments
 (0)