|
| 1 | +import { useTranslation } from "next-i18next" |
| 2 | +import { useInstantSearch } from "react-instantsearch" |
| 3 | +import { faFilter } from "@fortawesome/free-solid-svg-icons" |
| 4 | +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome" |
| 5 | +import { useCallback, useState } from "react" |
| 6 | +import styled from "styled-components" |
| 7 | +import { useMediaQuery } from "usehooks-ts" |
| 8 | +import { Button, Offcanvas } from "../bootstrap" |
| 9 | +import { SearchContainer } from "./SearchContainer" |
| 10 | +import { MultiselectHierarchicalMenu } from "./HierarchicalMenuWidget" |
| 11 | +export const FilterButton = styled(Button)` |
| 12 | + font-size: 1rem; |
| 13 | + line-height: 1rem; |
| 14 | + min-height: 2rem; |
| 15 | + padding: 0.25rem 0.5rem 0.25rem 0.5rem; |
| 16 | + align-self: flex-start; |
| 17 | +` |
| 18 | +const useHasRefinements = () => { |
| 19 | + const { results } = useInstantSearch() |
| 20 | + const refinements = results.getRefinements() |
| 21 | + return refinements.length !== 0 |
| 22 | +} |
| 23 | + |
| 24 | +export const useHierarchicalMenu = ({ |
| 25 | + hierarchicalMenuProps |
| 26 | +}: { |
| 27 | + hierarchicalMenuProps: any[] |
| 28 | +}) => { |
| 29 | + const inline = useMediaQuery("(min-width: 768px)") |
| 30 | + const [show, setShow] = useState(false) |
| 31 | + const handleClose = useCallback(() => setShow(false), []) |
| 32 | + const handleOpen = useCallback(() => setShow(true), []) |
| 33 | + |
| 34 | + const hierarchicalMenu = ( |
| 35 | + <> |
| 36 | + <MultiselectHierarchicalMenu |
| 37 | + attributes={[ |
| 38 | + hierarchicalMenuProps[0].attribute, |
| 39 | + hierarchicalMenuProps[1].attribute |
| 40 | + ]} |
| 41 | + /> |
| 42 | + </> |
| 43 | + ) |
| 44 | + const hasRefinements = useHasRefinements() |
| 45 | + |
| 46 | + const { t } = useTranslation("billSearch") |
| 47 | + |
| 48 | + return { |
| 49 | + options: inline ? ( |
| 50 | + <div>{hierarchicalMenu}</div> |
| 51 | + ) : ( |
| 52 | + <Offcanvas show={show} onHide={handleClose}> |
| 53 | + <Offcanvas.Header closeButton> |
| 54 | + <Offcanvas.Title>{t("topics")}</Offcanvas.Title> |
| 55 | + </Offcanvas.Header> |
| 56 | + <Offcanvas.Body> |
| 57 | + <SearchContainer>{hierarchicalMenu}</SearchContainer> |
| 58 | + </Offcanvas.Body> |
| 59 | + </Offcanvas> |
| 60 | + ), |
| 61 | + show: inline ? null : ( |
| 62 | + <FilterButton |
| 63 | + variant="secondary" |
| 64 | + active={show} |
| 65 | + onClick={handleOpen} |
| 66 | + className={hasRefinements ? "ais-FilterButton-has-refinements" : ""} |
| 67 | + > |
| 68 | + <FontAwesomeIcon icon={faFilter} /> {t("topics")} |
| 69 | + </FilterButton> |
| 70 | + ) |
| 71 | + } |
| 72 | +} |
0 commit comments