1- import React from 'react' ;
1+ import React , { useState } from 'react' ;
22import PropTypes from 'prop-types' ;
33import styled from 'styled-components' ;
44import TooltipTrigger from 'react-popper-tooltip' ;
5- import { withState } from 'recompose' ;
65
76import { Tooltip } from './Tooltip' ;
87
@@ -16,6 +15,20 @@ const TargetSvgContainer = styled.g`
1615 cursor: ${ props => ( props . mode === 'hover' ? 'default' : 'pointer' ) } ;
1716` ;
1817
18+ const isDescendantOfAction = element => {
19+ const { parentElement } = element ;
20+
21+ if ( parentElement . tagName === 'BODY' ) {
22+ return false ;
23+ }
24+
25+ if ( parentElement . tagName === 'A' || parentElement . tagName === 'BUTTON' ) {
26+ return true ;
27+ }
28+
29+ return isDescendantOfAction ( parentElement ) ;
30+ } ;
31+
1932function WithTooltip ( {
2033 svg,
2134 trigger,
@@ -25,17 +38,26 @@ function WithTooltip({
2538 hasChrome,
2639 tooltip,
2740 children,
28- tooltipShown,
29- onVisibilityChange,
41+ startOpen,
3042 ...props
3143} ) {
3244 const Container = svg ? TargetSvgContainer : TargetContainer ;
45+ const [ isTooltipShown , setTooltipShown ] = useState ( startOpen ) ;
46+ const toggleTooltipShown = ( ) => setTooltipShown ( ! isTooltipShown ) ;
47+ const closeTooltipOnClick = event => {
48+ if ( ! closeOnClick || ! isDescendantOfAction ( event . target ) ) {
49+ return ;
50+ }
51+
52+ setTooltipShown ( false ) ;
53+ } ;
54+
3355 return (
3456 < TooltipTrigger
3557 placement = { placement }
3658 trigger = { trigger }
37- tooltipShown = { tooltipShown }
38- onVisibilityChange = { onVisibilityChange }
59+ tooltipShown = { isTooltipShown }
60+ onVisibilityChange = { toggleTooltipShown }
3961 modifiers = { modifiers }
4062 tooltip = { ( {
4163 getTooltipProps,
@@ -50,16 +72,17 @@ function WithTooltip({
5072 tooltipRef = { tooltipRef }
5173 arrowRef = { arrowRef }
5274 arrowProps = { getArrowProps ( ) }
75+ onClick = { closeTooltipOnClick }
5376 { ...getTooltipProps ( ) }
5477 >
5578 { typeof tooltip === 'function'
56- ? tooltip ( { onHide : ( ) => onVisibilityChange ( false ) } )
79+ ? tooltip ( { onHide : ( ) => setTooltipShown ( false ) } )
5780 : tooltip }
5881 </ Tooltip >
5982 ) }
6083 >
6184 { ( { getTriggerProps, triggerRef } ) => (
62- < Container ref = { triggerRef } { ...getTriggerProps ( ) } { ...props } >
85+ < Container ref = { triggerRef } { ...getTriggerProps ( ) } { ...props } onClick = { toggleTooltipShown } >
6386 { children }
6487 </ Container >
6588 ) }
@@ -76,8 +99,7 @@ WithTooltip.propTypes = {
7699 hasChrome : PropTypes . bool ,
77100 tooltip : PropTypes . oneOfType ( [ PropTypes . node , PropTypes . func ] ) . isRequired ,
78101 children : PropTypes . node . isRequired ,
79- tooltipShown : PropTypes . bool ,
80- onVisibilityChange : PropTypes . func . isRequired ,
102+ startOpen : PropTypes . bool ,
81103} ;
82104
83105WithTooltip . defaultProps = {
@@ -87,9 +109,7 @@ WithTooltip.defaultProps = {
87109 placement : 'top' ,
88110 modifiers : { } ,
89111 hasChrome : true ,
90- tooltipShown : false ,
112+ startOpen : false ,
91113} ;
92114
93- export default withState ( 'tooltipShown' , 'onVisibilityChange' , ( { startOpen } ) => startOpen ) (
94- WithTooltip
95- ) ;
115+ export default WithTooltip ;
0 commit comments