3
3
*
4
4
* Shows list of skills with "N more" link which is showing tooltip with a full list of skills.
5
5
*/
6
- import React , { useCallback , useState , useMemo } from "react" ;
6
+ import React , { useCallback , useState , useMemo , useEffect } from "react" ;
7
7
import PT from "prop-types" ;
8
8
import _ from "lodash" ;
9
9
import "./styles.module.scss" ;
@@ -19,6 +19,8 @@ const SkillsList = ({ requiredSkills, skills, limit = 3 }) => {
19
19
// if has requiredSkills, show two columns, eles show only one column
20
20
const showMatches = ! ! requiredSkills ;
21
21
const [ isOpen , setIsOpen ] = useState ( false ) ;
22
+ const [ isDelayClose , setIsDelayClose ] = useState ( false ) ;
23
+ const [ isPopoverEnter , setIsPopoverEnter ] = useState ( false ) ;
22
24
const [ referenceElement , setReferenceElement ] = useState ( null ) ;
23
25
const [ popperElement , setPopperElement ] = useState ( null ) ;
24
26
@@ -58,25 +60,46 @@ const SkillsList = ({ requiredSkills, skills, limit = 3 }) => {
58
60
] ,
59
61
} ) ;
60
62
63
+ useEffect ( ( ) => {
64
+ if ( isDelayClose ) {
65
+ const timer = setTimeout ( ( ) => {
66
+ if ( ! isPopoverEnter ) {
67
+ close ( ) ;
68
+ }
69
+ } , 300 ) ;
70
+ return ( ) => clearTimeout ( timer ) ;
71
+ }
72
+ } , [ isDelayClose , isPopoverEnter , close ] ) ;
73
+
74
+ const delayClose = useCallback ( ( ) => {
75
+ setIsDelayClose ( true ) ;
76
+ } , [ setIsDelayClose ] ) ;
61
77
const close = useCallback ( ( ) => {
62
78
setIsOpen ( false ) ;
79
+ setIsDelayClose ( false ) ;
80
+ setIsPopoverEnter ( false ) ;
63
81
} , [ setIsOpen ] ) ;
64
82
65
83
const open = useCallback ( ( ) => {
66
84
setIsOpen ( true ) ;
85
+ setIsDelayClose ( false ) ;
67
86
} , [ setIsOpen ] ) ;
68
87
69
88
const toggle = useCallback ( ( ) => {
70
89
setIsOpen ( ! isOpen ) ;
71
90
} , [ isOpen , setIsOpen ] ) ;
72
91
92
+ const enterPopover = useCallback ( ( ) => {
93
+ setIsPopoverEnter ( true ) ;
94
+ } , [ setIsPopoverEnter ] ) ;
95
+
73
96
return (
74
97
< OutsideClickHandler onOutsideClick = { close } display = "inline" >
75
98
< div
76
99
styleName = "skills-list"
77
100
onClick = { toggle }
78
101
onMouseEnter = { open }
79
- onMouseLeave = { close }
102
+ onMouseLeave = { delayClose }
80
103
role = "button"
81
104
tabIndex = { 0 }
82
105
ref = { setReferenceElement }
@@ -94,6 +117,8 @@ const SkillsList = ({ requiredSkills, skills, limit = 3 }) => {
94
117
< div
95
118
styleName = "popover"
96
119
ref = { setPopperElement }
120
+ onMouseEnter = { enterPopover }
121
+ onMouseLeave = { close }
97
122
style = { styles . popper }
98
123
{ ...attributes . popper }
99
124
>
0 commit comments