Skip to content

Commit 3165af9

Browse files
committed
fix: fix modal animation mechanism
1 parent 6b7819e commit 3165af9

File tree

1 file changed

+29
-32
lines changed

1 file changed

+29
-32
lines changed

src/modal/CModal.js

+29-32
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import React, { useState, useEffect } from 'react'
22
import PropTypes from 'prop-types'
33
import classNames from 'classnames'
4+
import CFade from '../fade/CFade'
45

56
export const Context = React.createContext({})
6-
//component - CoreUI / CModal
77

8+
//component - CoreUI / CModal
89
const 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

110108
CModal.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

129126
CModal.defaultProps = {
130127
backdrop: true,
131128
fade: true,
132129
closeOnBackdrop: true
133-
};
130+
}
134131

135132
export default CModal

0 commit comments

Comments
 (0)