From 43e615fdf3734515b839ecc6197b5f81701b0201 Mon Sep 17 00:00:00 2001 From: Justin Edmund Date: Mon, 20 Mar 2023 10:12:25 -0700 Subject: [PATCH] Propagate filters from modal This updates how we handle filter propagation to accommodate the advanced ones. The icon lights up when filters are active. --- components/FilterBar/index.tsx | 53 ++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/components/FilterBar/index.tsx b/components/FilterBar/index.tsx index 500eba2e..116d8bf2 100644 --- a/components/FilterBar/index.tsx +++ b/components/FilterBar/index.tsx @@ -1,6 +1,7 @@ -import React, { useState } from 'react' +import React, { useEffect, useState } from 'react' import { useTranslation } from 'next-i18next' import classNames from 'classnames' +import equals from 'fast-deep-equal' import FilterModal from '~components/FilterModal' import RaidDropdown from '~components/RaidDropdown' @@ -21,17 +22,7 @@ interface Props { element?: number raidSlug?: string recency?: number - onFilter: ({ - element, - raidSlug, - recency, - }: { - element?: number - raidSlug?: string - recency?: number - }) => void -} - + onFilter: (filters: FilterSet) => void } const FilterBar = (props: Props) => { @@ -42,19 +33,31 @@ const FilterBar = (props: Props) => { const [elementOpen, setElementOpen] = useState(false) const [filterModalOpen, setFilterModalOpen] = useState(false) + const [advancedFilters, setAdvancedFilters] = useState({}) - // Fetch user's advanced filters - const filtersCookie = getCookie('filters') - const advancedFilters: FilterSet = filtersCookie - ? JSON.parse(filtersCookie as string) - : DEFAULT_FILTERSET - + const [matchesDefaultFilters, setMatchesDefaultFilters] = useState(false) // Set up classes object for showing shadow on scroll const classes = classNames({ FilterBar: true, shadow: props.scrolled, }) + const filterButtonClasses = classNames({ + Filter: true, + FiltersActive: !matchesDefaultFilters, + }) + + useEffect(() => { + // Fetch user's advanced filters + const filtersCookie = getCookie('filters') + if (filtersCookie) setAdvancedFilters(JSON.parse(filtersCookie as string)) + else setAdvancedFilters(defaultFilterset) + }, []) + + useEffect(() => { + setMatchesDefaultFilters(equals(advancedFilters, defaultFilterset)) + }, [advancedFilters, defaultFilterset]) + function openElementSelect() { setElementOpen(!elementOpen) } @@ -65,16 +68,21 @@ const FilterBar = (props: Props) => { function elementSelectChanged(value: string) { const elementValue = parseInt(value) - props.onFilter({ element: elementValue }) + props.onFilter({ element: elementValue, ...advancedFilters }) } function recencySelectChanged(value: string) { const recencyValue = parseInt(value) - props.onFilter({ recency: recencyValue }) + props.onFilter({ recency: recencyValue, ...advancedFilters }) } function raidSelectChanged(slug?: string) { - props.onFilter({ raidSlug: slug }) + props.onFilter({ raidSlug: slug, ...advancedFilters }) + } + + function handleAdvancedFiltersChanged(filters: FilterSet) { + setAdvancedFilters(filters) + props.onFilter(filters) } function onSelectChange(name: 'element' | 'recency') { @@ -159,7 +167,7 @@ const FilterBar = (props: Props) => {