Implement advanced filters on Teams page
This commit is contained in:
parent
43e615fdf3
commit
e13c07d57f
1 changed files with 36 additions and 18 deletions
|
|
@ -13,6 +13,7 @@ import fetchLatestVersion from '~utils/fetchLatestVersion'
|
||||||
import organizeRaids from '~utils/organizeRaids'
|
import organizeRaids from '~utils/organizeRaids'
|
||||||
import useDidMountEffect from '~utils/useDidMountEffect'
|
import useDidMountEffect from '~utils/useDidMountEffect'
|
||||||
import { appState } from '~utils/appState'
|
import { appState } from '~utils/appState'
|
||||||
|
import { defaultFilterset } from '~utils/defaultFilters'
|
||||||
import { elements, allElement } from '~data/elements'
|
import { elements, allElement } from '~data/elements'
|
||||||
import { emptyPaginationObject } from '~utils/emptyStates'
|
import { emptyPaginationObject } from '~utils/emptyStates'
|
||||||
|
|
||||||
|
|
@ -30,6 +31,7 @@ import type {
|
||||||
PaginationObject,
|
PaginationObject,
|
||||||
ResponseStatus,
|
ResponseStatus,
|
||||||
} from '~types'
|
} from '~types'
|
||||||
|
import { getCookie } from 'cookies-next'
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
context?: PageContextObj
|
context?: PageContextObj
|
||||||
|
|
@ -82,6 +84,8 @@ const TeamsRoute: React.FC<Props> = ({
|
||||||
parse: (query: string) => parseInt(query),
|
parse: (query: string) => parseInt(query),
|
||||||
serialize: (value) => `${value}`,
|
serialize: (value) => `${value}`,
|
||||||
})
|
})
|
||||||
|
const [advancedFilters, setAdvancedFilters] =
|
||||||
|
useState<FilterSet>(defaultFilterset)
|
||||||
|
|
||||||
// Define transformers for element
|
// Define transformers for element
|
||||||
function parseElement(query: string) {
|
function parseElement(query: string) {
|
||||||
|
|
@ -120,6 +124,16 @@ const TeamsRoute: React.FC<Props> = ({
|
||||||
return () => window.removeEventListener('scroll', handleScroll)
|
return () => window.removeEventListener('scroll', handleScroll)
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
|
// Fetch the user's advanced filters
|
||||||
|
useEffect(() => {
|
||||||
|
const filtersCookie = getCookie('filters')
|
||||||
|
const filters = filtersCookie
|
||||||
|
? JSON.parse(filtersCookie as string)
|
||||||
|
: defaultFilterset
|
||||||
|
|
||||||
|
setAdvancedFilters(filters)
|
||||||
|
}, [])
|
||||||
|
|
||||||
// Handle errors
|
// Handle errors
|
||||||
const handleError = useCallback((error: any) => {
|
const handleError = useCallback((error: any) => {
|
||||||
if (error.response != null) {
|
if (error.response != null) {
|
||||||
|
|
@ -138,6 +152,7 @@ const TeamsRoute: React.FC<Props> = ({
|
||||||
raid: raid ? raid.id : undefined,
|
raid: raid ? raid.id : undefined,
|
||||||
recency: recency !== -1 ? recency : undefined,
|
recency: recency !== -1 ? recency : undefined,
|
||||||
page: currentPage,
|
page: currentPage,
|
||||||
|
...advancedFilters,
|
||||||
}
|
}
|
||||||
|
|
||||||
Object.keys(filters).forEach(
|
Object.keys(filters).forEach(
|
||||||
|
|
@ -164,7 +179,7 @@ const TeamsRoute: React.FC<Props> = ({
|
||||||
})
|
})
|
||||||
.catch((error) => handleError(error))
|
.catch((error) => handleError(error))
|
||||||
},
|
},
|
||||||
[currentPage, parties, element, raid, recency]
|
[currentPage, parties, element, raid, recency, advancedFilters]
|
||||||
)
|
)
|
||||||
|
|
||||||
function replaceResults(count: number, list: Party[]) {
|
function replaceResults(count: number, list: Party[]) {
|
||||||
|
|
@ -198,7 +213,7 @@ const TeamsRoute: React.FC<Props> = ({
|
||||||
useDidMountEffect(() => {
|
useDidMountEffect(() => {
|
||||||
setCurrentPage(1)
|
setCurrentPage(1)
|
||||||
fetchTeams({ replace: true })
|
fetchTeams({ replace: true })
|
||||||
}, [element, raid, recency])
|
}, [element, raid, recency, advancedFilters])
|
||||||
|
|
||||||
// When the page changes, fetch all teams again.
|
// When the page changes, fetch all teams again.
|
||||||
useDidMountEffect(() => {
|
useDidMountEffect(() => {
|
||||||
|
|
@ -208,25 +223,24 @@ const TeamsRoute: React.FC<Props> = ({
|
||||||
}, [currentPage])
|
}, [currentPage])
|
||||||
|
|
||||||
// Receive filters from the filter bar
|
// Receive filters from the filter bar
|
||||||
function receiveFilters({
|
function receiveFilters(filters: FilterSet) {
|
||||||
element,
|
if (filters.element == 0) setElement(0, { shallow: true })
|
||||||
raidSlug,
|
else if (filters.element) setElement(filters.element, { shallow: true })
|
||||||
recency,
|
|
||||||
}: {
|
|
||||||
element?: number
|
|
||||||
raidSlug?: string
|
|
||||||
recency?: number
|
|
||||||
}) {
|
|
||||||
if (element == 0) setElement(0, { shallow: true })
|
|
||||||
else if (element) setElement(element, { shallow: true })
|
|
||||||
|
|
||||||
if (raids && raidSlug) {
|
if (raids && filters.raidSlug) {
|
||||||
const raid = raids.find((raid) => raid.slug === raidSlug)
|
const raid = raids.find((raid) => raid.slug === filters.raidSlug)
|
||||||
setRaid(raid)
|
setRaid(raid)
|
||||||
setRaidSlug(raidSlug, { shallow: true })
|
setRaidSlug(filters.raidSlug, { shallow: true })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (recency) setRecency(recency, { shallow: true })
|
if (filters.recency) setRecency(filters.recency, { shallow: true })
|
||||||
|
|
||||||
|
delete filters.element
|
||||||
|
delete filters.raidSlug
|
||||||
|
delete filters.recency
|
||||||
|
|
||||||
|
console.log('Setting advanced filters in receiveFilters')
|
||||||
|
setAdvancedFilters(filters)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Methods: Favorites
|
// Methods: Favorites
|
||||||
|
|
@ -367,6 +381,10 @@ export const getServerSideProps = async ({ req, res, locale, query }: { req: Nex
|
||||||
|
|
||||||
// Fetch latest version
|
// Fetch latest version
|
||||||
const version = await fetchLatestVersion()
|
const version = await fetchLatestVersion()
|
||||||
|
|
||||||
|
// Fetch user's advanced filters
|
||||||
|
const filtersCookie = getCookie('filters', { req: req, res: res })
|
||||||
|
const advancedFilters = filtersCookie ? JSON.parse(filtersCookie as string) : undefined
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Fetch and organize raids
|
// Fetch and organize raids
|
||||||
|
|
@ -377,7 +395,7 @@ export const getServerSideProps = async ({ req, res, locale, query }: { req: Nex
|
||||||
// Create filter object
|
// Create filter object
|
||||||
const filters: FilterObject = extractFilters(query, raids)
|
const filters: FilterObject = extractFilters(query, raids)
|
||||||
const params = {
|
const params = {
|
||||||
params: { ...filters },
|
params: { ...filters, ...advancedFilters },
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up empty variables
|
// Set up empty variables
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue