Skip to content

Commit 332059b

Browse files
committed
feat: use columnLayoutState to track currentResource
1 parent 73f8fe0 commit 332059b

File tree

12 files changed

+70
-91
lines changed

12 files changed

+70
-91
lines changed

src/components/App/ExtensibilityRoutes.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ const ColumnWrapper = ({
4141
resourceName: resourceName,
4242
resourceType: urlPath ?? resourceType,
4343
namespaceId: namespaceId,
44+
apiGroup: extension?.general.resource.group,
45+
apiVersion: extension?.general.resource.version,
4446
},
4547
endColumn: null,
4648
}

src/components/KymaCompanion/api/getPromptSuggestions.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
import { getClusterConfig } from 'state/utils/getBackendInfo';
2-
import { extractApiGroup } from 'resources/Roles/helpers';
3-
41
interface GetPromptSuggestionsParams {
52
namespace?: string;
63
resourceType?: string;
@@ -21,18 +18,18 @@ export default async function getPromptSuggestions({
2118
certificateAuthorityData,
2219
}: GetPromptSuggestionsParams): Promise<string[] | false> {
2320
try {
24-
const { backendAddress } = getClusterConfig();
25-
const url = `${backendAddress}/api/v1/namespaces/ai-core/services/http:ai-backend-clusterip:5000/proxy/api/v1/llm/init`;
26-
const apiGroup = extractApiGroup(groupVersion);
21+
const url = 'https://companion.cp.dev.kyma.cloud.sap/api/conversations/';
2722
const payload = JSON.parse(
28-
`{"resource_kind":"${resourceType.toLowerCase()}","resource_api_version": "${apiGroup}","resource_name":"${resourceName}","namespace":"${namespace}"}`,
23+
`{"resource_kind":"${resourceType.toLowerCase()}","resource_api_version": "${groupVersion}","resource_name":"${resourceName}","namespace":"${namespace}"}`,
2924
);
3025
const k8sAuthorization = `Bearer ${token}`;
3126

27+
const AUTH_TOKEN = '<AUTH_TOKEN>';
3228
let { results } = await fetch(url, {
3329
headers: {
3430
accept: 'application/json',
35-
'content-type': 'application/json',
31+
'Content-Type': 'application/json',
32+
Authorization: `Bearer ${AUTH_TOKEN}`,
3633
'X-Cluster-Certificate-Authority-Data': certificateAuthorityData,
3734
'X-Cluster-Url': clusterUrl,
3835
'X-K8s-Authorization': k8sAuthorization,

src/components/KymaCompanion/hooks/usePromptSuggestions.ts

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,46 @@ import { useRecoilValue, useSetRecoilState } from 'recoil';
33
import { sessionIDState } from '../../../state/companion/sessionIDAtom';
44
import { clusterState } from 'state/clusterAtom';
55
import getPromptSuggestions from '../api/getPromptSuggestions';
6-
import { currentResourceState } from 'state/companion/currentResourceAtom';
6+
import { ColumnLayoutState, columnLayoutState } from 'state/columnLayoutAtom';
7+
import { prettifyNameSingular } from 'shared/utils/helpers';
78

89
export function usePromptSuggestions() {
910
const [suggestions, setSuggestions] = useState<string[]>([]);
1011
const setSessionID = useSetRecoilState(sessionIDState);
1112
const cluster = useRecoilValue(clusterState);
12-
const currentResource = useRecoilValue(currentResourceState);
13+
const columnLayout = useRecoilValue(columnLayoutState);
14+
15+
const getResourceFromColumnnLayout = (columnLayout: ColumnLayoutState) => {
16+
return {
17+
namespace: columnLayout.midColumn?.namespaceId ?? '',
18+
resourceType: prettifyNameSingular(
19+
columnLayout.midColumn?.resourceType ?? '',
20+
),
21+
apiGroup: columnLayout.midColumn?.apiGroup ?? '',
22+
apiVersion: columnLayout.midColumn?.apiVersion ?? '',
23+
resourceName: columnLayout.midColumn?.resourceName ?? '',
24+
};
25+
};
1326

1427
useEffect(() => {
1528
const userAuth = cluster?.currentContext.user.user;
29+
const {
30+
namespace,
31+
resourceType,
32+
apiGroup,
33+
apiVersion,
34+
resourceName,
35+
} = getResourceFromColumnnLayout(columnLayout);
36+
const groupVersion = apiGroup ? `${apiGroup}/${apiVersion}` : apiVersion;
1637

1738
async function fetchSuggestions() {
1839
const sessionID = ''; // TODO
1940
setSessionID(sessionID);
2041
const promptSuggestions = await getPromptSuggestions({
21-
namespace: currentResource.namespace,
22-
resourceType: currentResource.resourceType,
23-
groupVersion: currentResource.groupVersion,
24-
resourceName: currentResource.resourceName,
42+
namespace: namespace,
43+
resourceType: resourceType,
44+
groupVersion: groupVersion,
45+
resourceName: resourceName,
2546
clusterUrl: cluster?.currentContext.cluster.cluster.server ?? '',
2647
token: userAuth && 'token' in userAuth ? userAuth.token : '', // TODO
2748
certificateAuthorityData:
@@ -34,15 +55,10 @@ export function usePromptSuggestions() {
3455
}
3556
}
3657

37-
if (
38-
cluster &&
39-
currentResource.resourceType &&
40-
currentResource.groupVersion &&
41-
suggestions.length === 0
42-
) {
58+
if (cluster && resourceType && groupVersion && suggestions.length === 0) {
4359
fetchSuggestions();
4460
}
45-
}, [cluster, currentResource, suggestions, setSessionID]);
61+
}, [cluster, columnLayout, suggestions, setSessionID]);
4662

4763
return suggestions;
4864
}

src/components/KymaModules/KymaModulesList.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import {
5050
useModuleTemplatesQuery,
5151
} from './kymaModulesQueries';
5252
import { findStatus } from './support';
53+
import { extractApiGroupVersion } from 'resources/Roles/helpers';
5354

5455
export default function KymaModulesList({
5556
DeleteMessageBox,
@@ -345,12 +346,17 @@ export default function KymaModulesList({
345346
? namespaceUrl(partialPath)
346347
: clusterUrl(partialPath);
347348

349+
const { group, version } = extractApiGroupVersion(
350+
moduleStatus?.resource?.apiVersion,
351+
);
348352
if (!isExtension) {
349353
setLayoutColumn({
350354
midColumn: {
351355
resourceType: moduleCrd?.metadata?.name,
352356
resourceName: moduleStatus?.resource?.metadata?.name,
353357
namespaceId: moduleStatus?.resource?.metadata.namespace || '',
358+
apiGroup: group,
359+
apiVersion: version,
354360
},
355361
layout: 'TwoColumnsMidExpanded',
356362
endColumn: null,
@@ -368,6 +374,8 @@ export default function KymaModulesList({
368374
).toLowerCase(),
369375
resourceName: moduleStatus?.resource?.metadata?.name,
370376
namespaceId: moduleStatus?.resource?.metadata.namespace || '',
377+
apiGroup: group,
378+
apiVersion: version,
371379
},
372380
layout: 'TwoColumnsMidExpanded',
373381
endColumn: null,

src/resources/Roles/helpers.js

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@ export function unique(arr) {
22
return [...new Set(arr)];
33
}
44
export const EMPTY_API_GROUP_KEY = 'core-api-group';
5-
export const extractApiGroup = groupVersion => {
5+
export const extractApiGroupVersion = groupVersion => {
6+
if (!groupVersion) return { group: '', version: '' };
67
// handle core ('') group
7-
if (groupVersion === 'v1') return '';
8-
const [apiGroup] = groupVersion.split('/');
9-
return apiGroup;
8+
if (groupVersion === 'v1') return { group: '', version: 'v1' };
9+
10+
const [apiGroup, apiVersion] = groupVersion.split('/');
11+
return { group: apiGroup, version: apiVersion };
1012
};
1113

1214
export const getApiGroupInputOptions = groupVersions =>
13-
unique(groupVersions?.map(extractApiGroup))?.map(g =>
14-
g === ''
15+
unique(groupVersions?.map(extractApiGroupVersion))?.map(({ group }) =>
16+
group === ''
1517
? { key: EMPTY_API_GROUP_KEY, text: '(core)' }
16-
: { key: g, text: g },
18+
: { key: group, text: group },
1719
) ?? [];
1820

1921
export function createRoleTemplate(namespace, { name = '', rules } = {}) {

src/resources/createResourceRoutes.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ const ColumnWrapper = ({
6464
resourceName: resourceName,
6565
resourceType: props.resourceType,
6666
namespaceId: namespaceId,
67+
apiGroup: props.apiGroup,
68+
apiVersion: props.apiVersion,
6769
},
6870
endColumn: null,
6971
}

src/shared/ResourceForm/useCreateResource.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { usePrepareLayout } from 'shared/hooks/usePrepareLayout';
1414
import { columnLayoutState } from 'state/columnLayoutAtom';
1515
import { isResourceEditedState } from 'state/resourceEditedAtom';
1616
import { isFormOpenState } from 'state/formOpenAtom';
17+
import { extractApiGroupVersion } from 'resources/Roles/helpers';
1718

1819
export function useCreateResource({
1920
singularName,
@@ -65,6 +66,7 @@ export function useCreateResource({
6566
showCreate: null,
6667
});
6768
} else {
69+
const { group, version } = extractApiGroupVersion(resource?.apiVersion);
6870
setLayoutColumn(
6971
nextLayout === 'TwoColumnsMidExpanded'
7072
? {
@@ -74,6 +76,8 @@ export function useCreateResource({
7476
resourceName: resource.metadata.name,
7577
resourceType: resource.kind,
7678
namespaceId: resource.metadata.namespace,
79+
apiGroup: group,
80+
apiVersion: version,
7781
},
7882
endColumn: null,
7983
}

src/shared/components/GenericList/GenericList.js

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import pluralize from 'pluralize';
3232
import { isResourceEditedState } from 'state/resourceEditedAtom';
3333
import { isFormOpenState } from 'state/formOpenAtom';
3434
import { handleActionIfFormOpen } from '../UnsavedMessageBox/helpers';
35+
import { extractApiGroupVersion } from 'resources/Roles/helpers';
3536
import './GenericList.scss';
3637

3738
const defaultSort = {
@@ -71,7 +72,6 @@ export const GenericList = ({
7172
hasDetailsView,
7273
disableHiding = true,
7374
displayArrow = false,
74-
handleRedirect = null,
7575
nameColIndex = 0,
7676
namespaceColIndex = -1,
7777
noHideFields,
@@ -343,20 +343,6 @@ export const GenericList = ({
343343
setEntrySelectedNamespace(itemNamespace);
344344
return customRowClick(item, selectedEntry);
345345
} else {
346-
if (handleRedirect) {
347-
const redirectLayout = handleRedirect(selectedEntry, resourceType);
348-
if (redirectLayout) {
349-
setLayoutColumn({
350-
...redirectLayout,
351-
});
352-
navigate(
353-
redirectLayout.layout === 'OneColumn'
354-
? linkTo(selectedEntry)
355-
: `${linkTo(selectedEntry)}?layout=${redirectLayout.layout}`,
356-
);
357-
return;
358-
}
359-
}
360346
setEntrySelected(
361347
selectedEntry?.metadata?.name ?? e.target.children[0].innerText,
362348
);
@@ -370,6 +356,9 @@ export const GenericList = ({
370356

371357
navigate(linkTo(selectedEntry));
372358
} else {
359+
const { group, version } = extractApiGroupVersion(
360+
selectedEntry?.apiVersion,
361+
);
373362
setLayoutColumn(
374363
columnLayout
375364
? {
@@ -384,6 +373,8 @@ export const GenericList = ({
384373
e.target.children[0].innerText,
385374
resourceType: resourceType,
386375
namespaceId: selectedEntry?.metadata?.namespace,
376+
apiGroup: group,
377+
apiVersion: version,
387378
},
388379
endColumn: null,
389380
layout: 'TwoColumnsMidExpanded',

src/shared/components/ResourceDetails/ResourceDetails.js

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { createContext, Suspense, useEffect, useState } from 'react';
1+
import React, { createContext, Suspense, useState } from 'react';
22
import PropTypes from 'prop-types';
33
import pluralize from 'pluralize';
44
import { useTranslation } from 'react-i18next';
@@ -27,10 +27,9 @@ import { ResourceStatusCard } from '../ResourceStatusCard/ResourceStatusCard';
2727
import { EMPTY_TEXT_PLACEHOLDER } from '../../constants';
2828
import { ReadableElapsedTimeFromNow } from '../ReadableElapsedTimeFromNow/ReadableElapsedTimeFromNow';
2929
import { HintButton } from '../DescriptionHint/DescriptionHint';
30-
import { useRecoilValue, useSetRecoilState } from 'recoil';
30+
import { useRecoilValue } from 'recoil';
3131
import { columnLayoutState } from 'state/columnLayoutAtom';
3232
import BannerCarousel from 'components/Extensibility/components/FeaturedCard/BannerCarousel';
33-
import { currentResourceState } from 'state/companion/currentResourceAtom';
3433

3534
// This component is loaded after the page mounts.
3635
// Don't try to load it on scroll. It was tested.
@@ -171,25 +170,6 @@ function Resource({
171170
className,
172171
headerDescription,
173172
}) {
174-
const SetCurrentResource = useSetRecoilState(currentResourceState);
175-
useEffect(() => {
176-
SetCurrentResource({
177-
namespace: resource?.metadata?.namespace ?? '',
178-
resourceType: resource?.kind ?? '',
179-
groupVersion: resource?.apiVersion ?? '',
180-
resourceName: resource?.metadata?.name ?? '',
181-
});
182-
183-
return () => {
184-
SetCurrentResource({
185-
namespace: '',
186-
resourceType: '',
187-
groupVersion: '',
188-
resourceName: '',
189-
});
190-
};
191-
}, [SetCurrentResource, resource]);
192-
193173
useVersionWarning({ resourceUrl, resourceType });
194174
const { t } = useTranslation();
195175
const prettifiedResourceKind = prettifyNameSingular(

src/shared/components/ResourcesList/ResourcesList.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ ResourcesList.propTypes = {
7171
disableMargin: PropTypes.bool,
7272
enableColumnLayout: PropTypes.bool,
7373
layoutNumber: PropTypes.string,
74-
handleRedirect: PropTypes.func,
7574
filterFn: PropTypes.func,
7675
};
7776

@@ -232,7 +231,6 @@ export function ResourceListRenderer({
232231
simpleEmptyListMessage = false,
233232
disableHiding,
234233
displayArrow,
235-
handleRedirect,
236234
accessibleName,
237235
}) {
238236
useVersionWarning({
@@ -562,7 +560,6 @@ export function ResourceListRenderer({
562560
...emptyListProps,
563561
simpleEmptyListMessage: simpleEmptyListMessage,
564562
}}
565-
handleRedirect={handleRedirect}
566563
nameColIndex={nameColIndex}
567564
namespaceColIndex={namespaceColIndex}
568565
/>

0 commit comments

Comments
 (0)