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:
parent
61e17f655c
commit
43e615fdf3
1 changed files with 31 additions and 22 deletions
|
|
@ -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}
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue