Files
games-frontend-js/src/components/ActiveFilters.tsx
T
john-okeefe 45dd783964 refactor(nav): migrate header, dashboard chrome and discovery UI to v3
- Header/MobileBar: MenuRoot/Positioner/Content + Portal + Tooltip
  shims, ghost icon buttons, 2rem padded user/settings menus, hover
  token gray.700; MobileBar drawer API (open/onOpenChange/finalFocusEl)
- FilterBar/ActiveFilters: DrawerRoot/CloseTrigger, Divider -> Separator,
  Tag shim, FixedSelect with typed handlers and width-preserving
  chakraStyles, blue active-filter pills untouched
- Pagination: NumberInputRoot/Field + NativeSelect shims, first/last
  arrows back to double chevrons (LuChevronsLeft/Right), single chevrons
  kept for prev/next
- Search/SearchModal, Home, NoGames, LoadingModal, DashboardLoadingModal:
  Dialog/Toaster-era props, gap/align/textAlign renames; App.test target
  content updated accordingly
2026-09-06 10:30:21 -04:00

131 lines
5.4 KiB
TypeScript

import React from 'react'
import { useHookstate } from '@hookstate/core'
import { gameDashboardState } from '../stateManagement/gameState'
import { Flex, Stack, HStack, Link, Spacer } from '@chakra-ui/react'
import {Tag} from './ui/tag'
import getWithFilters from '../componentUtils/getWithFilters'
import {
loadingState,
openAndCloseSearchDialogue,
searchCompletedState,
showFiltersModuleState
} from '../stateManagement/loadingState'
import { adminMode } from '../stateManagement/userState'
import ResetFilterButton from './helperComponents/ResetFilterButton'
import { ChangeActiveFilterHeader } from "../componentUtils/changeActiveFilterHeader";
import { ratingState, steamRatingState } from "../stateManagement/ratingState";
const ActiveFilters = () => {
const setShowFiltersModuleState = useHookstate(showFiltersModuleState)
const showFiltersModule = setShowFiltersModuleState.get()
const gamesState = useHookstate(gameDashboardState)
const games = gamesState.get()
const { filters, searchParams } = games
const loadedState = useHookstate(loadingState)
const admin = useHookstate(adminMode).get()
const setSearchModalOpen = useHookstate(openAndCloseSearchDialogue)
const useRatingState = useHookstate(ratingState).get()
const useSteamRatingState = useHookstate(steamRatingState).get()
const searchComplete = useHookstate(searchCompletedState)
const removeFilters = async (filterHeader: string, filter: string) => {
const newFilter = filters[filterHeader as keyof typeof filters].replace(filter, '')
const finalFilter = { ...filters, [filterHeader]: newFilter }
await ChangeActiveFilterHeader(finalFilter, searchParams, setShowFiltersModuleState)
return await getWithFilters(
gamesState,
loadedState,
admin,
games.count.currentPage,
games.count.limit,
searchParams,
finalFilter,
useRatingState,
useSteamRatingState,
)
}
return showFiltersModule ? (
<Stack my={5} alignItems={{
base: 'start',
md: 'center'
}} direction={{
base: 'column',
md: 'row'
}} gap={4}>
{searchParams.length >= 1 && (
<>
<h2>Search: </h2>
<Tag
size={'md'}
borderRadius="full"
variant="solid"
colorPalette="blue"
onClose={async () => {
const newSearchParams = ""
ChangeActiveFilterHeader(filters, newSearchParams, setShowFiltersModuleState)
searchComplete.set(false)
return await getWithFilters(
gamesState,
loadedState,
admin,
games.count.currentPage,
games.count.limit,
newSearchParams,
filters,
useRatingState,
useSteamRatingState,
)
}}
><Link
onMouseDown={() => setSearchModalOpen.set(true)}>{searchParams}</Link>
</Tag>
</>
)}
<Stack alignItems={{
base: 'start',
md: 'center'
}} direction={{
base: 'column',
md: 'row'
}} >
<h2>Active Filters: </h2>
{Object.keys(filters).map((filter: string, num: number) => {
const filterValues: string = filters[filter as keyof typeof filters]
const filterValuesLength: number = filterValues.length
return filterValuesLength >= 1 && (
<>
<HStack key={num}>
<h3 style={{ textTransform: 'capitalize' }}>{filter}</h3>
<HStack gap={4}>
{filters[filter as keyof typeof filters].split(',').map((item: string, index) => (
<Tag
size={'md'}
key={index}
borderRadius="full"
variant="solid"
colorPalette="blue"
onClose={() => removeFilters(filter, item)}
>{
item.includes('lte')
? item.replace('lte', '<= ')
: item.includes('gte') ? item.replace('gte', '>= ')
: item}
</Tag>
))}
</HStack>
</HStack>
</>
)
})}
</Stack>
<Spacer />
<ResetFilterButton />
</Stack>
) : <></>
}
export default ActiveFilters