Skip to content

Commit

Permalink
Closing dropdown on outside click
Browse files Browse the repository at this point in the history
  • Loading branch information
leo95oliveira committed Apr 9, 2024
1 parent 635cd70 commit c543e93
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 7 deletions.
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src/lib/Dropdown/Dropdown.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ SampleComponent.parameters = {
},
};
SampleComponent.args = {
id: "",
id: "storybook-dropdown",
wrapperClass: "",
triggerButtonClass: "",
openOnHover: true,
Expand Down
27 changes: 24 additions & 3 deletions src/lib/Dropdown/Dropdown.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useState } from "react";
import React, { MouseEvent, ReactNode, useCallback, useEffect, useState } from "react";
import clsx from "clsx";
import { DropdownProps } from "./Dropdown.types";
import "./Dropdown.scss";
Expand Down Expand Up @@ -26,12 +26,33 @@ export const Dropdown = ({
}: DropdownProps) => {
const [isOpen, setIsOpen] = useState(false);


const onClickObserver = useCallback((e: Event) => {
const dropdownElement = document.querySelector(`#${id} .c4dropdown--listcontainer`);
const dropdownTrigger = document.querySelector(`#${id} .c4dropdown--trigger`);

if (!dropdownElement?.contains(e.target as Node) && !dropdownTrigger?.contains(e.target as Node)) {
setIsOpen(false);
}
}, []);

useEffect(() => {
if (!openOnHover && id != null && id.length > 0) {
window.addEventListener('click', onClickObserver);
}

return () => window.removeEventListener('click', onClickObserver);
}, []);

return (
<div
id={id ? id : undefined}
id={id}
onMouseEnter={openOnHover ? () => setIsOpen(true) : undefined}
onMouseLeave={openOnHover ? () => setIsOpen(false) : undefined}
className={clsx("c4dropdown", wrapperClass && wrapperClass)}
className={clsx(
"c4dropdown",
wrapperClass && wrapperClass
)}
>
<button
onClick={() => setIsOpen(!isOpen)}
Expand Down

0 comments on commit c543e93

Please sign in to comment.