Skip to content

Commit 099ddb0

Browse files
committed
feat: add <HoverSensor>
1 parent 8850d4c commit 099ddb0

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

src/HoverSensor/__story__/story.tsx

Whitespace-only changes.

src/HoverSensor/index.ts

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import {Component, cloneElement} from 'react';
2+
import {h, noop} from '../util';
3+
import renderProp from '../util/renderProp';
4+
import faccToHoc from '../util/faccToHoc';
5+
6+
export interface IHoverSensorProps {
7+
bond?: boolean | string;
8+
}
9+
10+
export interface IHoverSensorState {
11+
isHover: boolean;
12+
}
13+
14+
export class HoverSensor extends Component<IHoverSensorProps, IHoverSensorState> {
15+
state: IHoverSensorState = {
16+
isHover: false
17+
};
18+
19+
onMouseEnter = (originalOnMouseEnter?) => (event) => {
20+
(originalOnMouseEnter || noop)(event);
21+
22+
this.setState({
23+
isHover: true
24+
});
25+
};
26+
27+
onMouseLeave = (originalOnMouseLeave?) => (event) => {
28+
(originalOnMouseLeave || noop)(event);
29+
30+
this.setState({
31+
isHover: false
32+
});
33+
};
34+
35+
render () {
36+
const state = {
37+
...this.state
38+
};
39+
40+
let {bond} = this.props;
41+
42+
if (bond) {
43+
if (typeof bond === 'boolean') {
44+
bond = 'bond';
45+
}
46+
47+
state[bond] = {
48+
onMouseEnter: this.onMouseEnter(),
49+
onMouseLeave: this.onMouseLeave()
50+
};
51+
52+
return renderProp(this.props, state);
53+
} else {
54+
const element = renderProp(this.props, state);
55+
56+
return cloneElement(element, {
57+
onMouseEnter: this.onMouseEnter(element.props.onMouseEnter),
58+
onMouseLeave: this.onMouseLeave(element.props.onMouseLeave)
59+
});
60+
}
61+
}
62+
}
63+
64+
export const withHover = faccToHoc(HoverSensor, 'hover');

0 commit comments

Comments
 (0)