Skip to content

Commit 6633072

Browse files
Merge pull request #61 from code4rena-dev/develop
Bug Fix - Dropdown Updates
2 parents 635cd70 + a3b18f6 commit 6633072

File tree

4 files changed

+30
-7
lines changed

4 files changed

+30
-7
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@code4rena/components-library",
3-
"version": "4.0.0",
3+
"version": "4.0.1",
44
"description": "Code4rena's official components library ",
55
"types": "./dist/lib.d.ts",
66
"exports": {

src/lib/Dropdown/Dropdown.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ SampleComponent.parameters = {
2424
},
2525
};
2626
SampleComponent.args = {
27-
id: "",
27+
id: "storybook-dropdown",
2828
wrapperClass: "",
2929
triggerButtonClass: "",
3030
openOnHover: true,

src/lib/Dropdown/Dropdown.tsx

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState } from "react";
1+
import React, { useCallback, useEffect, useState } from "react";
22
import clsx from "clsx";
33
import { DropdownProps } from "./Dropdown.types";
44
import "./Dropdown.scss";
@@ -26,12 +26,35 @@ export const Dropdown = ({
2626
}: DropdownProps) => {
2727
const [isOpen, setIsOpen] = useState(false);
2828

29+
30+
const onClickObserver = useCallback((e: Event) => {
31+
const dropdownElement = document.querySelector(`#${id} .c4dropdown--listcontainer`);
32+
const dropdownTrigger = document.querySelector(`#${id} .c4dropdown--trigger`);
33+
34+
if (!dropdownElement?.contains(e.target as Node) && !dropdownTrigger?.contains(e.target as Node)) {
35+
setIsOpen(false);
36+
}
37+
}, []);
38+
39+
useEffect(() => {
40+
if (!openOnHover && id != null && id.length > 0) {
41+
window.addEventListener('click', onClickObserver);
42+
} else {
43+
window.removeEventListener('click', onClickObserver);
44+
}
45+
46+
return () => window.removeEventListener('click', onClickObserver);
47+
}, [openOnHover]);
48+
2949
return (
3050
<div
31-
id={id ? id : undefined}
51+
id={id ?? undefined}
3252
onMouseEnter={openOnHover ? () => setIsOpen(true) : undefined}
3353
onMouseLeave={openOnHover ? () => setIsOpen(false) : undefined}
34-
className={clsx("c4dropdown", wrapperClass && wrapperClass)}
54+
className={clsx(
55+
"c4dropdown",
56+
wrapperClass && wrapperClass
57+
)}
3558
>
3659
<button
3760
onClick={() => setIsOpen(!isOpen)}

0 commit comments

Comments
 (0)