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,9 @@ 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 ) ;
24
+ const [ timeId , setTimeId ] = useState ( null ) ;
22
25
const [ referenceElement , setReferenceElement ] = useState ( null ) ;
23
26
const [ popperElement , setPopperElement ] = useState ( null ) ;
24
27
@@ -58,25 +61,60 @@ const SkillsList = ({ requiredSkills, skills, limit = 3 }) => {
58
61
] ,
59
62
} ) ;
60
63
61
- const close = useCallback ( ( ) => {
62
- setIsOpen ( false ) ;
63
- } , [ setIsOpen ] ) ;
64
+ useEffect ( ( ) => {
65
+ if ( isDelayClose ) {
66
+ const timer = setTimeout ( ( ) => {
67
+ if ( ! isPopoverEnter ) {
68
+ setIsOpen ( false ) ;
69
+ setIsDelayClose ( false ) ;
70
+ setIsPopoverEnter ( false ) ;
71
+ }
72
+ } , 1000 ) ;
73
+ return ( ) => clearTimeout ( timer ) ;
74
+ }
75
+ } , [ isDelayClose , isPopoverEnter ] ) ;
76
+
77
+ const delayClose = useCallback (
78
+ ( evt ) => {
79
+ setIsDelayClose ( true ) ;
80
+ } ,
81
+ [ setIsDelayClose ]
82
+ ) ;
83
+ const close = useCallback (
84
+ ( evt ) => {
85
+ setIsOpen ( false ) ;
86
+ setIsDelayClose ( false ) ;
87
+ setIsPopoverEnter ( false ) ;
88
+ } ,
89
+ [ setIsOpen ]
90
+ ) ;
64
91
65
92
const open = useCallback ( ( ) => {
66
93
setIsOpen ( true ) ;
94
+ setIsDelayClose ( false ) ;
67
95
} , [ setIsOpen ] ) ;
68
96
69
97
const toggle = useCallback ( ( ) => {
70
98
setIsOpen ( ! isOpen ) ;
71
99
} , [ isOpen , setIsOpen ] ) ;
72
100
101
+ const enterPopover = useCallback ( ( ) => {
102
+ setIsPopoverEnter ( true ) ;
103
+ } , [ setIsPopoverEnter ] ) ;
104
+
105
+ const leavePopover = useCallback ( ( ) => {
106
+ setIsOpen ( false ) ;
107
+ setIsDelayClose ( false ) ;
108
+ setIsPopoverEnter ( false ) ;
109
+ } , [ setIsPopoverEnter ] ) ;
110
+
73
111
return (
74
112
< OutsideClickHandler onOutsideClick = { close } display = "inline" >
75
113
< div
76
114
styleName = "skills-list"
77
115
onClick = { toggle }
78
116
onMouseEnter = { open }
79
- onMouseLeave = { close }
117
+ onMouseLeave = { delayClose }
80
118
role = "button"
81
119
tabIndex = { 0 }
82
120
ref = { setReferenceElement }
@@ -94,6 +132,8 @@ const SkillsList = ({ requiredSkills, skills, limit = 3 }) => {
94
132
< div
95
133
styleName = "popover"
96
134
ref = { setPopperElement }
135
+ onMouseEnter = { enterPopover }
136
+ onMouseLeave = { leavePopover }
97
137
style = { styles . popper }
98
138
{ ...attributes . popper }
99
139
>
0 commit comments