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' ;
102import classnames from 'classnames' ;
113import { Button } from './Button' ;
124import { Text } from './Text' ;
135import { useEventCallback } from './hooks' ;
146
15- /**
16- *
17- */
18- const ModalHandlersContext = createContext < {
19- onHide ?: ( ) => void ;
20- } > ( { } ) ;
21-
227/**
238 *
249 */
2510export type ModalHeaderProps = {
2611 className ?: string ;
2712 title ?: string ;
2813 tagline ?: string ;
29- closeButton ?: boolean ;
30- onClose ?: ( ) => void ;
3114} ;
3215
3316/**
3417 *
3518 */
3619export 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
0 commit comments