Skip to content

Commit e118b6c

Browse files
committed
replace findDOMNode usage for StrictMode compatibility
1 parent 2b2105a commit e118b6c

File tree

7 files changed

+1652
-1464
lines changed

7 files changed

+1652
-1464
lines changed

.size-snapshot.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
{
22
"dist/cjs/react-popper-tooltip.js": {
3-
"bundled": 15417,
4-
"minified": 8187,
5-
"gzipped": 2348
3+
"bundled": 14475,
4+
"minified": 7771,
5+
"gzipped": 2286
66
},
77
"dist/esm/react-popper-tooltip.js": {
8-
"bundled": 15365,
9-
"minified": 8154,
10-
"gzipped": 2344,
8+
"bundled": 14436,
9+
"minified": 7747,
10+
"gzipped": 2282,
1111
"treeshaked": {
1212
"rollup": {
13-
"code": 7629,
14-
"import_statements": 331
13+
"code": 7311,
14+
"import_statements": 250
1515
},
1616
"webpack": {
17-
"code": 8863
17+
"code": 8465
1818
}
1919
}
2020
}

README.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22

33
[![npm version](https://img.shields.io/npm/v/react-popper-tooltip.svg?style=flat-square)](https://www.npmjs.com/package/react-popper-tooltip)
44
[![npm downloads](https://img.shields.io/npm/dm/react-popper-tooltip.svg?style=flat-square)](https://www.npmjs.com/package/react-popper-tooltip)
5-
[![Build Status](https://travis-ci.com/mohsinulhaq/react-popper-tooltip.svg?branch=master)](https://travis-ci.com/mohsinulhaq/react-popper-tooltip)
6-
[![Netlify Status](https://api.netlify.com/api/v1/badges/dd7ae444-b156-4204-957e-4bf246d84359/deploy-status)](https://app.netlify.com/sites/react-popper-tooltip/deploys)
7-
[![Dependency Status](https://img.shields.io/david/mohsinulhaq/react-popper-tooltip.svg?style=flat-square)](https://david-dm.org/mohsinulhaq/react-popper-tooltip)
8-
[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
95
[![codecov](https://codecov.io/gh/mohsinulhaq/react-popper-tooltip/branch/master/graph/badge.svg)](https://codecov.io/gh/mohsinulhaq/react-popper-tooltip)
6+
[![Dependency Status](https://img.shields.io/david/mohsinulhaq/react-popper-tooltip.svg?style=flat-square)](https://david-dm.org/mohsinulhaq/react-popper-tooltip)
7+
[![Build Status](https://travis-ci.com/mohsinulhaq/react-popper-tooltip.svg?branch=master)](https://travis-ci.com/mohsinulhaq/react-popper-tooltip)
108

119
React tooltip component based on [react-popper](https://github.com/FezVrasta/react-popper), the React wrapper around [popper.js](https://popper.js.org/) library.
1210

package.json

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-popper-tooltip",
3-
"version": "2.8.2",
3+
"version": "2.8.3",
44
"description": "React tooltip library built around react-popper",
55
"homepage": "https://react-popper-tooltip.netlify.com",
66
"repository": {
@@ -46,40 +46,40 @@
4646
"react-dom": "^16.6.0"
4747
},
4848
"dependencies": {
49-
"@babel/runtime": "^7.4.4",
49+
"@babel/runtime": "^7.4.5",
5050
"react-popper": "^1.3.3"
5151
},
5252
"devDependencies": {
5353
"@babel/cli": "^7.4.4",
54-
"@babel/core": "^7.4.4",
54+
"@babel/core": "^7.4.5",
5555
"@babel/plugin-proposal-class-properties": "^7.4.4",
5656
"@babel/plugin-transform-runtime": "^7.4.4",
57-
"@babel/preset-env": "^7.4.4",
57+
"@babel/preset-env": "^7.4.5",
5858
"@babel/preset-react": "^7.0.0",
5959
"@babel/preset-typescript": "^7.3.3",
60-
"@types/jest": "^24.0.11",
61-
"@types/react": "^16.8.14",
60+
"@types/jest": "^24.0.13",
61+
"@types/react": "^16.8.18",
6262
"@types/react-dom": "^16.8.4",
63-
"@typescript-eslint/eslint-plugin": "^1.7.0",
64-
"@typescript-eslint/parser": "^1.7.0",
65-
"docz": "^1.0.4",
63+
"@typescript-eslint/eslint-plugin": "^1.9.0",
64+
"@typescript-eslint/parser": "^1.9.0",
65+
"docz": "^1.2.0",
6666
"docz-plugin-css": "^0.11.0",
67-
"docz-theme-default": "^1.0.4",
67+
"docz-theme-default": "^1.2.0",
6868
"eslint": "^5.16.0",
69-
"eslint-config-prettier": "^4.2.0",
69+
"eslint-config-prettier": "^4.3.0",
7070
"eslint-plugin-jsx-a11y": "^6.2.1",
71-
"eslint-plugin-prettier": "^3.0.1",
72-
"eslint-plugin-react": "^7.12.4",
73-
"jest": "^24.7.1",
71+
"eslint-plugin-prettier": "^3.1.0",
72+
"eslint-plugin-react": "^7.13.0",
73+
"jest": "^24.8.0",
7474
"pre-commit": "^1.2.2",
75-
"prettier": "^1.17.0",
75+
"prettier": "^1.17.1",
7676
"react": "^16.8.6",
7777
"react-dom": "^16.8.6",
78-
"react-hot-loader": "^4.8.4",
79-
"react-testing-library": "^7.0.0",
80-
"rollup": "^1.10.1",
78+
"react-hot-loader": "^4.8.8",
79+
"react-testing-library": "^7.0.1",
80+
"rollup": "^1.12.3",
8181
"rollup-plugin-babel": "^4.3.2",
82-
"rollup-plugin-node-resolve": "^4.2.3",
82+
"rollup-plugin-node-resolve": "^5.0.0",
8383
"rollup-plugin-size-snapshot": "^0.8.0",
8484
"typescript": "^3.4.5"
8585
}

src/Tooltip.tsx

Lines changed: 55 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import React, {Component} from 'react';
2-
import {findDOMNode} from 'react-dom';
32
import {GetArrowPropsArg, GetTooltipPropsArg, TooltipProps} from './types';
43
import {callAll, TooltipContext} from './utils';
54

@@ -9,22 +8,23 @@ const MUTATION_OBSERVER_CONFIG: MutationObserverInit = {
98
};
109

1110
class Tooltip extends Component<TooltipProps> {
12-
private mounted?: boolean;
11+
public static contextType = TooltipContext;
12+
1313
private observer?: MutationObserver;
14+
private tooltipRef = React.createRef<HTMLElement>();
1415

1516
public componentDidMount() {
16-
this.mounted = true;
1717
const {trigger} = this.props;
1818
const observer = (this.observer = new MutationObserver(() => {
1919
this.props.scheduleUpdate();
2020
}));
21-
observer.observe(findDOMNode(this)!, MUTATION_OBSERVER_CONFIG);
21+
observer.observe(this.tooltipRef.current!, MUTATION_OBSERVER_CONFIG);
2222

23-
if (trigger === 'click' || trigger === 'right-click') {
23+
if (trigger !== 'none') {
2424
const {
2525
removeParentOutsideClickHandler,
2626
removeParentOutsideRightClickHandler
27-
} = this.props;
27+
} = this.context;
2828
this.addOutsideClickHandler();
2929
this.addOutsideRightClickHandler();
3030
if (removeParentOutsideClickHandler) {
@@ -43,64 +43,53 @@ class Tooltip extends Component<TooltipProps> {
4343
}
4444

4545
public componentWillUnmount() {
46-
this.mounted = false;
4746
const {trigger} = this.props;
4847
if (this.observer) {
4948
this.observer.disconnect();
5049
}
5150

52-
if (trigger === 'click' || trigger === 'right-click') {
51+
if (trigger !== 'none') {
5352
const {
53+
isParentNoneTriggered,
5454
addParentOutsideClickHandler,
5555
addParentOutsideRightClickHandler
56-
} = this.props;
56+
} = this.context;
5757
this.removeOutsideClickHandler();
5858
this.removeOutsideRightClickHandler();
5959
this.handleOutsideClick = undefined;
6060
this.handleOutsideRightClick = undefined;
61-
if (addParentOutsideClickHandler) {
61+
if (!isParentNoneTriggered && addParentOutsideClickHandler) {
6262
addParentOutsideClickHandler();
6363
}
64-
if (addParentOutsideRightClickHandler) {
64+
if (!isParentNoneTriggered && addParentOutsideRightClickHandler) {
6565
addParentOutsideRightClickHandler();
6666
}
6767
}
6868
}
6969

7070
public render() {
71-
const {arrowProps, placement, tooltip, innerRef} = this.props;
71+
const {arrowProps, placement, tooltip} = this.props;
7272

7373
return (
74-
<TooltipContext.Provider
75-
value={{
76-
addParentOutsideClickHandler: this.addOutsideClickHandler,
77-
addParentOutsideRightClickHandler: this.addOutsideRightClickHandler,
78-
parentOutsideClickHandler: this.handleOutsideClick,
79-
parentOutsideRightClickHandler: this.handleOutsideRightClick,
80-
removeParentOutsideClickHandler: this.removeOutsideClickHandler,
81-
removeParentOutsideRightClickHandler: this
82-
.removeOutsideRightClickHandler
83-
}}
84-
>
74+
<TooltipContext.Provider value={this.contextValue}>
8575
{tooltip({
8676
arrowRef: arrowProps.ref,
8777
getArrowProps: this.getArrowProps,
8878
getTooltipProps: this.getTooltipProps,
8979
placement,
90-
tooltipRef: innerRef
80+
tooltipRef: this.getTooltipRef
9181
})}
9282
</TooltipContext.Provider>
9383
);
9484
}
9585

9686
private handleOutsideClick?: EventListener = event => {
97-
event.stopPropagation();
98-
if (this.mounted && !findDOMNode(this)!.contains(event.target as Node)) {
99-
const {
100-
hideTooltip,
101-
clearScheduled,
102-
parentOutsideClickHandler
103-
} = this.props;
87+
if (
88+
this.tooltipRef.current &&
89+
!this.tooltipRef.current.contains(event.target as Node)
90+
) {
91+
const {parentOutsideClickHandler} = this.context;
92+
const {hideTooltip, clearScheduled} = this.props;
10493

10594
clearScheduled();
10695
hideTooltip();
@@ -111,12 +100,12 @@ class Tooltip extends Component<TooltipProps> {
111100
};
112101

113102
private handleOutsideRightClick?: EventListener = event => {
114-
if (this.mounted && !findDOMNode(this)!.contains(event.target as Node)) {
115-
const {
116-
hideTooltip,
117-
clearScheduled,
118-
parentOutsideRightClickHandler
119-
} = this.props;
103+
if (
104+
this.tooltipRef.current &&
105+
!this.tooltipRef.current.contains(event.target as Node)
106+
) {
107+
const {parentOutsideRightClickHandler} = this.context;
108+
const {hideTooltip, clearScheduled} = this.props;
120109

121110
clearScheduled();
122111
hideTooltip();
@@ -127,20 +116,32 @@ class Tooltip extends Component<TooltipProps> {
127116
};
128117

129118
private addOutsideClickHandler = () => {
130-
document.addEventListener('touchend', this.handleOutsideClick!);
131-
document.addEventListener('click', this.handleOutsideClick!);
119+
document.body.addEventListener('touchend', this.handleOutsideClick!);
120+
document.body.addEventListener('click', this.handleOutsideClick!);
132121
};
133122

134123
private removeOutsideClickHandler = () => {
135-
document.removeEventListener('touchend', this.handleOutsideClick!);
136-
document.removeEventListener('click', this.handleOutsideClick!);
124+
document.body.removeEventListener('touchend', this.handleOutsideClick!);
125+
document.body.removeEventListener('click', this.handleOutsideClick!);
137126
};
138127

139128
private addOutsideRightClickHandler = () =>
140-
document.addEventListener('contextmenu', this.handleOutsideRightClick!);
129+
document.body.addEventListener(
130+
'contextmenu',
131+
this.handleOutsideRightClick!
132+
);
141133

142134
private removeOutsideRightClickHandler = () =>
143-
document.removeEventListener('contextmenu', this.handleOutsideRightClick!);
135+
document.body.removeEventListener(
136+
'contextmenu',
137+
this.handleOutsideRightClick!
138+
);
139+
140+
private getTooltipRef = (ref: HTMLElement | null) => {
141+
// @ts-ignore
142+
this.tooltipRef.current = ref;
143+
this.props.innerRef(ref);
144+
};
144145

145146
private getArrowProps = (props: GetArrowPropsArg = {}) => ({
146147
...props,
@@ -153,14 +154,22 @@ class Tooltip extends Component<TooltipProps> {
153154
return {
154155
...props,
155156
...(isHoverTriggered && {
156-
onMouseEnter: callAll(this.props.clearScheduled, props.onMouseEnter)
157-
}),
158-
...(isHoverTriggered && {
157+
onMouseEnter: callAll(this.props.clearScheduled, props.onMouseEnter),
159158
onMouseLeave: callAll(this.props.hideTooltip, props.onMouseLeave)
160159
}),
161160
style: {...props.style, ...this.props.style}
162161
};
163162
};
163+
164+
private contextValue = {
165+
isParentNoneTriggered: this.props.trigger === 'none',
166+
addParentOutsideClickHandler: this.addOutsideClickHandler,
167+
addParentOutsideRightClickHandler: this.addOutsideRightClickHandler,
168+
parentOutsideClickHandler: this.handleOutsideClick,
169+
parentOutsideRightClickHandler: this.handleOutsideRightClick,
170+
removeParentOutsideClickHandler: this.removeOutsideClickHandler,
171+
removeParentOutsideRightClickHandler: this.removeOutsideRightClickHandler
172+
};
164173
}
165174

166175
export default Tooltip;

src/TooltipTrigger.tsx

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
TooltipTriggerProps,
1212
TooltipTriggerState
1313
} from './types';
14-
import {callAll, canUseDOM, noop, TooltipContext} from './utils';
14+
import {callAll, canUseDOM, noop} from './utils';
1515

1616
const DEFAULT_MODIFIERS: PopperJS.Modifiers = {
1717
preventOverflow: {
@@ -36,8 +36,6 @@ class TooltipTrigger extends Component<
3636
usePortal: canUseDOM()
3737
};
3838

39-
public static contextType = TooltipContext;
40-
4139
public state: TooltipTriggerState = {
4240
tooltipShown: this.props.defaultTooltipShown
4341
};
@@ -65,15 +63,6 @@ class TooltipTrigger extends Component<
6563
getTooltipRef
6664
} = this.props;
6765

68-
const {
69-
parentOutsideClickHandler,
70-
addParentOutsideClickHandler,
71-
removeParentOutsideClickHandler,
72-
parentOutsideRightClickHandler,
73-
addParentOutsideRightClickHandler,
74-
removeParentOutsideRightClickHandler
75-
} = this.context;
76-
7766
const popper = (
7867
<Popper
7968
innerRef={getTooltipRef}
@@ -119,16 +108,10 @@ class TooltipTrigger extends Component<
119108
return (
120109
<Tooltip
121110
{...{
122-
addParentOutsideClickHandler,
123-
addParentOutsideRightClickHandler,
124111
arrowProps,
125112
closeOnOutOfBoundaries,
126113
outOfBoundaries,
127-
parentOutsideClickHandler,
128-
parentOutsideRightClickHandler,
129114
placement,
130-
removeParentOutsideClickHandler,
131-
removeParentOutsideRightClickHandler,
132115
scheduleUpdate,
133116
style,
134117
tooltip,
@@ -238,9 +221,7 @@ class TooltipTrigger extends Component<
238221
onContextMenu: callAll(this.contextMenuToggle, props.onContextMenu)
239222
}),
240223
...(isHoverTriggered && {
241-
onMouseEnter: callAll(this.showTooltip, props.onMouseEnter)
242-
}),
243-
...(isHoverTriggered && {
224+
onMouseEnter: callAll(this.showTooltip, props.onMouseEnter),
244225
onMouseLeave: callAll(this.hideTooltip, props.onMouseLeave)
245226
}),
246227
...(isHoverTriggered &&

src/types.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,14 +133,8 @@ export interface TooltipProps {
133133
placement: PopperJS.Placement;
134134
style: React.CSSProperties;
135135
trigger: 'none' | 'click' | 'right-click' | 'hover';
136-
addParentOutsideClickHandler(): void;
137-
addParentOutsideRightClickHandler(): void;
138136
clearScheduled(): void;
139137
hideTooltip(): void;
140-
parentOutsideClickHandler(arg: Event): void;
141-
parentOutsideRightClickHandler(arg: Event): void;
142-
removeParentOutsideRightClickHandler(): void;
143-
removeParentOutsideClickHandler(): void;
144138
tooltip(arg: TooltipArg): React.ReactNode;
145139
scheduleUpdate(): void;
146140
}

0 commit comments

Comments
 (0)