File tree 2 files changed +69
-0
lines changed
2 files changed +69
-0
lines changed Original file line number Diff line number Diff line change
1
+ import '@testing-library/jest-dom' ;
2
+ import { render , screen , fireEvent } from '@testing-library/react' ;
3
+
4
+ import useHover from './useHover' ;
5
+
6
+ const TestComponent = ( ) => {
7
+ const [ hovered , ref ] = useHover < HTMLDivElement > ( ) ;
8
+
9
+ return (
10
+ < div data-testid = "test-component" ref = { ref } >
11
+ { `${ hovered } ` }
12
+ </ div >
13
+ ) ;
14
+ } ;
15
+
16
+ describe ( 'useHover' , ( ) => {
17
+ let testComponent : HTMLElement ;
18
+
19
+ beforeEach ( ( ) => {
20
+ render ( < TestComponent /> ) ;
21
+ testComponent = screen . getByTestId ( 'test-component' ) ;
22
+ } ) ;
23
+
24
+ test ( 'hovered์ ์ด๊น๊ฐ์ false์ด๋ค.' , ( ) => {
25
+ expect ( testComponent ) . toHaveTextContent ( 'false' ) ;
26
+ } ) ;
27
+
28
+ test ( 'ref ์ปดํฌ๋ํธ์ mouseenter ์ hovered์ ๊ฐ์ true์ด๋ค.' , ( ) => {
29
+ fireEvent . mouseEnter ( testComponent ) ;
30
+ expect ( testComponent ) . toHaveTextContent ( 'true' ) ;
31
+ } ) ;
32
+
33
+ test ( 'ref ์ปดํฌ๋ํธ์ mouseenter ํ mouseleave ์ hovered์ ๊ฐ์ false์ด๋ค.' , ( ) => {
34
+ fireEvent . mouseEnter ( testComponent ) ;
35
+ expect ( testComponent ) . toHaveTextContent ( 'true' ) ;
36
+ fireEvent . mouseLeave ( testComponent ) ;
37
+ expect ( testComponent ) . toHaveTextContent ( 'false' ) ;
38
+ } ) ;
39
+ } ) ;
Original file line number Diff line number Diff line change
1
+ import { useCallback , useRef , useState } from 'react' ;
2
+
3
+ const useHover = < T extends HTMLElement > ( ) : [ boolean , ( node : T ) => void ] => {
4
+ const ref = useRef < T | null > ( null ) ;
5
+ const [ isHovered , setIsHovered ] = useState ( false ) ;
6
+
7
+ const handleMouseEnter = useCallback ( ( ) => setIsHovered ( true ) , [ ] ) ;
8
+ const handleMouseLeave = useCallback ( ( ) => setIsHovered ( false ) , [ ] ) ;
9
+
10
+ const callbackRef = useCallback (
11
+ ( node : T ) => {
12
+ if ( ref . current ) {
13
+ ref . current . removeEventListener ( 'mouseenter' , handleMouseEnter ) ;
14
+ ref . current . removeEventListener ( 'mouseleave' , handleMouseLeave ) ;
15
+ }
16
+
17
+ ref . current = node ;
18
+
19
+ if ( ref . current ) {
20
+ ref . current . addEventListener ( 'mouseenter' , handleMouseEnter ) ;
21
+ ref . current . addEventListener ( 'mouseleave' , handleMouseLeave ) ;
22
+ }
23
+ } ,
24
+ [ handleMouseEnter , handleMouseLeave ]
25
+ ) ;
26
+
27
+ return [ isHovered , callbackRef ] ;
28
+ } ;
29
+
30
+ export default useHover ;
You canโt perform that action at this time.
0 commit comments