1
- import { warning } from 'rc-util/lib/warning' ;
2
1
import { getShadowRoot } from 'rc-util/lib/Dom/shadow' ;
3
- import raf from 'rc-util/lib/raf ' ;
2
+ import { warning } from 'rc-util/lib/warning ' ;
4
3
import * as React from 'react' ;
5
4
import { getWin } from '../util' ;
6
5
@@ -15,66 +14,27 @@ export default function useWinClick(
15
14
triggerOpen : ( open : boolean ) => void ,
16
15
) {
17
16
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 ;
35
18
36
19
// Click to hide is special action since click popup element should not hide
37
20
React . useEffect ( ( ) => {
38
21
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
+ }
60
26
} ;
61
27
62
- // Events
63
- const [ onWinMouseDown , onWinClick ] = genClickEvents ( ) ;
64
- const [ onShadowMouseDown , onShadowClick ] = genClickEvents ( ) ;
65
-
66
28
const win = getWin ( popupEle ) ;
67
29
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 ) ;
71
32
72
33
// shadow root
73
34
const targetShadowRoot = getShadowRoot ( targetEle ) ;
74
35
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 ) ;
78
38
}
79
39
80
40
// Warning if target and popup not in same root
@@ -89,20 +49,18 @@ export default function useWinClick(
89
49
}
90
50
91
51
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 ) ;
95
54
96
55
if ( targetShadowRoot ) {
97
56
targetShadowRoot . removeEventListener (
98
57
'mousedown' ,
99
- onShadowMouseDown ,
58
+ onTriggerClose ,
100
59
true ,
101
60
) ;
102
- targetShadowRoot . removeEventListener ( 'click' , onShadowClick , true ) ;
103
61
targetShadowRoot . removeEventListener (
104
62
'contextmenu' ,
105
- onShadowClick ,
63
+ onTriggerClose ,
106
64
true ,
107
65
) ;
108
66
}
0 commit comments