diff --git a/packages/website/src/components/TankSearch/components/FilterControl.tsx b/packages/website/src/components/TankSearch/components/FilterControl.tsx index 7c730a2e4..7c2bcf2d3 100644 --- a/packages/website/src/components/TankSearch/components/FilterControl.tsx +++ b/packages/website/src/components/TankSearch/components/FilterControl.tsx @@ -7,6 +7,7 @@ import { TankType, TIER_ROMAN_NUMERALS, } from "@blitzkit/core"; +import locales from "@blitzkit/i18n/locales.json"; import { LockClosedIcon, LockOpen2Icon, @@ -24,6 +25,7 @@ import { } from "@radix-ui/themes"; import { times } from "lodash-es"; import type { ComponentProps, ReactNode } from "react"; +import { awaitableConsumableDefinitions } from "../../../core/awaitables/consumableDefinitions"; import { awaitableGameDefinitions } from "../../../core/awaitables/gameDefinitions"; import { useLocale } from "../../../hooks/useLocale"; import { App } from "../../../stores/app"; @@ -38,6 +40,18 @@ import { ScienceIcon } from "../../ScienceIcon"; import { ScienceOffIcon } from "../../ScienceOffIcon"; const gameDefinitions = await awaitableGameDefinitions; +const consumableDefinitions = await awaitableConsumableDefinitions; + +const consumablesArray = Object.values(consumableDefinitions.consumables) + .filter( + (consumable) => + !consumable.game_mode_exclusive && + consumable.name.locales[locales.default] + ) + .map((consumable) => consumable.id); +const abilitiesArray = Object.values(consumableDefinitions.consumables) + .filter((consumable) => consumable.game_mode_exclusive) + .map((consumable) => consumable.id); const shellTypeIcons: Record = { [ShellType.AP]: "ap", @@ -66,6 +80,7 @@ const GUN_TYPES = Object.keys( ) as (keyof typeof GUN_TYPE_ICONS)[]; const MAX_TIERS = 4; +const MAX_CONSUMABLES = 4; const TIERS = times(10, (i) => 10 - i); @@ -76,10 +91,13 @@ export function FilterControl() { - - + + + + + ); } @@ -706,3 +724,94 @@ function TestFilter() { ); } + +function ConsumablesFilter() { + const rawConsumables = TankFilters.use((state) => state.consumables); + const consumables = + rawConsumables.length === 0 ? consumablesArray : rawConsumables; + const { unwrap } = useLocale(); + + return ( + + + + + + + {consumablesArray.map((consumable) => { + const selected = rawConsumables.includes(consumable); + const consumableDefinition = + consumableDefinitions.consumables[consumable]; + + return ( + { + event.preventDefault(); + + TankFilters.mutate((draft) => { + if (selected) { + draft.consumables = draft.consumables.filter( + (n) => n !== consumable + ); + } else { + draft.consumables = [...draft.consumables, consumable]; + } + }); + }} + checked={selected} + key={consumable} + > + + + {unwrap(consumableDefinition.name)} + + ); + })} + + + + { + event.preventDefault(); + + TankFilters.mutate((draft) => { + draft.consumables = []; + }); + }} + > + + Clear + + + + ); +}