@@ -6,6 +6,9 @@ import cx from 'classnames';
66import { useBodyNoScroll } from './useBodyNoScroll' ;
77import { useFocusTrap } from './useFocusTrap' ;
88
9+ // https://github.com/jsdom/jsdom/issues/1781
10+ const supportsTransitions = window . TransitionEvent !== undefined ;
11+
912export type DialogPropsType = $ReadOnly < {
1013 open : boolean ,
1114 children : React . Node ,
@@ -78,44 +81,53 @@ function BaseDialog({
7881 */
7982 const [ deferredOpen , setDeferredOpen ] = React . useState < boolean > ( false ) ;
8083
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+
8194 React . useEffect ( ( ) => {
8295 setDeferredOpen ( open ) ;
83- } , [ open ] ) ;
8496
85- useBodyNoScroll ( ) ;
86- useFocusTrap ( { dialogRef : containerRef , overlayRef} ) ;
97+ if ( ! supportsTransitions ) {
98+ fireTransitionEndCallbacks ( ) ;
99+ }
100+ } , [ open , fireTransitionEndCallbacks ] ) ;
87101
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+ } ) ;
96107
97108 const handleTransitionEnd = React . useCallback (
98109 ( event : TransitionEvent ) => {
99110 if (
100- event . target !== event . currentTarget ||
101- event . propertyName ! == lastTransitionName
111+ event . target === event . currentTarget &&
112+ event . propertyName = == lastTransitionName
102113 ) {
103- return ;
114+ fireTransitionEndCallbacks ( ) ;
104115 }
116+ } ,
117+ [ fireTransitionEndCallbacks , lastTransitionName ]
118+ ) ;
105119
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 ( ) ;
112124 }
113125 } ,
114- [ open , lastTransitionName , onEntryTransitionEnd , onExitTransitionEnd ]
126+ [ onDismiss ]
115127 ) ;
116128
117129 const handleKeyUp = React . useCallback (
118- event => {
130+ ( event : SyntheticKeyboardEvent < HTMLDivElement > ) => {
119131 if ( onDismiss && event . key === 'Escape' ) {
120132 onDismiss ( ) ;
121133 event . stopPropagation ( ) ;
@@ -158,7 +170,7 @@ function BaseDialog({
158170 role = "dialog"
159171 ref = { containerRef }
160172 className = { containerClass }
161- onTransitionEnd = { handleTransitionEnd }
173+ onTransitionEnd = { supportsTransitions ? handleTransitionEnd : undefined }
162174 aria-modal = "true"
163175 aria-labelledby = { ariaLabelledBy }
164176 aria-label = { ariaLabel }
0 commit comments