Skip to content

Commit fe0f9b3

Browse files
author
Dominic Nguyen
authored
Add support for closeOnClick to WithTooltip (#19)
Add support for closeOnClick to WithTooltip
2 parents 79a1e54 + e003439 commit fe0f9b3

1 file changed

Lines changed: 34 additions & 14 deletions

File tree

src/components/tooltip/WithTooltip.js

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import React from 'react';
1+
import React, { useState } from 'react';
22
import PropTypes from 'prop-types';
33
import styled from 'styled-components';
44
import TooltipTrigger from 'react-popper-tooltip';
5-
import { withState } from 'recompose';
65

76
import { 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+
1932
function 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

83105
WithTooltip.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

Comments
 (0)