Skip to content

Commit de98252

Browse files
committed
fix hover trigger not working when multi-trigger is used
fix typing issues after react-popper upgrade
1 parent afc6ca4 commit de98252

File tree

9 files changed

+4739
-4387
lines changed

9 files changed

+4739
-4387
lines changed

.eslintrc.js

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,23 @@ module.exports = {
44
'plugin:@typescript-eslint/recommended',
55
'prettier/@typescript-eslint',
66
'plugin:prettier/recommended',
7-
'plugin:react/recommended',
8-
'plugin:jsx-a11y/recommended'
7+
'plugin:react/recommended'
98
],
109
parserOptions: {
11-
ecmaVersion: 2018,
10+
ecmaVersion: 2020,
1211
sourceType: 'module',
1312
ecmaFeatures: {
1413
jsx: true
1514
}
1615
},
17-
plugins: ['@typescript-eslint', 'react', 'jsx-a11y'],
16+
plugins: ['@typescript-eslint', 'react'],
1817
settings: {
1918
react: {
2019
version: 'detect'
2120
}
2221
},
2322
rules: {
24-
'@typescript-eslint/explicit-function-return-type': 0,
25-
'@typescript-eslint/no-non-null-assertion': 0,
26-
'react/no-find-dom-node': 0
23+
'@typescript-eslint/explicit-function-return-type': 'off',
24+
'@typescript-eslint/no-non-null-assertion': 'off'
2725
}
2826
};

.size-snapshot.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
{
22
"dist/cjs/react-popper-tooltip.js": {
3-
"bundled": 14884,
4-
"minified": 8278,
5-
"gzipped": 2420
3+
"bundled": 15217,
4+
"minified": 8547,
5+
"gzipped": 2448
66
},
77
"dist/esm/react-popper-tooltip.js": {
8-
"bundled": 14846,
9-
"minified": 8260,
10-
"gzipped": 2416,
8+
"bundled": 15179,
9+
"minified": 8529,
10+
"gzipped": 2444,
1111
"treeshaked": {
1212
"rollup": {
1313
"code": 236,
1414
"import_statements": 216
1515
},
1616
"webpack": {
17-
"code": 8937
17+
"code": 9196
1818
}
1919
}
2020
}

docs/examples/BasicTooltipTrigger.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,6 @@ const BasicTooltipTrigger = memo(
5151
)
5252
);
5353

54+
BasicTooltipTrigger.displayName = 'BasicTooltipTrigger';
55+
5456
export default BasicTooltipTrigger;

doczrc.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
import {css} from 'docz-plugin-css';
2-
31
export default {
42
title: 'react-popper-tooltip',
53
description: 'Documentation for react-popper-tooltip',
6-
typescript: true,
7-
codeSandbox: false,
8-
plugins: [css()]
4+
typescript: true
95
};

package.json

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-popper-tooltip",
3-
"version": "2.10.0",
3+
"version": "2.10.1",
44
"description": "React tooltip library built around react-popper",
55
"homepage": "https://react-popper-tooltip.netlify.com",
66
"repository": {
@@ -55,42 +55,38 @@
5555
"react-dom": "^16.6.0"
5656
},
5757
"dependencies": {
58-
"@babel/runtime": "^7.6.3",
59-
"react-popper": "^1.3.4"
58+
"@babel/runtime": "^7.7.4",
59+
"react-popper": "^1.3.6"
6060
},
6161
"devDependencies": {
62-
"@babel/cli": "^7.6.4",
63-
"@babel/core": "^7.6.4",
64-
"@babel/plugin-proposal-class-properties": "^7.5.5",
65-
"@babel/plugin-transform-runtime": "^7.6.2",
66-
"@babel/preset-env": "^7.6.3",
67-
"@babel/preset-react": "^7.6.3",
68-
"@babel/preset-typescript": "^7.6.0",
69-
"@testing-library/react": "^9.3.0",
70-
"@types/jest": "^24.0.20",
71-
"@types/react": "^16.9.11",
72-
"@types/react-dom": "^16.9.3",
73-
"@typescript-eslint/eslint-plugin": "^2.5.0",
74-
"@typescript-eslint/parser": "^2.5.0",
75-
"docz": "^1.3.2",
76-
"docz-plugin-css": "^0.11.0",
77-
"docz-theme-default": "^1.2.0",
78-
"eslint": "^6.6.0",
79-
"eslint-config-prettier": "^6.4.0",
80-
"eslint-plugin-jsx-a11y": "^6.2.3",
62+
"@babel/cli": "^7.7.4",
63+
"@babel/core": "^7.7.4",
64+
"@babel/plugin-proposal-class-properties": "^7.7.4",
65+
"@babel/plugin-transform-runtime": "^7.7.4",
66+
"@babel/preset-env": "^7.7.4",
67+
"@babel/preset-react": "^7.7.4",
68+
"@babel/preset-typescript": "^7.7.4",
69+
"@testing-library/react": "^9.3.2",
70+
"@types/jest": "^24.0.23",
71+
"@types/react": "^16.9.13",
72+
"@types/react-dom": "^16.9.4",
73+
"@typescript-eslint/eslint-plugin": "^2.9.0",
74+
"@typescript-eslint/parser": "^2.9.0",
75+
"docz": "^2.1.1",
76+
"eslint": "^6.7.1",
77+
"eslint-config-prettier": "^6.7.0",
8178
"eslint-plugin-prettier": "^3.1.1",
8279
"eslint-plugin-react": "^7.16.0",
83-
"husky": "^3.0.9",
80+
"husky": "^3.1.0",
8481
"jest": "^24.9.0",
85-
"lint-staged": "^9.4.2",
86-
"prettier": "^1.18.2",
87-
"react": "^16.11.0",
88-
"react-dom": "^16.11.0",
89-
"react-hot-loader": "^4.12.15",
90-
"rollup": "^1.25.2",
82+
"lint-staged": "^9.5.0",
83+
"prettier": "^1.19.1",
84+
"react": "^16.12.0",
85+
"react-dom": "^16.12.0",
86+
"rollup": "^1.27.5",
9187
"rollup-plugin-babel": "^4.3.3",
9288
"rollup-plugin-node-resolve": "^5.2.0",
9389
"rollup-plugin-size-snapshot": "^0.10.0",
94-
"typescript": "^3.6.4"
90+
"typescript": "^3.7.2"
9591
}
9692
}

src/Tooltip.tsx

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import React, {Component} from 'react';
2-
import {GetArrowPropsArg, GetTooltipPropsArg, TooltipProps} from './types';
3-
import {callAll, TooltipContext} from './utils';
2+
import {
3+
GetArrowPropsArg,
4+
GetTooltipPropsArg,
5+
TooltipProps,
6+
TriggerTypes
7+
} from './types';
8+
import {callAll, TooltipContext, setRef} from './utils';
49

510
const MUTATION_OBSERVER_CONFIG: MutationObserverInit = {
611
childList: true,
@@ -14,13 +19,16 @@ class Tooltip extends Component<TooltipProps> {
1419
private tooltipRef!: HTMLElement | null;
1520

1621
public componentDidMount() {
17-
const {trigger} = this.props;
1822
const observer = (this.observer = new MutationObserver(() => {
1923
this.props.scheduleUpdate();
2024
}));
2125
observer.observe(this.tooltipRef!, MUTATION_OBSERVER_CONFIG);
2226

23-
if (trigger !== 'none' && trigger !== 'focus') {
27+
if (
28+
this.isTriggeredBy('hover') ||
29+
this.isTriggeredBy('click') ||
30+
this.isTriggeredBy('right-click')
31+
) {
2432
const {
2533
removeParentOutsideClickHandler,
2634
removeParentOutsideRightClickHandler
@@ -43,12 +51,15 @@ class Tooltip extends Component<TooltipProps> {
4351
}
4452

4553
public componentWillUnmount() {
46-
const {trigger} = this.props;
4754
if (this.observer) {
4855
this.observer.disconnect();
4956
}
5057

51-
if (trigger !== 'none' && trigger !== 'focus') {
58+
if (
59+
this.isTriggeredBy('hover') ||
60+
this.isTriggeredBy('click') ||
61+
this.isTriggeredBy('right-click')
62+
) {
5263
const {
5364
isParentNoneTriggered,
5465
addParentOutsideClickHandler,
@@ -83,6 +94,13 @@ class Tooltip extends Component<TooltipProps> {
8394
);
8495
}
8596

97+
private isTriggeredBy(event: TriggerTypes) {
98+
const {trigger} = this.props;
99+
return (
100+
trigger === event || (Array.isArray(trigger) && trigger.includes(event))
101+
);
102+
}
103+
86104
private handleOutsideClick?: EventListener = event => {
87105
if (this.tooltipRef && !this.tooltipRef.contains(event.target as Node)) {
88106
const {parentOutsideClickHandler} = this.context;
@@ -131,28 +149,24 @@ class Tooltip extends Component<TooltipProps> {
131149
this.handleOutsideRightClick!
132150
);
133151

134-
private getTooltipRef = (ref: HTMLElement | null) => {
135-
this.tooltipRef = ref;
136-
this.props.innerRef(ref);
152+
private getTooltipRef = (node: HTMLElement | null) => {
153+
this.tooltipRef = node;
154+
setRef(this.props.innerRef, node);
137155
};
138156

139157
private getArrowProps = (props: GetArrowPropsArg = {}) => ({
140158
...props,
141159
style: {...props.style, ...this.props.arrowProps.style}
142160
});
143161

144-
private getTooltipProps = (props: GetTooltipPropsArg = {}) => {
145-
const isHoverTriggered = this.props.trigger === 'hover';
146-
147-
return {
148-
...props,
149-
...(isHoverTriggered && {
150-
onMouseEnter: callAll(this.props.clearScheduled, props.onMouseEnter),
151-
onMouseLeave: callAll(this.props.hideTooltip, props.onMouseLeave)
152-
}),
153-
style: {...props.style, ...this.props.style}
154-
};
155-
};
162+
private getTooltipProps = (props: GetTooltipPropsArg = {}) => ({
163+
...props,
164+
...(this.isTriggeredBy('hover') && {
165+
onMouseEnter: callAll(this.props.clearScheduled, props.onMouseEnter),
166+
onMouseLeave: callAll(this.props.hideTooltip, props.onMouseLeave)
167+
}),
168+
style: {...props.style, ...this.props.style}
169+
});
156170

157171
private contextValue = {
158172
isParentNoneTriggered: this.props.trigger === 'none',

src/types.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import ReactPopper from 'react-popper';
44

55
export type TriggerTypes = 'none' | 'click' | 'right-click' | 'hover' | 'focus';
66
export type Trigger = TriggerTypes | TriggerTypes[];
7+
export type Ref =
8+
| ((element: HTMLElement | null) => void)
9+
| {current: HTMLElement | null}
10+
| null;
711

812
export interface GetTriggerPropsArg {
913
onTouchEnd?(event: React.SyntheticEvent): void;
@@ -33,13 +37,13 @@ export interface GetArrowPropsArg {
3337
}
3438

3539
export interface ChildrenArg {
36-
triggerRef: ReactPopper.RefHandler;
40+
triggerRef: Ref;
3741
getTriggerProps(arg?: GetTriggerPropsArg): GetTriggerPropsArg;
3842
}
3943

4044
export interface TooltipArg {
41-
arrowRef: ReactPopper.RefHandler;
42-
tooltipRef: ReactPopper.RefHandler;
45+
arrowRef: Ref;
46+
tooltipRef: Ref;
4347
placement: PopperJS.Placement;
4448
getArrowProps(arg?: GetArrowPropsArg): GetArrowPropsArg;
4549
getTooltipProps(arg?: GetTooltipPropsArg): GetTooltipPropsArg;
@@ -74,11 +78,11 @@ export interface TooltipTriggerProps {
7478
/**
7579
* Function that can be used to obtain a tooltip element reference
7680
*/
77-
getTooltipRef?: ReactPopper.RefHandler;
81+
getTooltipRef?: Ref;
7882
/**
7983
* Function that can be used to obtain a trigger element reference
8084
*/
81-
getTriggerRef?: ReactPopper.RefHandler;
85+
getTriggerRef?: Ref;
8286
/**
8387
* Modifiers passed directly to the underlying popper.js instance
8488
* For more information, refer to Popper.js’ modifier docs:
@@ -133,7 +137,7 @@ export interface TooltipTriggerState {
133137
export interface TooltipProps {
134138
arrowProps: ReactPopper.PopperArrowProps;
135139
closeOnOutOfBoundaries: boolean;
136-
innerRef: ReactPopper.RefHandler;
140+
innerRef: Ref;
137141
outOfBoundaries: boolean | null;
138142
placement: PopperJS.Placement;
139143
style: React.CSSProperties;

src/utils.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React from 'react';
2+
import {Ref} from './types';
23

34
export const TooltipContext = React.createContext({});
45

@@ -18,3 +19,11 @@ export const canUseDOM = () =>
1819
window.document &&
1920
window.document.createElement
2021
);
22+
23+
export const setRef = (ref: Ref, node: HTMLElement | null) => {
24+
if (typeof ref === 'function') {
25+
return ref(node);
26+
} else if (ref != null) {
27+
ref.current = node;
28+
}
29+
};

0 commit comments

Comments
 (0)