1
1
import { DOMRefValue } from '@react-types/shared' ;
2
2
import { Overlay } from '@react-spectrum/overlays' ;
3
- import { PositionProps , useOverlayPosition } from '@react-aria/overlays' ;
4
3
import { PressResponder } from '@react-aria/interactions' ;
5
- import React , { Fragment , ReactElement , RefObject , useRef } from 'react' ;
4
+ import React , { Fragment , useRef } from 'react' ;
5
+ import { TooltipTriggerProps } from '@react-types/tooltip' ;
6
6
import { unwrapDOMRef } from '@react-spectrum/utils' ;
7
- import { useControlledState } from '@react-stately/utils' ;
8
-
9
- interface TooltipTriggerProps extends PositionProps {
10
- children : ReactElement [ ] ,
11
- type ?: 'click' ,
12
- targetRef ?: RefObject < HTMLElement > ,
13
- isOpen ?: boolean ,
14
- defaultOpen ?: boolean ,
15
- onOpenChange ?: ( isOpen : boolean ) => void
16
- }
7
+ import { useOverlayPosition } from '@react-aria/overlays' ;
8
+ import { useTooltipTrigger } from '@react-aria/tooltip' ;
9
+ import { useTooltipTriggerState } from '@react-stately/tooltip' ;
17
10
18
11
export function TooltipTrigger ( props : TooltipTriggerProps ) {
19
12
let {
20
13
children,
21
14
type,
22
15
targetRef,
23
16
isOpen,
24
- defaultOpen,
25
- onOpenChange
17
+ isDisabled
26
18
} = props ;
27
19
28
20
let [ trigger , content ] = React . Children . toArray ( children ) ;
29
21
30
- let [ open , setOpen ] = useControlledState ( isOpen , defaultOpen || false , onOpenChange ) ;
31
-
32
- let onInteraction = ( ) => {
33
- setOpen ( ! open ) ;
34
- } ;
22
+ let state = useTooltipTriggerState ( props ) ;
35
23
36
24
let containerRef = useRef < DOMRefValue < HTMLDivElement > > ( ) ;
37
25
let triggerRef = useRef < HTMLElement > ( ) ;
38
26
let overlayRef = useRef < HTMLDivElement > ( ) ;
39
27
28
+ let { triggerProps, tooltipProps} = useTooltipTrigger ( {
29
+ tooltipProps : content . props ,
30
+ triggerProps : {
31
+ ...trigger . props ,
32
+ ref : triggerRef
33
+ } ,
34
+ state,
35
+ type
36
+ } ) ;
37
+
40
38
let { overlayProps, placement, arrowProps} = useOverlayPosition ( {
41
39
placement : props . placement ,
42
40
containerRef : unwrapDOMRef ( containerRef ) ,
@@ -47,23 +45,20 @@ export function TooltipTrigger(props: TooltipTriggerProps) {
47
45
48
46
delete overlayProps . style . position ;
49
47
50
- let triggerPropsWithRef = {
51
- ref : triggerRef
52
- } ;
53
-
54
48
let overlay = (
55
- < Overlay isOpen = { open } ref = { containerRef } >
56
- { React . cloneElement ( content , { placement : placement , arrowProps : arrowProps , ref : overlayRef , ... overlayProps , isOpen : open } ) }
49
+ < Overlay isOpen = { state . open } ref = { containerRef } >
50
+ { React . cloneElement ( content , { placement : placement , arrowProps : arrowProps , ref : overlayRef , UNSAFE_style : overlayProps . style , isOpen : open , ... tooltipProps } ) }
57
51
</ Overlay >
58
52
) ;
59
53
60
54
if ( type === 'click' ) {
61
55
return (
62
56
< Fragment >
63
57
< PressResponder
64
- { ...triggerPropsWithRef }
58
+ { ...triggerProps }
59
+ ref = { triggerRef }
65
60
isPressed = { isOpen }
66
- onPress = { onInteraction } >
61
+ isDisabled = { isDisabled } >
67
62
{ trigger }
68
63
</ PressResponder >
69
64
{ overlay }
0 commit comments