Skip to content

Commit bf0a952

Browse files
Merge pull request #14853 from Mylanos/CONSOLE-4081-Address-tech-debt-in-EditSecret-component
CONSOLE-4081: Refactor EditSecret component
2 parents 9d52220 + c66fe8b commit bf0a952

File tree

12 files changed

+84
-124
lines changed

12 files changed

+84
-124
lines changed

frontend/packages/dev-console/src/components/deployments/images/AdvancedImageOptions.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as React from 'react';
22
import { Button, ButtonVariant } from '@patternfly/react-core';
33
import { FormikValues, useFormikContext } from 'formik';
44
import { useTranslation } from 'react-i18next';
5-
import { SecretTypeAbstraction } from '@console/internal/components/secrets/create-secret';
5+
import { SecretFormType } from '@console/internal/components/secrets/create-secret';
66
import { ExpandCollapse } from '@console/internal/components/utils';
77
import { SecretModel } from '@console/internal/models';
88
import { ResourceDropdownField } from '@console/shared/src';
@@ -58,7 +58,7 @@ const AdvancedImageOptions: React.FC = () => {
5858
secretModalLauncher({
5959
namespace,
6060
save: handleSave,
61-
secretType: SecretTypeAbstraction.image,
61+
formType: SecretFormType.image,
6262
})
6363
}
6464
>

frontend/packages/dev-console/src/components/import/CreateSecretModal.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@ import {
55
} from '@console/internal/components/factory/modal';
66
import {
77
SecretFormWrapper,
8-
SecretTypeAbstraction,
8+
SecretFormType,
99
} from '@console/internal/components/secrets/create-secret';
1010

1111
export interface CreateSecretModalProps {
1212
save?: (name: string) => void;
1313
namespace: string;
14-
secretType: SecretTypeAbstraction;
14+
formType: SecretFormType;
1515
}
1616

1717
type Props = CreateSecretModalProps & ModalComponentProps;
1818

19-
const CreateSecretModal: React.FC<Props> = ({ close, namespace, save, secretType }) => {
19+
const CreateSecretModal: React.FC<Props> = ({ close, namespace, save, formType }) => {
2020
const handleSave = (name: string) => {
2121
close();
2222
save(name);
@@ -27,7 +27,7 @@ const CreateSecretModal: React.FC<Props> = ({ close, namespace, save, secretType
2727
onCancel={close}
2828
onSave={handleSave}
2929
fixed={{ metadata: { namespace } }}
30-
secretTypeAbstraction={secretType}
30+
formType={formType}
3131
isCreate
3232
modal
3333
/>

frontend/packages/dev-console/src/components/import/git/SourceSecretSelector.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { FormGroup, FormHelperText, HelperText, HelperTextItem } from '@patternf
33
import { useFormikContext, FormikValues } from 'formik';
44
import * as _ from 'lodash';
55
import { useTranslation } from 'react-i18next';
6-
import { SecretTypeAbstraction } from '@console/internal/components/secrets/create-secret';
6+
import { SecretFormType } from '@console/internal/components/secrets/create-secret';
77
import { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';
88
import { SecretModel } from '@console/internal/models';
99
import { getFieldId } from '@console/shared';
@@ -44,7 +44,7 @@ const SourceSecretSelector: React.FC<{
4444
secretModalLauncher({
4545
namespace,
4646
save: handleSave,
47-
secretType: SecretTypeAbstraction.source,
47+
formType: SecretFormType.source,
4848
});
4949
} else if (key === CLEAR_SOURCE_SECRET) {
5050
setFieldValue(`${fieldPrefix}git.secret`, '');

frontend/packages/dev-console/src/components/import/image-search/ImageSearch.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
import { useFormikContext, FormikValues, FormikTouched } from 'formik';
1010
import * as _ from 'lodash';
1111
import { Trans, useTranslation } from 'react-i18next';
12-
import { SecretTypeAbstraction } from '@console/internal/components/secrets/create-secret';
12+
import { SecretFormType } from '@console/internal/components/secrets/create-secret';
1313
import { ImageStreamImportsModel } from '@console/internal/models';
1414
import { k8sCreate, ContainerPort } from '@console/internal/module/k8s';
1515
import { InputField, useDebounceCallback, CheckboxField } from '@console/shared';
@@ -268,7 +268,7 @@ const ImageSearch: React.FC = () => {
268268
secretModalLauncher({
269269
namespace,
270270
save: handleSave,
271-
secretType: SecretTypeAbstraction.image,
271+
formType: SecretFormType.image,
272272
})
273273
}
274274
>

frontend/packages/shipwright-plugin/src/components/build-form/PushSecretSelector.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { useFormikContext, FormikValues } from 'formik';
44
import * as _ from 'lodash';
55
import { useTranslation } from 'react-i18next';
66
import { secretModalLauncher } from '@console/dev-console/src/components/import/CreateSecretModal';
7-
import { SecretTypeAbstraction } from '@console/internal/components/secrets/create-secret';
7+
import { SecretFormType } from '@console/internal/components/secrets/create-secret';
88
import { getFieldId } from '@console/shared';
99
import PushSecretDropdown from './PushSecretDropdown';
1010

@@ -31,7 +31,7 @@ const PushSecretSelector: React.FC<{
3131
secretModalLauncher({
3232
namespace,
3333
save: handleSave,
34-
secretType: SecretTypeAbstraction.image,
34+
formType: SecretFormType.image,
3535
});
3636
} else if (key === CLEAR_PULL_SECRET) {
3737
setFieldValue(`${fieldPrefix}`, '');

frontend/public/components/secrets/create-secret/CreateSecret.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { useParams } from 'react-router-dom-v5-compat';
2-
import { SecretTypeAbstraction } from './types';
2+
import { SecretFormType } from './types';
33
import { SecretFormWrapper } from './SecretFormWrapper';
44

55
export const CreateSecret = () => {
66
const params = useParams();
7-
const secretTypeAbstraction = params.type as SecretTypeAbstraction;
7+
const formType = params.type as SecretFormType;
88
return (
99
<SecretFormWrapper
1010
fixed={{ metadata: { namespace: params.ns } }}
11-
secretTypeAbstraction={secretTypeAbstraction}
11+
formType={formType}
1212
isCreate={true}
1313
/>
1414
);
Lines changed: 28 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,43 @@
1-
import * as _ from 'lodash-es';
21
import * as React from 'react';
3-
import { useTranslation, withTranslation } from 'react-i18next';
4-
import { WithT } from 'i18next';
2+
import { useTranslation } from 'react-i18next';
53
import { useParams } from 'react-router-dom-v5-compat';
6-
import { LoadingBox } from '@console/shared/src/components/loading/LoadingBox';
74
import { StatusBox } from '@console/shared/src/components/status/StatusBox';
8-
import { K8sResourceKind } from '../../../module/k8s';
9-
import { Firehose } from '../../utils/firehose';
10-
import { SecretTypeAbstraction } from './types';
11-
import { toTypeAbstraction } from './utils';
5+
import { K8sResourceKind } from '@console/internal/module/k8s';
6+
import { useK8sWatchResource } from '@console/internal/components/utils/k8s-watch-hook';
7+
import { SecretFormType } from './types';
8+
import { toSecretFormType } from './utils';
129
import { SecretFormWrapper } from './SecretFormWrapper';
1310

14-
export const SecretLoadingWrapper = withTranslation()(
15-
class SecretLoadingWrapper extends React.Component<
16-
SecretLoadingWrapperProps & WithT,
17-
SecretLoadingWrapperState
18-
> {
19-
readonly state: SecretLoadingWrapperState = {
20-
secretTypeAbstraction: SecretTypeAbstraction.generic,
21-
};
22-
componentDidUpdate() {
23-
if (!_.isEmpty(this.props.obj.data)) {
24-
const secretTypeAbstraction = toTypeAbstraction(this.props.obj.data);
25-
if (this.state.secretTypeAbstraction !== secretTypeAbstraction) {
26-
this.setState({
27-
secretTypeAbstraction,
28-
});
29-
}
30-
}
31-
}
32-
render() {
33-
const { obj, fixedKeys } = this.props;
34-
const { secretTypeAbstraction } = this.state;
35-
if (!secretTypeAbstraction) {
36-
return <LoadingBox />;
37-
}
38-
const fixed = fixedKeys?.reduce((acc, k) => ({ ...acc, [k]: obj.data?.[k] || '' }), {});
11+
export const EditSecret: React.FC<EditSecretProps> = ({ kind }) => {
12+
const { name, ns } = useParams();
3913

40-
return (
41-
<StatusBox {...obj}>
42-
<SecretFormWrapper
43-
{...this.props}
44-
secretTypeAbstraction={secretTypeAbstraction}
45-
obj={obj.data}
46-
fixed={fixed}
47-
/>
48-
</StatusBox>
49-
);
50-
}
51-
},
52-
);
14+
const [secret, secretLoaded, secretError] = useK8sWatchResource<K8sResourceKind>({
15+
kind,
16+
isList: false,
17+
namespace: ns,
18+
name,
19+
});
20+
21+
const fixedData = secretLoaded
22+
? ['kind', 'metadata'].reduce((acc, k) => ({ ...acc, [k]: secret[k] || '' }), {})
23+
: null;
24+
25+
const formType = secretLoaded ? toSecretFormType(secret) : SecretFormType.generic;
5326

54-
export const EditSecret = ({ kind }: EditSecretProps) => {
55-
const params = useParams();
5627
const { t } = useTranslation();
28+
5729
return (
58-
<Firehose
59-
resources={[{ kind, name: params.name, namespace: params.ns, isList: false, prop: 'obj' }]}
60-
>
61-
<SecretLoadingWrapper fixedKeys={['kind', 'metadata']} saveButtonText={t('public~Save')} />
62-
</Firehose>
30+
<StatusBox loaded={secretLoaded} data={secret} loadError={secretError}>
31+
<SecretFormWrapper
32+
formType={formType}
33+
obj={secret}
34+
saveButtonText={t('public~Save')}
35+
fixed={fixedData}
36+
/>
37+
</StatusBox>
6338
);
6439
};
6540

6641
type EditSecretProps = {
6742
kind: string;
6843
};
69-
70-
type SecretLoadingWrapperProps = {
71-
obj?: {
72-
data?: K8sResourceKind;
73-
[key: string]: any;
74-
};
75-
fixedKeys: string[];
76-
saveButtonText: string;
77-
};
78-
79-
type SecretLoadingWrapperState = {
80-
secretTypeAbstraction: SecretTypeAbstraction;
81-
};

frontend/public/components/secrets/create-secret/SecretFormWrapper.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { PageHeading } from '../../utils/headings';
1111
import { resourceObjPath } from '../../utils/resource-link';
1212
import { ModalBody, ModalTitle, ModalSubmitFooter } from '../../factory/modal';
1313
import { SecretModel } from '../../../models';
14-
import { SecretTypeAbstraction } from './types';
14+
import { SecretFormType } from './types';
1515
import {
1616
toDefaultSecretType,
1717
determineSecretType,
@@ -22,13 +22,13 @@ import { SecretSubForm } from './SecretSubForm';
2222
import { isBinary } from 'istextorbinary';
2323

2424
export const SecretFormWrapper: React.FC<BaseEditSecretProps_> = (props) => {
25-
const { isCreate, modal, onCancel, secretTypeAbstraction } = props;
25+
const { formType, isCreate, modal, onCancel } = props;
2626
const { t } = useTranslation();
2727
const navigate = useNavigate();
2828
const params = useParams();
2929

3030
const existingSecret = _.pick(props.obj, ['metadata', 'type']);
31-
const defaultSecretType = toDefaultSecretType(secretTypeAbstraction);
31+
const defaultSecretType = toDefaultSecretType(formType);
3232
const initialSecret = _.defaultsDeep({}, props.fixed, existingSecret, {
3333
apiVersion: 'v1',
3434
data: {},
@@ -52,8 +52,8 @@ export const SecretFormWrapper: React.FC<BaseEditSecretProps_> = (props) => {
5252
);
5353
const [base64StringData, setBase64StringData] = React.useState(props?.obj?.data ?? {});
5454
const [disableForm, setDisableForm] = React.useState(false);
55-
const title = useSecretTitle(isCreate, secretTypeAbstraction);
56-
const helptext = useSecretDescription(secretTypeAbstraction);
55+
const title = useSecretTitle(isCreate, formType);
56+
const helptext = useSecretDescription(formType);
5757
const cancel = () => navigate(`/k8s/ns/${params.ns}/core~v1~Secret`);
5858

5959
const onDataChanged = (secretsData) => {
@@ -142,7 +142,7 @@ export const SecretFormWrapper: React.FC<BaseEditSecretProps_> = (props) => {
142142
</div>
143143
</fieldset>
144144
<SecretSubForm
145-
typeAbstraction={props.secretTypeAbstraction}
145+
formType={formType}
146146
onChange={onDataChanged}
147147
onError={onError}
148148
onFormDisable={(disable) => setDisableForm(disable)}
@@ -201,7 +201,7 @@ type BaseEditSecretProps_ = {
201201
kind?: string;
202202
isCreate?: boolean;
203203
modal?: boolean;
204-
secretTypeAbstraction?: SecretTypeAbstraction;
204+
formType?: SecretFormType;
205205
saveButtonText?: string;
206206
onCancel?: () => void;
207207
onSave?: (name: string) => void;

frontend/public/components/secrets/create-secret/SecretSubForm.tsx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import * as React from 'react';
2-
import { SecretSubFormProps, SecretTypeAbstraction } from './types';
2+
import { SecretSubFormProps, SecretFormType } from './types';
33
import { AuthSecretForm } from './AuthSecretForm';
44
import { PullSecretForm } from './PullSecretForm';
55
import { WebHookSecretForm } from './WebHookSecretForm';
66
import { OpaqueSecretForm } from './OpaqueSecretForm';
77

8-
export const SecretSubForm: React.FC<
9-
SecretSubFormProps & { typeAbstraction: SecretTypeAbstraction }
10-
> = ({ typeAbstraction, ...props }) => {
11-
switch (typeAbstraction) {
12-
case SecretTypeAbstraction.source:
8+
export const SecretSubForm: React.FC<SecretSubFormProps & { formType: SecretFormType }> = ({
9+
formType,
10+
...props
11+
}) => {
12+
switch (formType) {
13+
case SecretFormType.source:
1314
return <AuthSecretForm {...props} />;
14-
case SecretTypeAbstraction.image:
15+
case SecretFormType.image:
1516
return <PullSecretForm {...props} />;
16-
case SecretTypeAbstraction.webhook:
17+
case SecretFormType.webhook:
1718
return <WebHookSecretForm {...props} />;
1819
default:
1920
return <OpaqueSecretForm {...props} />;

frontend/public/components/secrets/create-secret/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export enum SecretTypeAbstraction {
1+
export enum SecretFormType {
22
generic = 'generic',
33
source = 'source',
44
image = 'image',

0 commit comments

Comments
 (0)