Skip to content

Commit 75c77bc

Browse files
authored
fix(tooltip): don't pass in a ref as it's not actually needed (#82)
1 parent 5cbf0f0 commit 75c77bc

File tree

4 files changed

+22
-22
lines changed

4 files changed

+22
-22
lines changed

packages/tooltip/README.md

+3-11
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,10 @@ For live examples check out our [storybook](https://zendeskgarden.github.io/reac
1616
### useTooltip
1717

1818
```jsx static
19-
import { useRef } from 'react';
2019
import { useTooltip } from '@zendeskgarden/container-tooltip';
2120

2221
const Tooltip = () => {
23-
const tooltipRef = useRef(null);
24-
2522
const { isVisible, getTooltipProps, getTriggerProps } = useTooltip({
26-
tooltipRef,
2723
isVisible: false,
2824
delayMilliseconds: 500
2925
});
@@ -38,8 +34,8 @@ const Tooltip = () => {
3834

3935
return (
4036
<>
41-
<div {...getTooltipProps({ ref: tooltipRef, style: styles })}>Tooltip</div>
42-
<button {...getTriggerProps({ ref: triggerRef })}>Trigger</button>
37+
<div {...getTooltipProps({ style: styles })}>Tooltip</div>
38+
<button {...getTriggerProps()}>Trigger</button>
4339
</>
4440
);
4541
};
@@ -48,14 +44,11 @@ const Tooltip = () => {
4844
### TooltipContainer
4945

5046
```jsx static
51-
import { useRef } from 'react';
5247
import { TooltipContainer } from '@zendeskgarden/container-tooltip';
5348

5449
const Tooltip = () => {
55-
const tooltipRef = useRef(null);
56-
5750
return (
58-
<TooltipContainer tooltipRef={tooltipRef} isVisible={false} delayMilliseconds={500}>
51+
<TooltipContainer isVisible={false} delayMilliseconds={500}>
5952
{({ isVisible, getTooltipProps, getTriggerProps }) => {
6053
const styles = {
6154
visibility: isVisible ? 'visible' : 'hidden',
@@ -69,7 +62,6 @@ const Tooltip = () => {
6962
<>
7063
<div
7164
{...getTooltipProps({
72-
ref: tooltipRef,
7365
style: styles
7466
})}
7567
>

packages/tooltip/src/TooltipContainer.js

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ export function TooltipContainer({ children, render = children, ...options }) {
1616
TooltipContainer.propTypes = {
1717
children: PropTypes.func,
1818
render: PropTypes.func,
19-
tooltipRef: PropTypes.shape({ current: PropTypes.instanceOf(Element) }).isRequired,
2019
delayMilliseconds: PropTypes.number,
2120
isVisible: PropTypes.bool
2221
};

packages/tooltip/src/TooltipContainer.spec.js

+3-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* found at http://www.apache.org/licenses/LICENSE-2.0.
66
*/
77

8-
import React, { useRef } from 'react';
8+
import React from 'react';
99
import { render, fireEvent } from '@testing-library/react';
1010
import { act } from 'react-dom/test-utils';
1111

@@ -17,17 +17,14 @@ describe('TooltipContainer', () => {
1717
const TOOLTIP_ID = 'test';
1818

1919
const BasicExample = props => {
20-
const tooltipRef = useRef(null);
21-
2220
return (
23-
<TooltipContainer tooltipRef={tooltipRef} id={TOOLTIP_ID} {...props}>
21+
<TooltipContainer id={TOOLTIP_ID} {...props}>
2422
{({ getTooltipProps, getTriggerProps }) => (
2523
<>
2624
<div {...getTriggerProps({ 'data-test-id': 'trigger' })}>trigger</div>
2725
<div
2826
{...getTooltipProps({
29-
'data-test-id': 'tooltip',
30-
ref: tooltipRef
27+
'data-test-id': 'tooltip'
3128
})}
3229
>
3330
tooltip

packages/tooltip/src/useTooltip.js

+16-4
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
* found at http://www.apache.org/licenses/LICENSE-2.0.
66
*/
77

8-
import { useState, useEffect } from 'react';
8+
import { useState, useEffect, useRef } from 'react';
99
import { composeEventHandlers, generateId, KEY_CODES } from '@zendeskgarden/container-utilities';
1010

11-
export function useTooltip({ tooltipRef, delayMilliseconds = 500, id, isVisible } = {}) {
11+
export function useTooltip({ delayMilliseconds = 500, id, isVisible } = {}) {
1212
const [visibility, setVisibility] = useState(isVisible);
1313
const [_id] = useState(id || generateId('garden-tooltip-container'));
14+
const isMounted = useRef(false);
1415

1516
let openTooltipTimeout;
1617
let closeTooltipTimeout;
@@ -19,7 +20,7 @@ export function useTooltip({ tooltipRef, delayMilliseconds = 500, id, isVisible
1920
clearTimeout(closeTooltipTimeout);
2021

2122
openTooltipTimeout = setTimeout(() => {
22-
if (tooltipRef.current) {
23+
if (isMounted.current) {
2324
setVisibility(true);
2425
}
2526
}, delayMs);
@@ -29,12 +30,23 @@ export function useTooltip({ tooltipRef, delayMilliseconds = 500, id, isVisible
2930
clearTimeout(openTooltipTimeout);
3031

3132
closeTooltipTimeout = setTimeout(() => {
32-
if (tooltipRef.current) {
33+
if (isMounted.current) {
3334
setVisibility(false);
3435
}
3536
}, delayMs);
3637
};
3738

39+
// Sometimes the timeout will call setVisibility even after unmount and cleanup
40+
// reproducable when running tests, happens when fast switching in storybook.
41+
// May be related https://github.com/facebook/react/pull/15650
42+
useEffect(() => {
43+
isMounted.current = true;
44+
45+
return () => {
46+
isMounted.current = false;
47+
};
48+
}, []);
49+
3850
// Clean up stray timeouts if tooltip unmounts
3951
useEffect(() => {
4052
return () => {

0 commit comments

Comments
 (0)