1
1
import React , { useState , useEffect } from 'react'
2
2
import PropTypes from 'prop-types'
3
3
import classNames from 'classnames'
4
+ import CFade from '../fade/CFade'
4
5
5
6
export const Context = React . createContext ( { } )
6
- //component - CoreUI / CModal
7
7
8
+ //component - CoreUI / CModal
8
9
const CModal = props => {
9
10
10
11
const {
@@ -25,42 +26,32 @@ const CModal = props => {
25
26
...attributes
26
27
} = props
27
28
28
- const [ isOpen , setIsOpen ] = useState ( false )
29
- const [ isTransitioning , setIsTransitioning ] = useState ( )
30
-
29
+ const [ isOpen , setIsOpen ] = useState ( show )
31
30
const modalClick = e => e . target . dataset . modal && closeOnBackdrop && close ( )
32
31
33
32
useEffect ( ( ) => {
34
- if ( ! show && ! isOpen ) {
35
- return
36
- }
37
- toggleShow ( show )
38
- return ( ) => clearTimeout ( isTransitioning )
33
+ setIsOpen ( show )
39
34
} , [ show ] )
40
35
36
+
41
37
const close = ( ) => {
42
38
onClose && onClose ( )
43
- toggleShow ( false )
39
+ setIsOpen ( false )
44
40
}
45
41
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
57
51
}
58
52
59
53
const modalClasses = classNames (
60
54
'modal overflow-auto' , {
61
- 'fade' : fade ,
62
- 'show' : isOpen ,
63
- 'd-block' : isOpen || isTransitioning ,
64
55
[ `modal-${ color } ` ] : color
65
56
}
66
57
)
@@ -87,30 +78,36 @@ const CModal = props => {
87
78
88
79
return (
89
80
< div onClick = { modalClick } >
90
- < div
81
+ < CFade
82
+ { ...transitionProps }
83
+ in = { Boolean ( isOpen ) }
84
+ onEntered = { onEntered }
85
+ onExited = { onExited }
91
86
tabIndex = "-1"
92
87
role = "dialog"
93
88
className = { modalClasses }
94
89
data-modal = { true }
95
90
>
96
91
< div className = { dialogClasses } role = "document" >
97
- < div { ...attributes } className = { contentClasses } ref = { innerRef } >
92
+ < div
93
+ { ...attributes }
94
+ className = { contentClasses }
95
+ ref = { innerRef }
96
+ >
98
97
< Context . Provider value = { { close} } >
99
98
{ props . children }
100
99
</ Context . Provider >
101
100
</ div >
102
101
</ div >
103
- </ div >
104
- { backdrop && isOpen ?
105
- < div className = { backdropClasses } > </ div > : '' }
102
+ </ CFade >
103
+ { backdrop && isOpen && < div className = { backdropClasses } > </ div > }
106
104
</ div >
107
105
)
108
106
}
109
107
110
108
CModal . propTypes = {
111
109
children : PropTypes . node ,
112
110
className : PropTypes . string ,
113
- //
114
111
innerRef : PropTypes . oneOfType ( [ PropTypes . object , PropTypes . func , PropTypes . string ] ) ,
115
112
show : PropTypes . bool ,
116
113
centered : PropTypes . bool ,
@@ -124,12 +121,12 @@ CModal.propTypes = {
124
121
closeOnBackdrop : PropTypes . bool ,
125
122
onClose : PropTypes . func ,
126
123
addContentClass : PropTypes . string
127
- } ;
124
+ }
128
125
129
126
CModal . defaultProps = {
130
127
backdrop : true ,
131
128
fade : true ,
132
129
closeOnBackdrop : true
133
- } ;
130
+ }
134
131
135
132
export default CModal
0 commit comments