Skip to content

Commit c543e93

Browse files
committed
Closing dropdown on outside click
1 parent 635cd70 commit c543e93

File tree

3 files changed

+28
-7
lines changed

3 files changed

+28
-7
lines changed

package-lock.json

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

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: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState } from "react";
1+
import React, { MouseEvent, ReactNode, useCallback, useEffect, useState } from "react";
22
import clsx from "clsx";
33
import { DropdownProps } from "./Dropdown.types";
44
import "./Dropdown.scss";
@@ -26,12 +26,33 @@ 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+
}
43+
44+
return () => window.removeEventListener('click', onClickObserver);
45+
}, []);
46+
2947
return (
3048
<div
31-
id={id ? id : undefined}
49+
id={id}
3250
onMouseEnter={openOnHover ? () => setIsOpen(true) : undefined}
3351
onMouseLeave={openOnHover ? () => setIsOpen(false) : undefined}
34-
className={clsx("c4dropdown", wrapperClass && wrapperClass)}
52+
className={clsx(
53+
"c4dropdown",
54+
wrapperClass && wrapperClass
55+
)}
3556
>
3657
<button
3758
onClick={() => setIsOpen(!isOpen)}

0 commit comments

Comments
 (0)