Skip to content

Commit 1b70488

Browse files
author
Kubit
committed
Improve useManageState hook
1 parent 3e067e5 commit 1b70488

File tree

1 file changed

+28
-13
lines changed

1 file changed

+28
-13
lines changed

src/hooks/useManageState/useManageState.tsx

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,39 +35,54 @@ export const useManageState = ({
3535
[]
3636
);
3737

38-
const onMouseOver = () => {
38+
const supportHover = () => {
39+
if (typeof window !== 'undefined' && window?.matchMedia) {
40+
const query = window.matchMedia('(hover: none)');
41+
return !query.matches;
42+
}
43+
return true;
44+
};
45+
46+
const onMouseEnter = () => {
3947
setOver(true);
4048
};
4149

42-
const onMouseOut = () => {
50+
const onMouseLeave = () => {
4351
setOver(false);
4452
};
4553

46-
const onMouseDown = () => {
54+
const onPointerDown = () => {
4755
setPressed(true);
4856
};
4957

50-
const onMouseUp = () => {
58+
const onPointerCancel = () => {
59+
setPressed(false);
60+
};
61+
62+
const onPointerUp = () => {
5163
setPressed(false);
5264
};
5365

5466
const setRef = useCallback(node => {
5567
if (node) {
5668
innerRef.current = node;
5769
if (props.states.includes(STATES.PRESSED)) {
58-
innerRef?.current?.addEventListener('mousedown', onMouseDown);
59-
innerRef?.current?.addEventListener('mouseup', onMouseUp);
60-
} else if (props.states.includes(STATES.HOVER)) {
61-
innerRef?.current?.addEventListener('mouseover', onMouseOver);
62-
innerRef?.current?.addEventListener('mouseout', onMouseOut);
70+
innerRef?.current?.addEventListener('pointerdown', onPointerDown);
71+
innerRef?.current?.addEventListener('pointercancel', onPointerCancel);
72+
window.addEventListener('pointerup', onPointerUp);
73+
}
74+
if (supportHover() && props.states.includes(STATES.HOVER)) {
75+
innerRef?.current?.addEventListener('mouseenter', onMouseEnter);
76+
innerRef?.current?.addEventListener('mouseleave', onMouseLeave);
6377
}
6478
} else {
6579
// delete over listeners
66-
innerRef?.current?.removeEventListener('mouseover', onMouseOver);
67-
innerRef?.current?.removeEventListener('mouseout', onMouseOut);
80+
innerRef?.current?.removeEventListener('mouseenter', onMouseEnter);
81+
innerRef?.current?.removeEventListener('mouseleave', onMouseLeave);
6882
// delete pressed listeners
69-
innerRef?.current?.removeEventListener('mousedown', onMouseDown);
70-
innerRef?.current?.removeEventListener('mouseup', onMouseUp);
83+
innerRef?.current?.removeEventListener('pointerdown', onPointerDown);
84+
innerRef?.current?.removeEventListener('pointercancel', onPointerCancel);
85+
window.removeEventListener('pointerup', onPointerUp);
7186
innerRef.current = node;
7287
}
7388
}, []);

0 commit comments

Comments
 (0)