Skip to content

Commit c3a0504

Browse files
(Modal): move the close button
1 parent f3e4e1a commit c3a0504

File tree

2 files changed

+28
-50
lines changed

2 files changed

+28
-50
lines changed

src/scripts/Modal.tsx

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,30 @@
1-
import React, {
2-
HTMLAttributes,
3-
CSSProperties,
4-
FC,
5-
createContext,
6-
useContext,
7-
useMemo,
8-
ReactNode,
9-
} from 'react';
1+
import React, { HTMLAttributes, CSSProperties, FC, ReactNode } from 'react';
102
import classnames from 'classnames';
113
import { Button } from './Button';
124
import { Text } from './Text';
135
import { useEventCallback } from './hooks';
146

15-
/**
16-
*
17-
*/
18-
const ModalHandlersContext = createContext<{
19-
onHide?: () => void;
20-
}>({});
21-
227
/**
238
*
249
*/
2510
export type ModalHeaderProps = {
2611
className?: string;
2712
title?: string;
2813
tagline?: string;
29-
closeButton?: boolean;
30-
onClose?: () => void;
3114
};
3215

3316
/**
3417
*
3518
*/
3619
export const ModalHeader: FC<ModalHeaderProps> = (props) => {
37-
const {
38-
className,
39-
title,
40-
tagline,
41-
closeButton,
42-
onClose: onClose_,
43-
...rprops
44-
} = props;
45-
const { onHide: onHideModal } = useContext(ModalHandlersContext);
46-
const onClose = useEventCallback(() => {
47-
onClose_?.();
48-
onHideModal?.();
49-
});
20+
const { className, title, tagline, ...rprops } = props;
5021
const hdClassNames = classnames(className, 'slds-modal__header');
5122
return (
5223
<div className={hdClassNames} {...rprops}>
5324
<Text tag='h2' category='heading' type='medium' tabIndex={-1}>
5425
{title}
5526
</Text>
5627
{tagline ? <p className='slds-m-top_x-small'>{tagline}</p> : null}
57-
{closeButton ? (
58-
<Button
59-
type='icon-inverse'
60-
className='slds-modal__close'
61-
icon='close'
62-
iconSize='large'
63-
alt='Close'
64-
inverse
65-
onClick={onClose}
66-
/>
67-
) : null}
6828
</div>
6929
);
7030
};
@@ -131,6 +91,8 @@ export type ModalProps = {
13191
opened?: boolean;
13292
containerStyle?: CSSProperties;
13393
onHide?: () => void;
94+
closeButton?: boolean;
95+
onClose?: () => void;
13496
} & HTMLAttributes<HTMLDivElement>;
13597

13698
/**
@@ -144,6 +106,8 @@ const Modal_: FC<ModalProps> = (props) => {
144106
size,
145107
containerStyle,
146108
onHide,
109+
closeButton,
110+
onClose: onClose_,
147111
...rprops
148112
} = props;
149113
const modalClassNames = classnames(className, 'slds-modal', {
@@ -153,9 +117,12 @@ const Modal_: FC<ModalProps> = (props) => {
153117
const backdropClassNames = classnames(className, 'slds-backdrop', {
154118
'slds-backdrop_open': opened,
155119
});
156-
const handlers = useMemo(() => ({ onHide }), [onHide]);
120+
const onClose = useEventCallback(() => {
121+
onClose_?.();
122+
onHide?.();
123+
});
157124
return (
158-
<ModalHandlersContext.Provider value={handlers}>
125+
<>
159126
<section
160127
className={modalClassNames}
161128
aria-hidden={!opened}
@@ -165,11 +132,22 @@ const Modal_: FC<ModalProps> = (props) => {
165132
{...rprops}
166133
>
167134
<div className='slds-modal__container' style={containerStyle}>
135+
{closeButton ? (
136+
<Button
137+
type='icon-inverse'
138+
className='slds-modal__close'
139+
icon='close'
140+
iconSize='large'
141+
alt='Close'
142+
inverse
143+
onClick={onClose}
144+
/>
145+
) : null}
168146
{children}
169147
</div>
170148
</section>
171149
<div className={backdropClassNames} role='presentation' />
172-
</ModalHandlersContext.Provider>
150+
</>
173151
);
174152
};
175153

stories/Modal.stories.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,10 @@ export const Default: StoryObj<StoryProps> = {
142142
name: 'Default',
143143
args: {
144144
opened: true,
145+
closeButton: true,
145146
childProps: {
146147
header: {
147148
title: 'Default Modal',
148-
closeButton: true,
149149
},
150150
content: {
151151
className: 'slds-p-around_small',
@@ -171,11 +171,11 @@ export const Large: StoryObj<StoryProps> = {
171171
name: 'Large',
172172
args: {
173173
opened: true,
174+
closeButton: true,
174175
size: 'large',
175176
childProps: {
176177
header: {
177178
title: 'Large Size Modal',
178-
closeButton: true,
179179
},
180180
content: {
181181
className: 'slds-p-around_small',
@@ -201,11 +201,11 @@ export const WithTagline: StoryObj<StoryProps> = {
201201
name: 'With tagline',
202202
args: {
203203
opened: true,
204+
closeButton: true,
204205
childProps: {
205206
header: {
206207
title: 'Modal with tagline',
207208
tagline: 'This is a tagline',
208-
closeButton: true,
209209
},
210210
content: {
211211
className: 'slds-p-around_small',
@@ -231,10 +231,10 @@ export const FooterDirectional: StoryObj<StoryProps> = {
231231
name: 'Footer directional',
232232
args: {
233233
opened: true,
234+
closeButton: true,
234235
childProps: {
235236
header: {
236237
title: 'Modal with directional footer',
237-
closeButton: true,
238238
},
239239
content: {
240240
className: 'slds-p-around_small',
@@ -261,10 +261,10 @@ export const FormElements: StoryObj<StoryProps> = {
261261
name: 'Form elements',
262262
args: {
263263
opened: true,
264+
closeButton: true,
264265
childProps: {
265266
header: {
266267
title: 'Modal Form',
267-
closeButton: true,
268268
},
269269
content: {
270270
className: 'slds-p-around_small',

0 commit comments

Comments
 (0)