Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 14563ee

Browse files
committed
fix: issue #86
1 parent f86503d commit 14563ee

File tree

1 file changed

+45
-5
lines changed

1 file changed

+45
-5
lines changed

src/components/SkillsList/index.jsx

+45-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* Shows list of skills with "N more" link which is showing tooltip with a full list of skills.
55
*/
6-
import React, { useCallback, useState, useMemo } from "react";
6+
import React, { useCallback, useState, useMemo, useEffect } from "react";
77
import PT from "prop-types";
88
import _ from "lodash";
99
import "./styles.module.scss";
@@ -19,6 +19,9 @@ const SkillsList = ({ requiredSkills, skills, limit = 3 }) => {
1919
// if has requiredSkills, show two columns, eles show only one column
2020
const showMatches = !!requiredSkills;
2121
const [isOpen, setIsOpen] = useState(false);
22+
const [isDelayClose, setIsDelayClose] = useState(false);
23+
const [isPopoverEnter, setIsPopoverEnter] = useState(false);
24+
const [timeId, setTimeId] = useState(null);
2225
const [referenceElement, setReferenceElement] = useState(null);
2326
const [popperElement, setPopperElement] = useState(null);
2427

@@ -58,25 +61,60 @@ const SkillsList = ({ requiredSkills, skills, limit = 3 }) => {
5861
],
5962
});
6063

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+
);
6491

6592
const open = useCallback(() => {
6693
setIsOpen(true);
94+
setIsDelayClose(false);
6795
}, [setIsOpen]);
6896

6997
const toggle = useCallback(() => {
7098
setIsOpen(!isOpen);
7199
}, [isOpen, setIsOpen]);
72100

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+
73111
return (
74112
<OutsideClickHandler onOutsideClick={close} display="inline">
75113
<div
76114
styleName="skills-list"
77115
onClick={toggle}
78116
onMouseEnter={open}
79-
onMouseLeave={close}
117+
onMouseLeave={delayClose}
80118
role="button"
81119
tabIndex={0}
82120
ref={setReferenceElement}
@@ -94,6 +132,8 @@ const SkillsList = ({ requiredSkills, skills, limit = 3 }) => {
94132
<div
95133
styleName="popover"
96134
ref={setPopperElement}
135+
onMouseEnter={enterPopover}
136+
onMouseLeave={leavePopover}
97137
style={styles.popper}
98138
{...attributes.popper}
99139
>

0 commit comments

Comments
 (0)