setWasClicked(true)}
onMouseOver={supportsTouch ? null : showTooltip}
onMouseLeave={supportsTouch ? null : hideTooltip}
onTouchStart={supportsTouch ? showTooltip : null}
diff --git a/ui/src/Hooks/useOnClickOutside.js b/ui/src/Hooks/useOnClickOutside.js
index d6314da93..409eff399 100644
--- a/ui/src/Hooks/useOnClickOutside.js
+++ b/ui/src/Hooks/useOnClickOutside.js
@@ -1,7 +1,7 @@
import { useEffect } from "react";
// https://usehooks.com/useOnClickOutside/
-function useOnClickOutside(ref, handler) {
+function useOnClickOutside(ref, handler, enabled) {
useEffect(() => {
const listener = (event) => {
if (!ref.current || ref.current.contains(event.target)) {
@@ -10,14 +10,16 @@ function useOnClickOutside(ref, handler) {
handler(event);
};
- document.addEventListener("mousedown", listener);
- document.addEventListener("touchstart", listener);
+ if (enabled) {
+ document.addEventListener("mousedown", listener);
+ document.addEventListener("touchstart", listener);
+ }
return () => {
document.removeEventListener("mousedown", listener);
document.removeEventListener("touchstart", listener);
};
- }, [ref, handler]);
+ }, [ref, handler, enabled]);
}
export { useOnClickOutside };
diff --git a/ui/src/Hooks/useOnClickOutside.test.js b/ui/src/Hooks/useOnClickOutside.test.js
index 80cd81641..269c5822f 100644
--- a/ui/src/Hooks/useOnClickOutside.test.js
+++ b/ui/src/Hooks/useOnClickOutside.test.js
@@ -6,10 +6,10 @@ import { mount } from "enzyme";
import { useOnClickOutside } from "./useOnClickOutside";
describe("useOnClickOutside", () => {
- const Component = () => {
+ const Component = ({ enabled }) => {
const ref = useRef();
const [isModalOpen, setModalOpen] = useState(true);
- useOnClickOutside(ref, () => setModalOpen(false));
+ useOnClickOutside(ref, () => setModalOpen(false), enabled);
return (
@@ -25,7 +25,7 @@ describe("useOnClickOutside", () => {
};
it("closes modal on click outside", () => {
- const tree = mount();
+ const tree = mount();
expect(tree.text()).toBe("Open");
const clickEvent = document.createEvent("MouseEvents");
@@ -38,7 +38,7 @@ describe("useOnClickOutside", () => {
});
it("ignores events when hidden", () => {
- const tree = mount();
+ const tree = mount();
expect(tree.text()).toBe("Open");
const clickEvent = document.createEvent("MouseEvents");
@@ -54,9 +54,34 @@ describe("useOnClickOutside", () => {
});
it("modal stays open on click inside", () => {
- const tree = mount();
+ const tree = mount();
expect(tree.text()).toBe("Open");
tree.find("span").simulate("click");
expect(tree.text()).toBe("Open");
});
+
+ it("only runs when enabled", () => {
+ const tree = mount();
+ expect(tree.text()).toBe("Open");
+
+ const clickEvent = document.createEvent("MouseEvents");
+ clickEvent.initEvent("mousedown", true, true);
+ act(() => {
+ document.dispatchEvent(clickEvent);
+ });
+
+ expect(tree.text()).toBe("Open");
+
+ tree.setProps({ enabled: true });
+ act(() => {
+ document.dispatchEvent(clickEvent);
+ });
+ expect(tree.text()).toBe("Hidden");
+ });
+
+ it("unmounts cleanly", () => {
+ const tree = mount();
+ expect(tree.text()).toBe("Open");
+ tree.unmount();
+ });
});