diff --git a/packages/website/src/components/TankSearch/components/FilterControl.tsx b/packages/website/src/components/TankSearch/components/FilterControl.tsx index 68ae1e60f..678ef60d0 100644 --- a/packages/website/src/components/TankSearch/components/FilterControl.tsx +++ b/packages/website/src/components/TankSearch/components/FilterControl.tsx @@ -18,8 +18,10 @@ import { type ButtonProps, type FlexProps, } from "@radix-ui/themes"; -import { isEqual, times } from "lodash-es"; +import { isEqual, times, chunk } from "lodash-es"; +import React from "react"; import { awaitableGameDefinitions } from "../../../core/awaitables/gameDefinitions"; +import { awaitableConsumableDefinitions } from "../../../core/awaitables/consumableDefinitions"; import { Var } from "../../../core/radix/var"; import { useLocale } from "../../../hooks/useLocale"; import { App } from "../../../stores/app"; @@ -35,6 +37,7 @@ import { ScienceIcon } from "../../ScienceIcon"; import { ScienceOffIcon } from "../../ScienceOffIcon"; const gameDefinitions = await awaitableGameDefinitions; +const consumableDefinitions = await awaitableConsumableDefinitions; const shellTypeIcons: Record = { [ShellType.AP]: "ap", @@ -43,6 +46,25 @@ const shellTypeIcons: Record = { [ShellType.HEAT]: "hc", }; +// Get consumables +const regularConsumables = Object.values( + consumableDefinitions.consumables +).filter( + (consumable) => + !consumable.game_mode_exclusive && consumable.name.locales.en !== "" +); + +// Split consumables into chunks of 5 for columns +const consumableColumns = chunk(regularConsumables, 5); + +// Get game mode exclusive abilities +const gameModeAbilities = Object.values( + consumableDefinitions.consumables +).filter((consumable) => consumable.game_mode_exclusive); + +// Split abilities into chunks of 5 for columns +const abilityColumns = chunk(gameModeAbilities, 5); + const size: ButtonProps["size"] = { initial: "1", xs: "2" }; function ShellFilter({ index, premium }: { index: number; premium?: boolean }) { @@ -337,6 +359,151 @@ export function FilterControl() { + {/* Consumables Filter - RIGHT AFTER NATIONS */} + + + {consumableColumns[0]?.map((consumable) => { + const selected = tankFilters.consumables?.includes(consumable.id); + + return ( + { + TankFilters.mutate((draft) => { + if (tankFilters.consumables.includes(consumable.id)) { + draft.consumables = draft.consumables.filter( + (c) => c !== consumable.id + ); + } else { + draft.consumables = [ + ...draft.consumables, + consumable.id, + ]; + } + }); + }} + > + + + ); + })} + + + {consumableColumns[1] && ( + <> + + + + {consumableColumns[1].map((consumable) => { + const selected = tankFilters.consumables?.includes( + consumable.id + ); + + return ( + { + TankFilters.mutate((draft) => { + if (tankFilters.consumables.includes(consumable.id)) { + draft.consumables = draft.consumables.filter( + (c) => c !== consumable.id + ); + } else { + draft.consumables = [ + ...draft.consumables, + consumable.id, + ]; + } + }); + }} + > + + + ); + })} + + + )} + + {consumableColumns[2] && ( + <> + + + + {consumableColumns[2].map((consumable) => { + const selected = tankFilters.consumables?.includes( + consumable.id + ); + + return ( + { + TankFilters.mutate((draft) => { + if (tankFilters.consumables.includes(consumable.id)) { + draft.consumables = draft.consumables.filter( + (c) => c !== consumable.id + ); + } else { + draft.consumables = [ + ...draft.consumables, + consumable.id, + ]; + } + }); + }} + > + + + ); + })} + + + )} + + index); +const consumableDefinitions = await awaitableConsumableDefinitions; export async function filterTank( filters: TankFilters, @@ -40,6 +43,18 @@ export async function filterTank( gun.shells[index].type === filters.shells[index] ) ) - ) + ) && + (filters.consumables.length === 0 || + filters.consumables.every((consumableId) => + tank.turrets.some((turret) => + turret.guns.some((gun) => + checkConsumableProvisionInclusivity( + consumableDefinitions.consumables[consumableId], + tank, + gun + ) + ) + ) + )) ); } diff --git a/packages/website/src/stores/tankFilters.ts b/packages/website/src/stores/tankFilters.ts index 68999b562..245455edf 100644 --- a/packages/website/src/stores/tankFilters.ts +++ b/packages/website/src/stores/tankFilters.ts @@ -21,6 +21,7 @@ export interface TankFilters { searching: boolean; gunType: CaseType[]; shells: [ShellType | null, ShellType | null, ShellType | null]; + consumables: number[]; showTesting: boolean; showNonTesting: boolean; @@ -37,6 +38,7 @@ export const TankFilters = new Varuna({ searching: false, gunType: [], shells: [null, null, null], + consumables: [], // Added this line showTesting: true, showNonTesting: true,