@@ -6,6 +6,9 @@ import cx from 'classnames';
6
6
import { useBodyNoScroll } from './useBodyNoScroll' ;
7
7
import { useFocusTrap } from './useFocusTrap' ;
8
8
9
+ // https://github.com/jsdom/jsdom/issues/1781
10
+ const supportsTransitions = window . TransitionEvent !== undefined ;
11
+
9
12
export type DialogPropsType = $ReadOnly < {
10
13
open : boolean ,
11
14
children : React . Node ,
@@ -78,44 +81,53 @@ function BaseDialog({
78
81
*/
79
82
const [ deferredOpen , setDeferredOpen ] = React . useState < boolean > ( false ) ;
80
83
84
+ const fireTransitionEndCallbacks = React . useCallback ( ( ) => {
85
+ if ( open ) {
86
+ if ( onEntryTransitionEnd ) {
87
+ onEntryTransitionEnd ( ) ;
88
+ }
89
+ } else if ( onExitTransitionEnd ) {
90
+ onExitTransitionEnd ( ) ;
91
+ }
92
+ } , [ open , onEntryTransitionEnd , onExitTransitionEnd ] ) ;
93
+
81
94
React . useEffect ( ( ) => {
82
95
setDeferredOpen ( open ) ;
83
- } , [ open ] ) ;
84
96
85
- useBodyNoScroll ( ) ;
86
- useFocusTrap ( { dialogRef : containerRef , overlayRef} ) ;
97
+ if ( ! supportsTransitions ) {
98
+ fireTransitionEndCallbacks ( ) ;
99
+ }
100
+ } , [ open , fireTransitionEndCallbacks ] ) ;
87
101
88
- const handleOverlayClick = React . useCallback (
89
- ( event : SyntheticMouseEvent < HTMLDivElement > ) => {
90
- if ( onDismiss && event . target === event . currentTarget ) {
91
- onDismiss ( ) ;
92
- }
93
- } ,
94
- [ onDismiss ]
95
- ) ;
102
+ useBodyNoScroll ( ) ;
103
+ useFocusTrap ( {
104
+ dialogRef : containerRef ,
105
+ overlayRef,
106
+ } ) ;
96
107
97
108
const handleTransitionEnd = React . useCallback (
98
109
( event : TransitionEvent ) => {
99
110
if (
100
- event . target !== event . currentTarget ||
101
- event . propertyName ! == lastTransitionName
111
+ event . target === event . currentTarget &&
112
+ event . propertyName = == lastTransitionName
102
113
) {
103
- return ;
114
+ fireTransitionEndCallbacks ( ) ;
104
115
}
116
+ } ,
117
+ [ fireTransitionEndCallbacks , lastTransitionName ]
118
+ ) ;
105
119
106
- if ( open ) {
107
- if ( onEntryTransitionEnd ) {
108
- onEntryTransitionEnd ( ) ;
109
- }
110
- } else if ( onExitTransitionEnd ) {
111
- onExitTransitionEnd ( ) ;
120
+ const handleOverlayClick = React . useCallback (
121
+ ( event : SyntheticMouseEvent < HTMLDivElement > ) => {
122
+ if ( onDismiss && event . target === event . currentTarget ) {
123
+ onDismiss ( ) ;
112
124
}
113
125
} ,
114
- [ open , lastTransitionName , onEntryTransitionEnd , onExitTransitionEnd ]
126
+ [ onDismiss ]
115
127
) ;
116
128
117
129
const handleKeyUp = React . useCallback (
118
- event => {
130
+ ( event : SyntheticKeyboardEvent < HTMLDivElement > ) => {
119
131
if ( onDismiss && event . key === 'Escape' ) {
120
132
onDismiss ( ) ;
121
133
event . stopPropagation ( ) ;
@@ -158,7 +170,7 @@ function BaseDialog({
158
170
role = "dialog"
159
171
ref = { containerRef }
160
172
className = { containerClass }
161
- onTransitionEnd = { handleTransitionEnd }
173
+ onTransitionEnd = { supportsTransitions ? handleTransitionEnd : undefined }
162
174
aria-modal = "true"
163
175
aria-labelledby = { ariaLabelledBy }
164
176
aria-label = { ariaLabel }
0 commit comments