1- import { warning } from 'rc-util/lib/warning' ;
21import { getShadowRoot } from 'rc-util/lib/Dom/shadow' ;
3- import raf from 'rc-util/lib/raf ' ;
2+ import { warning } from 'rc-util/lib/warning ' ;
43import * as React from 'react' ;
54import { getWin } from '../util' ;
65
@@ -15,66 +14,27 @@ export default function useWinClick(
1514 triggerOpen : ( open : boolean ) => void ,
1615) {
1716 const openRef = React . useRef ( open ) ;
18-
19- // Window click to hide should be lock to avoid trigger lock immediately
20- const lockRef = React . useRef ( false ) ;
21- if ( openRef . current !== open ) {
22- lockRef . current = true ;
23- openRef . current = open ;
24- }
25-
26- React . useEffect ( ( ) => {
27- const id = raf ( ( ) => {
28- lockRef . current = false ;
29- } ) ;
30-
31- return ( ) => {
32- raf . cancel ( id ) ;
33- } ;
34- } , [ open ] ) ;
17+ openRef . current = open ;
3518
3619 // Click to hide is special action since click popup element should not hide
3720 React . useEffect ( ( ) => {
3821 if ( clickToHide && popupEle && ( ! mask || maskClosable ) ) {
39- const genClickEvents = ( ) => {
40- let clickInside = false ;
41-
42- // User may mouseDown inside and drag out of popup and mouse up
43- // Record here to prevent close
44- const onWindowMouseDown = ( { target } : MouseEvent ) => {
45- clickInside = inPopupOrChild ( target ) ;
46- } ;
47-
48- const onWindowClick = ( { target } : MouseEvent ) => {
49- if (
50- ! lockRef . current &&
51- openRef . current &&
52- ! clickInside &&
53- ! inPopupOrChild ( target )
54- ) {
55- triggerOpen ( false ) ;
56- }
57- } ;
58-
59- return [ onWindowMouseDown , onWindowClick ] ;
22+ const onTriggerClose = ( { target } : MouseEvent ) => {
23+ if ( openRef . current && ! inPopupOrChild ( target ) ) {
24+ triggerOpen ( false ) ;
25+ }
6026 } ;
6127
62- // Events
63- const [ onWinMouseDown , onWinClick ] = genClickEvents ( ) ;
64- const [ onShadowMouseDown , onShadowClick ] = genClickEvents ( ) ;
65-
6628 const win = getWin ( popupEle ) ;
6729
68- win . addEventListener ( 'mousedown' , onWinMouseDown , true ) ;
69- win . addEventListener ( 'click' , onWinClick , true ) ;
70- win . addEventListener ( 'contextmenu' , onWinClick , true ) ;
30+ win . addEventListener ( 'mousedown' , onTriggerClose , true ) ;
31+ win . addEventListener ( 'contextmenu' , onTriggerClose , true ) ;
7132
7233 // shadow root
7334 const targetShadowRoot = getShadowRoot ( targetEle ) ;
7435 if ( targetShadowRoot ) {
75- targetShadowRoot . addEventListener ( 'mousedown' , onShadowMouseDown , true ) ;
76- targetShadowRoot . addEventListener ( 'click' , onShadowClick , true ) ;
77- targetShadowRoot . addEventListener ( 'contextmenu' , onShadowClick , true ) ;
36+ targetShadowRoot . addEventListener ( 'mousedown' , onTriggerClose , true ) ;
37+ targetShadowRoot . addEventListener ( 'contextmenu' , onTriggerClose , true ) ;
7838 }
7939
8040 // Warning if target and popup not in same root
@@ -89,20 +49,18 @@ export default function useWinClick(
8949 }
9050
9151 return ( ) => {
92- win . removeEventListener ( 'mousedown' , onWinMouseDown , true ) ;
93- win . removeEventListener ( 'click' , onWinClick , true ) ;
94- win . removeEventListener ( 'contextmenu' , onWinClick , true ) ;
52+ win . removeEventListener ( 'mousedown' , onTriggerClose , true ) ;
53+ win . removeEventListener ( 'contextmenu' , onTriggerClose , true ) ;
9554
9655 if ( targetShadowRoot ) {
9756 targetShadowRoot . removeEventListener (
9857 'mousedown' ,
99- onShadowMouseDown ,
58+ onTriggerClose ,
10059 true ,
10160 ) ;
102- targetShadowRoot . removeEventListener ( 'click' , onShadowClick , true ) ;
10361 targetShadowRoot . removeEventListener (
10462 'contextmenu' ,
105- onShadowClick ,
63+ onTriggerClose ,
10664 true ,
10765 ) ;
10866 }
0 commit comments