diff --git a/packages/core/src/blitzkit/metaSortTank.ts b/packages/core/src/blitzkit/metaSortTank.ts index f146915b1..db1137359 100644 --- a/packages/core/src/blitzkit/metaSortTank.ts +++ b/packages/core/src/blitzkit/metaSortTank.ts @@ -12,6 +12,7 @@ export function metaSortTank( gameDefinitions: GameDefinitions, ) { return tanks + .sort((a, b) => a.id - b.id) .sort((a, b) => b.tier - a.tier) .sort( (a, b) => treeTypeOrder.indexOf(b.type) - treeTypeOrder.indexOf(a.type), diff --git a/packages/website/src/components/Compare/Controls.tsx b/packages/website/src/components/Compare/Controls.tsx index 1bb45c6cb..8614c2c31 100644 --- a/packages/website/src/components/Compare/Controls.tsx +++ b/packages/website/src/components/Compare/Controls.tsx @@ -1,5 +1,6 @@ import { PlusIcon, TrashIcon } from "@radix-ui/react-icons"; import { Button, Dialog, Flex, SegmentedControl } from "@radix-ui/themes"; +import { useMemo } from "react"; import { api } from "../../core/blitzkit/api"; import { tankToCompareMember } from "../../core/blitzkit/tankToCompareMember"; import { useLocale } from "../../hooks/useLocale"; @@ -22,6 +23,11 @@ export function Controls({ onAddTankDialogOpenChange, }: ControlsProps) { const deltaMode = ComparePersistent.use((state) => state.deltaMode); + const members = CompareEphemeral.use((state) => state.members); + const memberIds = useMemo( + () => members.map((member) => member.tank.id), + [members], + ); const { strings } = useLocale(); return ( @@ -53,6 +59,7 @@ export function Controls({ > { CompareEphemeral.mutate((draft) => { draft.members.push( diff --git a/packages/website/src/components/Compare/TankControl.tsx b/packages/website/src/components/Compare/TankControl.tsx index 28ab0e129..bf2e6e227 100644 --- a/packages/website/src/components/Compare/TankControl.tsx +++ b/packages/website/src/components/Compare/TankControl.tsx @@ -1,6 +1,6 @@ import { ExternalLinkIcon, LoopIcon, TrashIcon } from "@radix-ui/react-icons"; import { Dialog, Flex, IconButton } from "@radix-ui/themes"; -import { useState } from "react"; +import { useMemo, useState } from "react"; import { api } from "../../core/blitzkit/api"; import { tankToCompareMember } from "../../core/blitzkit/tankToCompareMember"; import { useLocale } from "../../hooks/useLocale"; @@ -18,6 +18,14 @@ const provisionDefinitions = await api.provisionDefinitions(); export function TankControl({ index, slug }: TankControlProps) { const { locale, strings } = useLocale(); const [switchTankDialogOpen, setSwitchTankDialogOpen] = useState(false); + const members = CompareEphemeral.use((state) => state.members); + const otherMemberIds = useMemo( + () => + members + .filter((_, memberIndex) => memberIndex !== index) + .map((member) => member.tank.id), + [members, index], + ); return ( @@ -57,6 +65,7 @@ export function TankControl({ index, slug }: TankControlProps) { > { CompareEphemeral.mutate((draft) => { draft.members[index] = tankToCompareMember( diff --git a/packages/website/src/components/TankSearch/index.tsx b/packages/website/src/components/TankSearch/index.tsx index 35321dc2c..fcc976aed 100644 --- a/packages/website/src/components/TankSearch/index.tsx +++ b/packages/website/src/components/TankSearch/index.tsx @@ -38,6 +38,7 @@ export type TankSearchProps = MaybeSkeletonComponentProps & compact?: boolean; onSelect?: (tank: TankDefinition) => void; onSelectAll?: (tanks: TankDefinition[]) => void; + exclude?: number[]; }; const PREVIEW_COUNT = 20; @@ -52,14 +53,14 @@ const [gameDefinitions, modelDefinitions, tankDefinitions, tankNames] = ]); export const TankSearch = memo( - ({ compact, onSelect, onSelectAll, skeleton, ...props }) => { + ({ compact, onSelect, onSelectAll, exclude, skeleton, ...props }) => { const { strings, locale } = useLocale(); const wargaming = App.use((state) => state.logins.wargaming); const awaitedTanksDefinitionsArray = Object.values(tankDefinitions.tanks); const tankopediaSort = TankSort.use(); const tankFilters = TankFilters.use(); - const filtered = usePromise( + const allFiltered = usePromise( () => { if (tankFilters.search === null) { return filterTanks( @@ -81,9 +82,15 @@ export const TankSearch = memo( [tankFilters] as any, ); const sorted = useMemo(() => { + const filtered = allFiltered.filter( + (tank) => !exclude?.includes(tank.id), + ); + if (tankFilters.search === null) { let sorted: TankDefinition[]; + filtered.sort((a, b) => a.id - b.id); + switch (tankopediaSort.by) { case "meta.none": sorted = metaSortTank(filtered, gameDefinitions); @@ -417,7 +424,7 @@ export const TankSearch = memo( } else { return filtered; } - }, [tankFilters, tankopediaSort]); + }, [tankFilters, tankopediaSort, exclude]); const [loadedCards, setLoadedCards] = useState(DEFAULT_LOADED_CARDS); const tanks = sorted.slice(0, loadedCards);