Skip to content

Commit 6600e19

Browse files
authored
chore: Migrate validationSchemasState to Jotai (#4137)
* chore: Migrate validationSchemasState to Jotai * fix
1 parent b8fffe3 commit 6600e19

File tree

6 files changed

+47
-32
lines changed

6 files changed

+47
-32
lines changed

src/components/Clusters/views/ClusterOverview/ClusterValidation/ClusterValidation.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import { ScanResult } from './ScanResult';
3636
import { UI5Panel } from 'shared/components/UI5Panel/UI5Panel';
3737
import { createPortal } from 'react-dom';
3838
import { K8sAPIResource } from 'types';
39+
import { useAtomValue } from 'jotai';
3940

4041
export const ClusterValidation = () => {
4142
const { t } = useTranslation();
@@ -55,7 +56,7 @@ export const ClusterValidation = () => {
5556
() => new ResourceLoader(relativeUrl => fetch({ relativeUrl }), undefined),
5657
[fetch],
5758
);
58-
const validationSchemas = useRecoilValue(validationSchemasState);
59+
const validationSchemas = useAtomValue(validationSchemasState);
5960
const defaultPolicySet = usePolicySet();
6061

6162
const { namespaces } = useAvailableNamespaces();

src/components/Preferences/ResourceValidation/ResourceValidationSettings.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useTranslation } from 'react-i18next';
2-
import { useRecoilState, useRecoilValue } from 'recoil';
2+
import { useRecoilState } from 'recoil';
33
import { Button, Switch } from '@ui5/webcomponents-react';
44
import {
55
getExtendedValidateResourceState,
@@ -15,6 +15,7 @@ import { UI5Panel } from 'shared/components/UI5Panel/UI5Panel';
1515

1616
import './ResourceValidationSettings.scss';
1717
import { configFeaturesNames } from 'state/types';
18+
import { useAtomValue } from 'jotai';
1819

1920
export default function ResourceValidationSettings() {
2021
const { t } = useTranslation();
@@ -33,7 +34,7 @@ export default function ResourceValidationSettings() {
3334
[],
3435
} = getExtendedValidateResourceState(validateResources);
3536

36-
const validationSchemas = useRecoilValue(validationSchemasState);
37+
const validationSchemas = useAtomValue(validationSchemasState);
3738
const allOptions = useMemo(
3839
() =>
3940
validationSchemas?.policies
@@ -122,6 +123,7 @@ export default function ResourceValidationSettings() {
122123
title={t(
123124
'settings.clusters.resourcesValidation.enabled-policies',
124125
)}
126+
//@ts-ignore
125127
entries={
126128
choosePolicies
127129
? policyList
@@ -176,6 +178,8 @@ export default function ResourceValidationSettings() {
176178
'settings.clusters.resourcesValidation.no-policies-found',
177179
),
178180
textSearchProperties: ['key', 'text'],
181+
showSearchField: true,
182+
allowSlashShortcut: true,
179183
}}
180184
/>
181185
</>

src/resources/Namespaces/YamlUpload/ResourceValidationResult.js renamed to src/resources/Namespaces/YamlUpload/ResourceValidationResult.tsx

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ import { validationSchemasEnabledState } from 'state/validationEnabledSchemasAto
2323
import { useLoadingDebounce } from 'shared/hooks/useLoadingDebounce';
2424

2525
import { SeparatorLine } from './SeparatorLine';
26+
import { ValidationSchema } from 'state/validationSchemasAtom';
2627

27-
const useNamespaceWarning = resource => {
28+
const useNamespaceWarning = (resource: any) => {
2829
const { t } = useTranslation();
2930
return useIsInCurrentNamespace(resource)
3031
? []
@@ -38,7 +39,7 @@ const useNamespaceWarning = resource => {
3839
];
3940
};
4041

41-
const ValidationWarning = ({ warning }) => {
42+
const ValidationWarning = ({ warning }: { warning: string }) => {
4243
const [where, reason] = warning.split(' - ');
4344
return (
4445
<>
@@ -51,15 +52,19 @@ const ValidationWarning = ({ warning }) => {
5152
);
5253
};
5354

54-
const ValidationWarnings = ({ resource, validationSchema }) => {
55+
const ValidationWarnings = ({
56+
resource,
57+
validationSchema,
58+
}: {
59+
resource: any;
60+
validationSchema: ValidationSchema;
61+
}) => {
5562
const { t } = useTranslation();
5663

5764
const { debounced } = useLoadingDebounce(resource, 500);
5865

5966
const warnings = [
60-
useValidateResourceBySchema(debounced, validationSchema, {
61-
base: 'https://dashboard.kyma.cloud.sap', // Workaround for jsonschema 1.5.0 - https://github.com/tdegrunt/jsonschema/issues/407
62-
}),
67+
useValidateResourceBySchema(debounced, validationSchema),
6368
useNamespaceWarning(debounced),
6469
];
6570

@@ -72,15 +77,15 @@ const ValidationWarnings = ({ resource, validationSchema }) => {
7277
className="sap-margin-bottom-small"
7378
>
7479
<p> {t('common.headers.loading')}</p>
75-
<Spinner size="Small" center={false} />
80+
<Spinner size="S" center={false} />
7681
</MessageStrip>
7782
);
7883

7984
return (
8085
<>
8186
{warnings.flat().map((warning, idx) => (
8287
<React.Fragment key={idx}>
83-
<FlexBox alignItems={'Begin'}>
88+
<FlexBox alignItems="Start">
8489
<ObjectStatus
8590
showDefaultIcon
8691
aria-label="Warning"
@@ -90,7 +95,11 @@ const ValidationWarnings = ({ resource, validationSchema }) => {
9095
marginLeft: '-0.3125rem', //set icon in one line with expand arrow. The value from class `--_ui5-v2-11-0_panel_content_padding` is divided by 2
9196
}}
9297
/>
93-
<ValidationWarning warning={warning.message} />
98+
<ValidationWarning
99+
warning={
100+
typeof warning === 'string' ? warning : warning.message ?? ''
101+
}
102+
/>
94103
</FlexBox>
95104
<SeparatorLine
96105
className="sap-margin-y-small"
@@ -105,16 +114,14 @@ const ValidationWarnings = ({ resource, validationSchema }) => {
105114
);
106115
};
107116

108-
export const ResourceValidationResult = ({ resource }) => {
117+
export const ResourceValidationResult = ({ resource }: { resource: any }) => {
109118
const validateResources = getExtendedValidateResourceState(
110119
useRecoilValue(validateResourcesState),
111120
);
112121
const validationSchemas = useAtomValue(validationSchemasEnabledState);
113122
const { debounced } = useLoadingDebounce(resource, 500);
114123
const warnings = [
115-
useValidateResourceBySchema(debounced, validationSchemas, {
116-
base: 'https://dashboard.kyma.cloud.sap',
117-
}),
124+
useValidateResourceBySchema(debounced, validationSchemas),
118125
useNamespaceWarning(debounced),
119126
];
120127
const statusIcon = validateResources.isEnabled ? (
@@ -148,7 +155,7 @@ export const ResourceValidationResult = ({ resource }) => {
148155
</Toolbar>
149156
}
150157
accessibleName={resource?.kind + ' ' + resource?.metadata?.name}
151-
accessibleRole="listitem"
158+
role="listitem"
152159
>
153160
{validateResources.isEnabled && (
154161
<ValidationWarnings

src/shared/hooks/useValidateResourceBySchema/useValidateResourceBySchema.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export type Warning =
1414

1515
export const validateResourceBySchema = (
1616
resource: K8sResource,
17-
schema?: ValidationSchema,
17+
schema: ValidationSchema,
1818
options?: Options,
1919
) => {
2020
const warnings = (schema?.rules || [])
@@ -49,10 +49,12 @@ export const validateResourceBySchema = (
4949
export const useValidateResourceBySchema = (
5050
resource: K8sResource,
5151
validationSchema: ValidationSchema,
52+
options?: Options,
5253
) => {
5354
return useMemo(() => {
5455
return validateResourceBySchema(resource, validationSchema, {
5556
base: 'https://dashboard.kyma.cloud.sap', // Workaround for jsonschema 1.5.0 - https://github.com/tdegrunt/jsonschema/issues/407
57+
...options,
5658
});
57-
}, [resource, validationSchema]);
59+
}, [options, resource, validationSchema]);
5860
};

src/state/validationEnabledSchemasAtom.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useFeature } from 'hooks/useFeature';
22
import { useEffect, useMemo } from 'react';
3-
import { atom, useSetAtom } from 'jotai';
3+
import { atom, useAtomValue, useSetAtom } from 'jotai';
44
import {
55
ExtendedValidateResources,
66
getExtendedValidateResourceState,
@@ -9,6 +9,7 @@ import {
99
import {
1010
emptyValidationSchema,
1111
getEnabledRules,
12+
ValidationPolicy,
1213
ValidationSchema,
1314
validationSchemasState,
1415
} from './validationSchemasAtom';
@@ -70,7 +71,9 @@ export const getValidationEnabledSchemas = (
7071
) => {
7172
const { rules, policies } = validationSchemas;
7273

73-
const enabledPolicies = policies.filter(policy => policySet.has(policy.name));
74+
const enabledPolicies = policies.filter((policy: ValidationPolicy) =>
75+
policySet.has(policy.name),
76+
);
7477
const enabledRules = getEnabledRules(rules, enabledPolicies, policies);
7578

7679
return {
@@ -82,7 +85,7 @@ export const getValidationEnabledSchemas = (
8285
export const useGetValidationEnabledSchemas = () => {
8386
const setSchemas = useSetAtom(validationSchemasEnabledState);
8487

85-
const validationSchemas = useRecoilValue(validationSchemasState);
88+
const validationSchemas = useAtomValue(validationSchemasState);
8689
const policySet = usePolicySet();
8790

8891
useEffect(() => {
@@ -98,7 +101,7 @@ export const useGetValidationEnabledSchemas = () => {
98101
}, [validationSchemas, policySet]);
99102
};
100103

101-
export const validationSchemasEnabledState = atom<ValidationSchema | null>(
104+
export const validationSchemasEnabledState = atom<ValidationSchema>(
102105
emptyValidationSchema,
103106
);
104107
validationSchemasEnabledState.debugLabel = 'validationSchemasEnabledState';

src/state/validationSchemasAtom.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useEffect } from 'react';
22
import { authDataState } from 'state/authDataAtom';
33
import { clusterState } from 'state/clusterAtom';
44
import jsyaml from 'js-yaml';
5-
import { atom, RecoilState, useSetRecoilState, useRecoilValue } from 'recoil';
5+
import { atom, useSetAtom } from 'jotai';
66
import {
77
permissionSetsSelector,
88
PermissionSetState,
@@ -12,8 +12,9 @@ import { ConfigMapResponse, getConfigMaps } from './utils/getConfigMaps';
1212
import { getFetchFn } from './utils/getFetchFn';
1313
import { JSONSchema4 } from 'json-schema';
1414
import { FetchFn } from 'shared/hooks/BackendAPI/useFetch';
15+
import { useRecoilValue } from 'recoil';
1516

16-
type Rule = {
17+
export type Rule = {
1718
uniqueName: string;
1819
messageOnFailure?: string;
1920
documentationUrl?: string;
@@ -43,7 +44,7 @@ type RuleReference =
4344
identifier: string;
4445
};
4546

46-
type ValidationPolicy = {
47+
export type ValidationPolicy = {
4748
name: string;
4849
isEnabled: boolean;
4950
includes: Array<string>;
@@ -191,7 +192,7 @@ export const getEnabledRules = (
191192
};
192193

193194
export const useGetValidationSchemas = async () => {
194-
const setSchemas = useSetRecoilState(validationSchemasState);
195+
const setSchemas = useSetAtom(validationSchemasState);
195196
const fetchFn = getFetchFn(useRecoilValue);
196197
const cluster = useRecoilValue(clusterState);
197198
const auth = useRecoilValue(authDataState);
@@ -221,9 +222,6 @@ export const useGetValidationSchemas = async () => {
221222
}, [cluster, auth, permissionSet, namespace]);
222223
};
223224

224-
export const validationSchemasState: RecoilState<ValidationSchema | null> = atom<ValidationSchema | null>(
225-
{
226-
key: 'validationSchemasState',
227-
default: emptyValidationSchema,
228-
},
225+
export const validationSchemasState = atom<ValidationSchema | null>(
226+
emptyValidationSchema,
229227
);

0 commit comments

Comments
 (0)