|
1 | 1 | import * as React from 'react'; |
| 2 | +import { useEvent } from '@rc-component/util'; |
2 | 3 |
|
3 | 4 | export default function useSelectTriggerControl( |
4 | 5 | elements: () => (HTMLElement | SVGElement | undefined)[], |
5 | 6 | open: boolean, |
6 | 7 | triggerOpen: (open: boolean) => void, |
7 | 8 | customizedTrigger: boolean, |
8 | 9 | ) { |
9 | | - const propsRef = React.useRef(null); |
10 | | - propsRef.current = { |
11 | | - open, |
12 | | - triggerOpen, |
13 | | - customizedTrigger, |
14 | | - }; |
15 | | - |
16 | | - React.useEffect(() => { |
17 | | - function onGlobalMouseDown(event: MouseEvent) { |
18 | | - // If trigger is customized, Trigger will take control of popupVisible |
19 | | - if (propsRef.current?.customizedTrigger) { |
20 | | - return; |
21 | | - } |
| 10 | + const onGlobalMouseDown = useEvent((event: MouseEvent) => { |
| 11 | + // If trigger is customized, Trigger will take control of popupVisible |
| 12 | + if (customizedTrigger) { |
| 13 | + return; |
| 14 | + } |
22 | 15 |
|
23 | | - let target = event.target as HTMLElement; |
| 16 | + let target = event.target as HTMLElement; |
24 | 17 |
|
25 | | - if (target.shadowRoot && event.composed) { |
26 | | - target = (event.composedPath()[0] || target) as HTMLElement; |
27 | | - } |
| 18 | + if (target.shadowRoot && event.composed) { |
| 19 | + target = (event.composedPath()[0] || target) as HTMLElement; |
| 20 | + } |
28 | 21 |
|
29 | | - if ( |
30 | | - propsRef.current.open && |
31 | | - elements() |
32 | | - .filter((element) => element) |
33 | | - .every((element) => !element.contains(target) && element !== target) |
34 | | - ) { |
35 | | - // Should trigger close |
36 | | - propsRef.current.triggerOpen(false); |
37 | | - } |
| 22 | + if ( |
| 23 | + open && |
| 24 | + elements() |
| 25 | + .filter((element) => element) |
| 26 | + .every((element) => !element.contains(target) && element !== target) |
| 27 | + ) { |
| 28 | + // Should trigger close |
| 29 | + triggerOpen(false); |
38 | 30 | } |
| 31 | + }); |
39 | 32 |
|
| 33 | + React.useEffect(() => { |
40 | 34 | window.addEventListener('mousedown', onGlobalMouseDown); |
41 | 35 | return () => window.removeEventListener('mousedown', onGlobalMouseDown); |
42 | | - }, []); |
| 36 | + }, [onGlobalMouseDown]); |
43 | 37 | } |
0 commit comments