11import React , { useState , useEffect } from 'react'
22import PropTypes from 'prop-types'
33import classNames from 'classnames'
4+ import CFade from '../fade/CFade'
45
56export const Context = React . createContext ( { } )
6- //component - CoreUI / CModal
77
8+ //component - CoreUI / CModal
89const CModal = props => {
910
1011 const {
@@ -25,42 +26,32 @@ const CModal = props => {
2526 ...attributes
2627 } = props
2728
28- const [ isOpen , setIsOpen ] = useState ( false )
29- const [ isTransitioning , setIsTransitioning ] = useState ( )
30-
29+ const [ isOpen , setIsOpen ] = useState ( show )
3130 const modalClick = e => e . target . dataset . modal && closeOnBackdrop && close ( )
3231
3332 useEffect ( ( ) => {
34- if ( ! show && ! isOpen ) {
35- return
36- }
37- toggleShow ( show )
38- return ( ) => clearTimeout ( isTransitioning )
33+ setIsOpen ( show )
3934 } , [ show ] )
4035
36+
4137 const close = ( ) => {
4238 onClose && onClose ( )
43- toggleShow ( false )
39+ setIsOpen ( false )
4440 }
4541
46- const toggleShow = ( val ) => {
47- if ( show === isOpen ) {
48- return
49- }
50- setTimeout ( ( ) => setIsOpen ( val ) , 0 )
51- if ( fade ) {
52- setIsTransitioning ( setTimeout ( ( ) => {
53- setIsTransitioning ( false )
54- val ? onOpened && onOpened ( ) : onClosed && onClosed ( )
55- } , 150 ) )
56- }
42+ const onEntered = ( ) => onOpened && onOpened ( )
43+
44+ const onExited = ( ) => onClosed && onClosed ( )
45+
46+ const transitionProps = {
47+ baseClass : fade ? 'fade d-block' : '' ,
48+ baseClassActive : 'show' ,
49+ timeout : fade ? 150 : 0 ,
50+ unmountOnExit : true
5751 }
5852
5953 const modalClasses = classNames (
6054 'modal overflow-auto' , {
61- 'fade' : fade ,
62- 'show' : isOpen ,
63- 'd-block' : isOpen || isTransitioning ,
6455 [ `modal-${ color } ` ] : color
6556 }
6657 )
@@ -87,30 +78,36 @@ const CModal = props => {
8778
8879 return (
8980 < div onClick = { modalClick } >
90- < div
81+ < CFade
82+ { ...transitionProps }
83+ in = { Boolean ( isOpen ) }
84+ onEntered = { onEntered }
85+ onExited = { onExited }
9186 tabIndex = "-1"
9287 role = "dialog"
9388 className = { modalClasses }
9489 data-modal = { true }
9590 >
9691 < div className = { dialogClasses } role = "document" >
97- < div { ...attributes } className = { contentClasses } ref = { innerRef } >
92+ < div
93+ { ...attributes }
94+ className = { contentClasses }
95+ ref = { innerRef }
96+ >
9897 < Context . Provider value = { { close} } >
9998 { props . children }
10099 </ Context . Provider >
101100 </ div >
102101 </ div >
103- </ div >
104- { backdrop && isOpen ?
105- < div className = { backdropClasses } > </ div > : '' }
102+ </ CFade >
103+ { backdrop && isOpen && < div className = { backdropClasses } > </ div > }
106104 </ div >
107105 )
108106}
109107
110108CModal . propTypes = {
111109 children : PropTypes . node ,
112110 className : PropTypes . string ,
113- //
114111 innerRef : PropTypes . oneOfType ( [ PropTypes . object , PropTypes . func , PropTypes . string ] ) ,
115112 show : PropTypes . bool ,
116113 centered : PropTypes . bool ,
@@ -124,12 +121,12 @@ CModal.propTypes = {
124121 closeOnBackdrop : PropTypes . bool ,
125122 onClose : PropTypes . func ,
126123 addContentClass : PropTypes . string
127- } ;
124+ }
128125
129126CModal . defaultProps = {
130127 backdrop : true ,
131128 fade : true ,
132129 closeOnBackdrop : true
133- } ;
130+ }
134131
135132export default CModal
0 commit comments