diff --git a/src/cryptometrics/components/dropdown/FilterDropdown.js b/src/cryptometrics/components/dropdown/FilterDropdown.js index a95b636bcb0f280bbbf9a0e5cb8a69d52e37226f..8ea571776a30cd38609a191aca62367ad0db10a5 100644 --- a/src/cryptometrics/components/dropdown/FilterDropdown.js +++ b/src/cryptometrics/components/dropdown/FilterDropdown.js @@ -5,9 +5,13 @@ import Button from "../button/Button"; import { RadioInputForm } from "../radio/RadioForm"; import { CSSTransition } from "react-transition-group"; -export function FilterDropdown({ filterOptions, setOpen, addFilter }) { +export function FilterDropdown({ + filterOptions, + setOpen, + addFilter, + dropdownRef, +}) { const [selectedFilter, setSelectedFilter] = useState(null); - const [radioValue, setRadioValue] = useState("is"); const [inputValue, setInputValue] = useState(""); @@ -39,7 +43,7 @@ export function FilterDropdown({ filterOptions, setOpen, addFilter }) { }; return ( - <div className="absolute flex flex-row z-50"> + <div className="absolute flex flex-row z-50" ref={dropdownRef}> <div className={classNames( "dark:bg-dark-600 w-56 h-max max-h-72 rounded-xl mt-2 transition-all duration-100 p-1 overflow-y-scroll shadow-lg shadow-dark-600" diff --git a/src/cryptometrics/pages/index.js b/src/cryptometrics/pages/index.js index c018b2de80242dba7ea0a9846920c77a0f598847..5612e722447acdfaec40ff782eebdeb5d30685f2 100644 --- a/src/cryptometrics/pages/index.js +++ b/src/cryptometrics/pages/index.js @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState, useRef, useCallback } from "react"; import Head from "next/head"; import Container from "../components/content/Container"; import Main from "../components/content/Main"; @@ -17,7 +17,7 @@ import { TableIcon, XIcon, } from "@heroicons/react/outline"; -import useFilters from "../hooks/useFilters"; +import { useFilters, useOnClickOutside } from "../hooks"; import { Filter, FilterButton, Filters } from "../components/filters/Filter"; import { FilterDropdown } from "../components/dropdown/FilterDropdown"; import { filterOptions } from "../constants"; @@ -29,7 +29,10 @@ import Link from "next/link"; export default function Home() { const [filters, addFilter, removeFilter] = useFilters([]); + const filterDropdownRef = useRef(null); const [dropdownOpen, setDropdownOpen] = useState(false); + const callbackDropdownClose = useCallback(() => setDropdownOpen(false), []); + useOnClickOutside(filterDropdownRef, callbackDropdownClose); const [searchText, setSearchText] = useState(""); const listOfCoins = useCryptoList("usd", 21, false); @@ -93,9 +96,9 @@ export default function Home() { setDropdownOpen(!dropdownOpen) && addFilter({}) } /> - {dropdownOpen && ( <FilterDropdown + dropdownRef={filterDropdownRef} setOpen={setDropdownOpen} addFilter={addFilter} filterOptions={Object.keys(filterOptions)