@@ -35,39 +35,54 @@ export const useManageState = ({
35
35
[ ]
36
36
) ;
37
37
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 = ( ) => {
39
47
setOver ( true ) ;
40
48
} ;
41
49
42
- const onMouseOut = ( ) => {
50
+ const onMouseLeave = ( ) => {
43
51
setOver ( false ) ;
44
52
} ;
45
53
46
- const onMouseDown = ( ) => {
54
+ const onPointerDown = ( ) => {
47
55
setPressed ( true ) ;
48
56
} ;
49
57
50
- const onMouseUp = ( ) => {
58
+ const onPointerCancel = ( ) => {
59
+ setPressed ( false ) ;
60
+ } ;
61
+
62
+ const onPointerUp = ( ) => {
51
63
setPressed ( false ) ;
52
64
} ;
53
65
54
66
const setRef = useCallback ( node => {
55
67
if ( node ) {
56
68
innerRef . current = node ;
57
69
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 ) ;
63
77
}
64
78
} else {
65
79
// 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 ) ;
68
82
// 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 ) ;
71
86
innerRef . current = node ;
72
87
}
73
88
} , [ ] ) ;
0 commit comments