Skip to content

Commit 0a7c9ab

Browse files
committed
add follow cursor boundary flip and tooltip mount check
1 parent 361a5d9 commit 0a7c9ab

File tree

5 files changed

+438
-443
lines changed

5 files changed

+438
-443
lines changed

.size-snapshot.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
{
22
"dist/cjs/react-popper-tooltip.js": {
3-
"bundled": 14562,
4-
"minified": 7842,
5-
"gzipped": 2194
3+
"bundled": 15320,
4+
"minified": 8206,
5+
"gzipped": 2346
66
},
77
"dist/esm/react-popper-tooltip.js": {
8-
"bundled": 14510,
9-
"minified": 7809,
10-
"gzipped": 2190,
8+
"bundled": 15268,
9+
"minified": 8173,
10+
"gzipped": 2343,
1111
"treeshaked": {
1212
"rollup": {
13-
"code": 7284,
13+
"code": 7648,
1414
"import_statements": 331
1515
},
1616
"webpack": {
17-
"code": 8518
17+
"code": 8882
1818
}
1919
}
2020
}

package.json

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"*.css"
1919
],
2020
"scripts": {
21-
"build": "rimraf dist && rollup -c && cp src/styles.css dist && yarn tsc && rimraf compiled",
21+
"build": "rm -rf dist && rollup -c && cp src/styles.css dist && yarn tsc && rm -rf compiled",
2222
"prepublishOnly": "yarn typecheck && yarn lint && yarn test && yarn build",
2323
"docs": "docz dev",
2424
"docs:build": "docz build",
@@ -47,19 +47,19 @@
4747
"react-dom": "^16.6.0"
4848
},
4949
"dependencies": {
50-
"@babel/runtime": "^7.3.1",
50+
"@babel/runtime": "^7.3.4",
5151
"react-popper": "^1.3.3"
5252
},
5353
"devDependencies": {
5454
"@babel/cli": "^7.2.3",
55-
"@babel/core": "^7.3.3",
56-
"@babel/plugin-proposal-class-properties": "^7.3.3",
57-
"@babel/plugin-transform-runtime": "^7.2.0",
58-
"@babel/preset-env": "^7.3.1",
55+
"@babel/core": "^7.3.4",
56+
"@babel/plugin-proposal-class-properties": "^7.3.4",
57+
"@babel/plugin-transform-runtime": "^7.3.4",
58+
"@babel/preset-env": "^7.3.4",
5959
"@babel/preset-react": "^7.0.0",
6060
"@babel/preset-typescript": "^7.3.3",
61-
"@types/jest": "^24.0.6",
62-
"@types/react": "^16.8.4",
61+
"@types/jest": "^24.0.9",
62+
"@types/react": "^16.8.6",
6363
"@types/react-dom": "^16.8.2",
6464
"docz": "^0.13.7",
6565
"docz-plugin-css": "^0.11.0",
@@ -70,13 +70,12 @@
7070
"prettier": "^1.16.4",
7171
"react": "^16.8.3",
7272
"react-dom": "^16.8.3",
73-
"react-testing-library": "^5.9.0",
74-
"rimraf": "^2.6.3",
75-
"rollup": "^1.2.2",
73+
"react-testing-library": "^6.0.0",
74+
"rollup": "^1.4.1",
7675
"rollup-plugin-babel": "^4.3.2",
7776
"rollup-plugin-node-resolve": "^4.0.1",
7877
"rollup-plugin-size-snapshot": "^0.8.0",
79-
"tslint": "^5.12.1",
78+
"tslint": "^5.13.1",
8079
"tslint-config-prettier": "^1.18.0",
8180
"tslint-eslint-rules": "^5.4.0",
8281
"tslint-plugin-prettier": "^2.0.1",

src/Tooltip.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@ const MUTATION_OBSERVER_CONFIG: MutationObserverInit = {
99
};
1010

1111
class Tooltip extends Component<ITooltipProps> {
12+
private mounted?: boolean;
1213
private observer?: MutationObserver;
1314

1415
public componentDidMount() {
16+
this.mounted = true;
1517
const {trigger} = this.props;
1618
const observer = (this.observer = new MutationObserver(() => {
1719
this.props.scheduleUpdate();
@@ -41,6 +43,7 @@ class Tooltip extends Component<ITooltipProps> {
4143
}
4244

4345
public componentWillUnmount() {
46+
this.mounted = false;
4447
const {trigger} = this.props;
4548
if (this.observer) {
4649
this.observer.disconnect();
@@ -93,7 +96,7 @@ class Tooltip extends Component<ITooltipProps> {
9396
private handleOutsideClick?: EventListener = event => {
9497
event.stopPropagation();
9598
event.preventDefault();
96-
if (!findDOMNode(this)!.contains(event.target as Node)) {
99+
if (this.mounted && !findDOMNode(this)!.contains(event.target as Node)) {
97100
const {
98101
hideTooltip,
99102
clearScheduled,
@@ -109,7 +112,7 @@ class Tooltip extends Component<ITooltipProps> {
109112
};
110113

111114
private handleOutsideRightClick?: EventListener = event => {
112-
if (!findDOMNode(this)!.contains(event.target as Node)) {
115+
if (this.mounted && !findDOMNode(this)!.contains(event.target as Node)) {
113116
const {
114117
hideTooltip,
115118
clearScheduled,

src/TooltipTrigger.tsx

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class TooltipTrigger extends Component<
4444

4545
private hideTimeout?: number;
4646
private showTimeout?: number;
47+
private popperOffset?: PopperJS.Offset;
4748

4849
public componentWillUnmount() {
4950
this.clearScheduled();
@@ -77,7 +78,20 @@ class TooltipTrigger extends Component<
7778
<Popper
7879
innerRef={getTooltipRef}
7980
placement={placement}
80-
modifiers={{...DEFAULT_MODIFIERS, ...modifiers}}
81+
modifiers={{
82+
...DEFAULT_MODIFIERS,
83+
...(followCursor && {
84+
followCursorModifier: {
85+
enabled: true,
86+
fn: data => {
87+
this.popperOffset = data.offsets.popper;
88+
return data;
89+
},
90+
order: 1000
91+
}
92+
}),
93+
...modifiers
94+
}}
8195
>
8296
{({
8397
ref,
@@ -88,9 +102,18 @@ class TooltipTrigger extends Component<
88102
outOfBoundaries,
89103
scheduleUpdate
90104
}) => {
91-
if (followCursor) {
105+
if (followCursor && this.popperOffset) {
92106
const {pageX, pageY} = this.state;
93-
style.transform = `translate3d(${pageX}px, ${pageY}px, 0`;
107+
const {width, height} = this.popperOffset;
108+
const x =
109+
pageX! + width > window.scrollX + document.body.offsetWidth
110+
? pageX! - width
111+
: pageX;
112+
const y =
113+
pageY! + height > window.scrollY + document.body.offsetHeight
114+
? pageY! - height
115+
: pageY;
116+
style.transform = `translate3d(${x}px, ${y}px, 0`;
94117
}
95118

96119
return (

0 commit comments

Comments
 (0)