Skip to content

Commit 42e0cce

Browse files
Merge pull request openshift#16061 from rhamilto/CONSOLE-4447-use-modal
CONSOLE-4447: Migrate modal hooks from useModal to useOverlay
2 parents c5f45ec + ec7204b commit 42e0cce

21 files changed

Lines changed: 186 additions & 217 deletions

File tree

frontend/packages/console-app/src/actions/hooks/useCommonActions.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,11 +161,7 @@ export const useCommonActions = <T extends readonly CommonActionCreator[]>(
161161
accessReview: asAccessReview(kind as K8sModel, resource as K8sResourceKind, 'patch'),
162162
}),
163163
}),
164-
// Excluding stable modal launcher functions (launchCountModal)
165-
// to prevent unnecessary re-renders
166-
// TODO: remove once all Modals have been updated to useOverlay
167-
// eslint-disable-next-line react-hooks/exhaustive-deps
168-
[kind, resource, t, message, actualEditPath, launchModal],
164+
[kind, resource, t, message, actualEditPath, launchModal, launchCountModal],
169165
);
170166

171167
const result = useMemo((): [ActionObject<T>, boolean] => {

frontend/packages/console-app/src/components/oauth-config/IdentityProviders.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import type { FC } from 'react';
22
import { useCallback } from 'react';
33
import * as _ from 'lodash';
44
import { useTranslation } from 'react-i18next';
5-
import { useModal } from '@console/dynamic-plugin-sdk/src/app/modal-support/useModal';
5+
import { useOverlay } from '@console/dynamic-plugin-sdk/src/app/modal-support/useOverlay';
66
import { useK8sModel } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sModel';
77
import { getGroupVersionKindForResource } from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-ref';
88
import type { RemoveIdentityProvider } from '@console/internal/components/modals/remove-idp-modal';
@@ -13,13 +13,13 @@ import type { IdentityProvider, OAuthKind } from '@console/internal/module/k8s';
1313

1414
export const IdentityProviders: FC<IdentityProvidersProps> = ({ identityProviders, obj }) => {
1515
const { t } = useTranslation();
16-
const launcher = useModal();
16+
const launchModal = useOverlay();
1717
const groupVersionKind = getGroupVersionKindForResource(obj);
1818
const [model] = useK8sModel(groupVersionKind);
19-
const launchModal = useCallback(
19+
const openRemoveModal = useCallback(
2020
(index, name, type) => {
2121
if (obj && model) {
22-
launcher<RemoveIdentityProvider>(RemoveIdentityProviderModal, {
22+
launchModal<RemoveIdentityProvider>(RemoveIdentityProviderModal, {
2323
obj,
2424
model,
2525
index,
@@ -28,7 +28,7 @@ export const IdentityProviders: FC<IdentityProvidersProps> = ({ identityProvider
2828
});
2929
}
3030
},
31-
[launcher, model, obj],
31+
[launchModal, model, obj],
3232
);
3333

3434
return _.isEmpty(identityProviders) ? (
@@ -60,7 +60,7 @@ export const IdentityProviders: FC<IdentityProvidersProps> = ({ identityProvider
6060
options={[
6161
{
6262
label: t('console-app~Remove identity provider'),
63-
callback: () => launchModal(index, idp.name, idp.type),
63+
callback: () => openRemoveModal(index, idp.name, idp.type),
6464
},
6565
]}
6666
/>

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ table in [Console dynamic plugins README](./README.md).
1212

1313
## 4.22.0-prerelease.2 - TBD
1414

15+
- **Breaking**: Changed `AlertAction` extension to use `LaunchOverlay` instead of `LaunchModal`. The `action` callback parameter is now typed as `LaunchOverlay`, which does not support the optional `id` parameter that `LaunchModal` had. Plugins implementing `console.alert-action` extensions must update their action callbacks accordingly. ([CONSOLE-4447])
1516
- **Breaking**: Removed `pluginID` from the result in `useResolvedExtensions` hook ([CONSOLE-3769], [#15904])
1617
- **Breaking**: Removed `AppInitSDK` and `useReduxStore` in `app` directory ([CONSOLE-5063], [#16019])
1718
- **Deprecated**: `useUserSettings` hook has been renamed to `useUserPreference` for consistency ([OCPBUGS-44612], [#16057])

frontend/packages/console-dynamic-plugin-sdk/docs/console-extensions.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ This extension can be used to trigger a specific action when a specific Promethe
158158
| ---- | ---------- | -------- | ----------- |
159159
| `alert` | `string` | no | Alert name as defined by `alert.rule.name` property |
160160
| `text` | `string` | no | Action text |
161-
| `action` | `CodeRef<(alert: Alert, launchModal: LaunchModal) => void>` | no | Function to perform side effect |
161+
| `action` | `CodeRef<(alert: Alert, launchModal: LaunchOverlay) => void>` | no | Function to perform side effect |
162162

163163
---
164164

frontend/packages/console-dynamic-plugin-sdk/src/extensions/notification-alert.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { Alert } from '../api/common-types';
2-
import type { LaunchModal } from '../app/modal-support/ModalProvider';
2+
import type { LaunchOverlay } from '../app/modal-support/OverlayProvider';
33
import type { Extension, CodeRef } from '../types';
44

55
/** This extension can be used to trigger a specific action when a specific Prometheus alert is observed by the Console based on its `rule.name` value. */
@@ -11,7 +11,7 @@ export type AlertAction = Extension<
1111
/** Action text */
1212
text: string;
1313
/** Function to perform side effect */
14-
action: CodeRef<(alert: Alert, launchModal: LaunchModal) => void>;
14+
action: CodeRef<(alert: Alert, launchModal: LaunchOverlay) => void>;
1515
}
1616
>;
1717

frontend/packages/console-shared/src/components/dashboard/status-card/AlertItem.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Link, useNavigate } from 'react-router';
66
import type { AlertAction } from '@console/dynamic-plugin-sdk';
77
import { isAlertAction, useResolvedExtensions } from '@console/dynamic-plugin-sdk';
88
import type { AlertItemProps } from '@console/dynamic-plugin-sdk/src/api/internal-types';
9-
import { useModal } from '@console/dynamic-plugin-sdk/src/lib-core';
9+
import { useOverlay } from '@console/dynamic-plugin-sdk/src/app/modal-support/useOverlay';
1010
import { alertURL } from '@console/internal/components/monitoring/utils';
1111
import { getAlertActions } from '@console/internal/components/notification-drawer';
1212
import { LinkifyExternal } from '@console/internal/components/utils/link';
@@ -92,7 +92,7 @@ export const StatusItem: FC<StatusItemProps> = ({
9292

9393
const AlertItem: FC<AlertItemProps> = ({ alert, documentationLink }) => {
9494
const { t } = useTranslation();
95-
const launchModal = useModal();
95+
const launchModal = useOverlay();
9696
const [actionExtensions] = useResolvedExtensions<AlertAction>(
9797
useCallback(
9898
(e): e is AlertAction => isAlertAction(e) && e.properties.alert === alert.rule.name,

frontend/packages/console-shared/src/components/modals/CreateNamespaceModal.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {
2020
import { useTranslation } from 'react-i18next';
2121
import { useNavigate } from 'react-router';
2222
import type { CreateProjectModalProps } from '@console/dynamic-plugin-sdk/src';
23-
import type { ModalComponent } from '@console/dynamic-plugin-sdk/src/app/modal-support/ModalProvider';
23+
import type { OverlayComponent } from '@console/dynamic-plugin-sdk/src/app/modal-support/OverlayProvider';
2424
import { FieldLevelHelp } from '@console/internal/components/utils/field-level-help';
2525
import { resourceObjPath } from '@console/internal/components/utils/resource-link';
2626
import { SelectorInput } from '@console/internal/components/utils/selector-input';
@@ -39,8 +39,8 @@ const defaultDeny = {
3939
},
4040
};
4141

42-
export const CreateNamespaceModal: ModalComponent<CreateProjectModalProps> = ({
43-
closeModal,
42+
export const CreateNamespaceModal: OverlayComponent<CreateProjectModalProps> = ({
43+
closeOverlay,
4444
onSubmit,
4545
}) => {
4646
const { t } = useTranslation();
@@ -99,7 +99,7 @@ export const CreateNamespaceModal: ModalComponent<CreateProjectModalProps> = ({
9999
event.preventDefault();
100100
handlePromise(create())
101101
.then((obj) => {
102-
closeModal();
102+
closeOverlay();
103103
if (onSubmit) {
104104
onSubmit(obj);
105105
} else {
@@ -157,7 +157,7 @@ export const CreateNamespaceModal: ModalComponent<CreateProjectModalProps> = ({
157157
<Modal
158158
variant={ModalVariant.small}
159159
isOpen
160-
onClose={closeModal}
160+
onClose={closeOverlay}
161161
aria-labelledby="create-namespace-modal-title"
162162
>
163163
<ModalHeader
@@ -236,7 +236,7 @@ export const CreateNamespaceModal: ModalComponent<CreateProjectModalProps> = ({
236236
type="button"
237237
variant="link"
238238
isDisabled={inProgress}
239-
onClick={closeModal}
239+
onClick={closeOverlay}
240240
data-test-id="modal-cancel-action"
241241
>
242242
{t('console-shared~Cancel')}

frontend/packages/console-shared/src/components/modals/CreateProjectModal.tsx

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import type {
1919
CreateProjectModalProps,
2020
} from '@console/dynamic-plugin-sdk/src';
2121
import { isCreateProjectModal, useResolvedExtensions } from '@console/dynamic-plugin-sdk/src';
22+
import type { OverlayComponent } from '@console/dynamic-plugin-sdk/src/app/modal-support/OverlayProvider';
2223
import { setFlag } from '@console/internal/actions/flags';
2324
import {
2425
documentationURLs,
@@ -33,10 +34,9 @@ import { ExternalLink } from '@console/shared/src/components/links/ExternalLink'
3334
import { ModalFooterWithAlerts } from '@console/shared/src/components/modals/ModalFooterWithAlerts';
3435
import { FLAGS } from '@console/shared/src/constants/common';
3536
import { useConsoleDispatch } from '@console/shared/src/hooks/useConsoleDispatch';
36-
import type { ModalComponent } from 'packages/console-dynamic-plugin-sdk/src/app/modal-support/ModalProvider';
3737

38-
const DefaultCreateProjectModal: ModalComponent<CreateProjectModalProps> = ({
39-
closeModal,
38+
const DefaultCreateProjectModal: OverlayComponent<CreateProjectModalProps> = ({
39+
closeOverlay,
4040
onSubmit,
4141
}) => {
4242
const navigate = useNavigate();
@@ -95,7 +95,7 @@ const DefaultCreateProjectModal: ModalComponent<CreateProjectModalProps> = ({
9595
event.preventDefault();
9696
handlePromise(createProject())
9797
.then((obj) => {
98-
closeModal();
98+
closeOverlay();
9999
if (onSubmit) {
100100
onSubmit(obj);
101101
} else {
@@ -114,7 +114,7 @@ const DefaultCreateProjectModal: ModalComponent<CreateProjectModalProps> = ({
114114
<Modal
115115
variant={ModalVariant.small}
116116
isOpen
117-
onClose={closeModal}
117+
onClose={closeOverlay}
118118
aria-labelledby="create-project-modal-title"
119119
>
120120
<ModalHeader
@@ -200,7 +200,7 @@ const DefaultCreateProjectModal: ModalComponent<CreateProjectModalProps> = ({
200200
type="button"
201201
variant="link"
202202
isDisabled={inProgress}
203-
onClick={closeModal}
203+
onClick={closeOverlay}
204204
data-test-id="modal-cancel-action"
205205
>
206206
{t('console-shared~Cancel')}
@@ -210,7 +210,7 @@ const DefaultCreateProjectModal: ModalComponent<CreateProjectModalProps> = ({
210210
);
211211
};
212212

213-
export const CreateProjectModal: ModalComponent<CreateProjectModalProps> = (props) => {
213+
export const CreateProjectModal: OverlayComponent<CreateProjectModalProps> = (props) => {
214214
// Get create project modal extensions
215215
const [createProjectModalExtensions, resolved] = useResolvedExtensions<
216216
CreateProjectModalExtension
@@ -225,5 +225,10 @@ export const CreateProjectModal: ModalComponent<CreateProjectModalProps> = (prop
225225
}
226226

227227
// If extension modal component exists, render it, else render default
228-
return Component ? <Component {...props} /> : <DefaultCreateProjectModal {...props} />;
228+
// Pass closeModal as an alias for closeOverlay for backward compatibility with extensions
229+
return Component ? (
230+
<Component {...props} closeModal={props.closeOverlay} />
231+
) : (
232+
<DefaultCreateProjectModal {...props} />
233+
);
229234
};
Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,20 @@
11
import { useCallback } from 'react';
2-
import type { ModalComponent } from '@console/dynamic-plugin-sdk/src/app/modal-support/ModalProvider';
3-
import { useModal } from '@console/dynamic-plugin-sdk/src/app/modal-support/useModal';
2+
import { useOverlay } from '@console/dynamic-plugin-sdk/src/app/modal-support/useOverlay';
43
import type { UseAnnotationsModal } from '@console/dynamic-plugin-sdk/src/extensions/console-types';
54
import { useK8sModel } from '@console/dynamic-plugin-sdk/src/utils/k8s/hooks/useK8sModel';
65
import { getGroupVersionKindForResource } from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-ref';
7-
import { ModalWrapper } from '@console/internal/components/factory/modal';
6+
import { LazyAnnotationsModalOverlay } from '@console/internal/components/modals';
87
import type { AnnotationsModalProps } from '@console/internal/components/modals/tags';
9-
import { AnnotationsModal } from '@console/internal/components/modals/tags';
10-
11-
const AnnotationsModalComponent: ModalComponent<AnnotationsModalProps> = ({
12-
closeModal,
13-
kind,
14-
resource,
15-
}) => {
16-
return (
17-
<ModalWrapper blocking onClose={closeModal}>
18-
<AnnotationsModal cancel={closeModal} close={closeModal} kind={kind} resource={resource} />
19-
</ModalWrapper>
20-
);
21-
};
228

239
export const useAnnotationsModal: UseAnnotationsModal = (resource) => {
24-
const launcher = useModal();
10+
const launchModal = useOverlay();
2511
const groupVersionKind = getGroupVersionKindForResource(resource);
2612
const [kind] = useK8sModel(groupVersionKind);
2713
return useCallback(
2814
() =>
2915
resource &&
3016
kind &&
31-
launcher<AnnotationsModalProps>(AnnotationsModalComponent, { kind, resource }),
32-
[launcher, kind, resource],
17+
launchModal<AnnotationsModalProps>(LazyAnnotationsModalOverlay, { kind, resource }),
18+
[launchModal, kind, resource],
3319
);
3420
};
Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,32 @@
11
import { useCallback } from 'react';
22
import { Modal, ModalHeader, ModalBody, ModalVariant } from '@patternfly/react-core';
3-
import { useModal } from '@console/dynamic-plugin-sdk/src/lib-core';
3+
import type { OverlayComponent } from '@console/dynamic-plugin-sdk/src/app/modal-support/OverlayProvider';
4+
import { useOverlay } from '@console/dynamic-plugin-sdk/src/app/modal-support/useOverlay';
45
import { CopyToClipboard } from '@console/internal/components/utils/copy-to-clipboard';
5-
import type { ModalComponent } from 'packages/console-dynamic-plugin-sdk/src/app/modal-support/ModalProvider';
66

7-
const CopyCodeModal: CopyCodeModalComponent = ({ title, snippet, closeModal }) => (
8-
<Modal isOpen onClose={closeModal} variant={ModalVariant.medium}>
9-
<ModalHeader title={title} />
7+
const CopyCodeModal: CopyCodeModalComponent = ({ title, snippet, closeOverlay }) => (
8+
<Modal
9+
isOpen
10+
onClose={closeOverlay}
11+
variant={ModalVariant.medium}
12+
aria-labelledby="copy-code-modal-title"
13+
>
14+
<ModalHeader title={title} labelId="copy-code-modal-title" />
1015
<ModalBody>
1116
<CopyToClipboard key={snippet} value={snippet} />
1217
</ModalBody>
1318
</Modal>
1419
);
1520

1621
export const useCopyCodeModal: UseCopyCodeModal = (title, snippet) => {
17-
const launcher = useModal();
18-
return useCallback(() => (snippet ? launcher(CopyCodeModal, { title, snippet }) : null), [
19-
launcher,
22+
const launchModal = useOverlay();
23+
return useCallback(() => (snippet ? launchModal(CopyCodeModal, { title, snippet }) : null), [
24+
launchModal,
2025
snippet,
2126
title,
2227
]);
2328
};
2429

2530
type CopyCodeModalProps = { title: string; snippet: string };
26-
type CopyCodeModalComponent = ModalComponent<CopyCodeModalProps>;
31+
type CopyCodeModalComponent = OverlayComponent<CopyCodeModalProps>;
2732
type UseCopyCodeModal = (title: string, snippet: string) => () => void;

0 commit comments

Comments
 (0)