From 4533addcfd036c94cb11438b7b7b650815b3bb99 Mon Sep 17 00:00:00 2001
From: Himanshu Aggarwal <aggarwah@mcmaster.ca>
Date: Mon, 14 Mar 2022 12:41:08 -0400
Subject: [PATCH] Add hook to detect click outside a ref

---
 src/cryptometrics/hooks/index.js             |  2 ++
 src/cryptometrics/hooks/useFilters.js        |  4 ++--
 src/cryptometrics/hooks/useOnClickOutside.js | 18 ++++++++++++++++++
 3 files changed, 22 insertions(+), 2 deletions(-)
 create mode 100644 src/cryptometrics/hooks/index.js
 create mode 100644 src/cryptometrics/hooks/useOnClickOutside.js

diff --git a/src/cryptometrics/hooks/index.js b/src/cryptometrics/hooks/index.js
new file mode 100644
index 0000000..678b577
--- /dev/null
+++ b/src/cryptometrics/hooks/index.js
@@ -0,0 +1,2 @@
+export * from "./useFilters";
+export * from "./useOnClickOutside";
diff --git a/src/cryptometrics/hooks/useFilters.js b/src/cryptometrics/hooks/useFilters.js
index 145c8d4..d5fde2b 100644
--- a/src/cryptometrics/hooks/useFilters.js
+++ b/src/cryptometrics/hooks/useFilters.js
@@ -1,4 +1,4 @@
-import React, { useState } from "react";
+import { useState } from "react";
 
 /**
  * Format of each filter should be:
@@ -8,7 +8,7 @@ import React, { useState } from "react";
  *  value: ""
  * }
  */
-export default function useFilters(initialArray) {
+export function useFilters(initialArray) {
   const [filters, setFilters] = useState(initialArray);
 
   const checkIfFilterExists = (filter) => {
diff --git a/src/cryptometrics/hooks/useOnClickOutside.js b/src/cryptometrics/hooks/useOnClickOutside.js
new file mode 100644
index 0000000..95b795f
--- /dev/null
+++ b/src/cryptometrics/hooks/useOnClickOutside.js
@@ -0,0 +1,18 @@
+import { useEffect } from "react";
+
+export function useOnClickOutside(ref, handler) {
+  useEffect(() => {
+    const listener = (event) => {
+      if (ref.current && ref.current?.contains(event.target)) {
+        return;
+      }
+      handler(event);
+    };
+    document.addEventListener("mousedown", listener);
+    document.addEventListener("touchstart", listener);
+    return () => {
+      document.removeEventListener("mousedown", listener);
+      document.removeEventListener("touchstart", listener);
+    };
+  }, [ref, handler]);
+}
-- 
GitLab