Propagate filters from modal

This updates how we handle filter propagation to accommodate the advanced ones. The icon lights up when filters are active.
This commit is contained in:
Justin Edmund 2023-03-20 10:12:25 -07:00
parent 61e17f655c
commit 43e615fdf3

View file

@ -1,6 +1,7 @@
import React, { useState } from 'react' import React, { useEffect, useState } from 'react'
import { useTranslation } from 'next-i18next' import { useTranslation } from 'next-i18next'
import classNames from 'classnames' import classNames from 'classnames'
import equals from 'fast-deep-equal'
import FilterModal from '~components/FilterModal' import FilterModal from '~components/FilterModal'
import RaidDropdown from '~components/RaidDropdown' import RaidDropdown from '~components/RaidDropdown'
@ -21,17 +22,7 @@ interface Props {
element?: number element?: number
raidSlug?: string raidSlug?: string
recency?: number recency?: number
onFilter: ({ onFilter: (filters: FilterSet) => void
element,
raidSlug,
recency,
}: {
element?: number
raidSlug?: string
recency?: number
}) => void
}
} }
const FilterBar = (props: Props) => { const FilterBar = (props: Props) => {
@ -42,19 +33,31 @@ const FilterBar = (props: Props) => {
const [elementOpen, setElementOpen] = useState(false) const [elementOpen, setElementOpen] = useState(false)
const [filterModalOpen, setFilterModalOpen] = useState(false) const [filterModalOpen, setFilterModalOpen] = useState(false)
const [advancedFilters, setAdvancedFilters] = useState<FilterSet>({})
// Fetch user's advanced filters const [matchesDefaultFilters, setMatchesDefaultFilters] = useState(false)
const filtersCookie = getCookie('filters')
const advancedFilters: FilterSet = filtersCookie
? JSON.parse(filtersCookie as string)
: DEFAULT_FILTERSET
// Set up classes object for showing shadow on scroll // Set up classes object for showing shadow on scroll
const classes = classNames({ const classes = classNames({
FilterBar: true, FilterBar: true,
shadow: props.scrolled, 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() { function openElementSelect() {
setElementOpen(!elementOpen) setElementOpen(!elementOpen)
} }
@ -65,16 +68,21 @@ const FilterBar = (props: Props) => {
function elementSelectChanged(value: string) { function elementSelectChanged(value: string) {
const elementValue = parseInt(value) const elementValue = parseInt(value)
props.onFilter({ element: elementValue }) props.onFilter({ element: elementValue, ...advancedFilters })
} }
function recencySelectChanged(value: string) { function recencySelectChanged(value: string) {
const recencyValue = parseInt(value) const recencyValue = parseInt(value)
props.onFilter({ recency: recencyValue }) props.onFilter({ recency: recencyValue, ...advancedFilters })
} }
function raidSelectChanged(slug?: string) { 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') { function onSelectChange(name: 'element' | 'recency') {
@ -159,7 +167,7 @@ const FilterBar = (props: Props) => {
</Select> </Select>
<Button <Button
className="Filter" className={filterButtonClasses}
blended={true} blended={true}
leftAccessoryIcon={<FilterIcon />} leftAccessoryIcon={<FilterIcon />}
onClick={() => setFilterModalOpen(true)} onClick={() => setFilterModalOpen(true)}
@ -171,6 +179,7 @@ const FilterBar = (props: Props) => {
filterSet={advancedFilters} filterSet={advancedFilters}
open={filterModalOpen} open={filterModalOpen}
onOpenChange={setFilterModalOpen} onOpenChange={setFilterModalOpen}
sendAdvancedFilters={handleAdvancedFiltersChanged}
/> />
</> </>
) )