import { useTranslation } from "react-i18next"; import { Image, WeaponImage } from "~/components/Image"; import { Label } from "~/components/Label"; import { mainWeaponParams } from "~/features/build-analyzer/core/utils"; import type { MainWeaponId, SpecialWeaponId, SubWeaponId, } from "~/modules/in-game-lists/types"; import { mainWeaponIds, specialWeaponIds, subWeaponIds, weaponCategories, } from "~/modules/in-game-lists/weapon-ids"; import { specialWeaponImageUrl, subWeaponImageUrl } from "~/utils/urls"; import { MAX_WEAPONS } from "../comp-analyzer-constants"; import type { CategorizationType } from "../comp-analyzer-types"; import styles from "./WeaponGrid.module.css"; interface WeaponGridProps { selectedWeaponIds: MainWeaponId[]; onWeaponClick: (weaponId: MainWeaponId) => void; categorization: CategorizationType; onCategorizationChange: (categorization: CategorizationType) => void; isCollapsed: boolean; onToggleCollapse: () => void; } export function WeaponGrid({ selectedWeaponIds, onWeaponClick, categorization, onCategorizationChange, isCollapsed, onToggleCollapse, }: WeaponGridProps) { const { t } = useTranslation(["weapons", "analyzer"]); const isMaxSelected = selectedWeaponIds.length >= MAX_WEAPONS; const groupedWeapons = groupWeaponsByType(categorization); return (
{!isCollapsed ? ( <>
{groupedWeapons.map((group) => (
{group.iconPath ? ( ) : null} {group.name.startsWith("SUB_") || group.name.startsWith("SPECIAL_") ? t(`weapons:${group.name}` as "SUB_0") : group.name}
{group.weaponIds.map((weaponId) => { const isSelected = selectedWeaponIds.includes(weaponId); const isDisabled = !isSelected && isMaxSelected; return ( ); })}
))}
) : null}
); } interface WeaponGroup { key: string; name: string; iconPath: string | null; weaponIds: MainWeaponId[]; } function groupWeaponsByType(categorization: CategorizationType): WeaponGroup[] { if (categorization === "category") { return weaponCategories.map((category) => ({ key: category.name, name: category.name.toLowerCase(), iconPath: `/static-assets/img/weapon-categories/${category.name}`, weaponIds: [...category.weaponIds] as MainWeaponId[], })); } if (categorization === "sub") { return subWeaponIds .map((subId) => { const weaponsWithSub = mainWeaponIds.filter((weaponId) => { const params = mainWeaponParams(weaponId); return params.subWeaponId === subId; }); return { key: `sub-${subId}`, name: `SUB_${subId}`, iconPath: subWeaponImageUrl(subId as SubWeaponId), weaponIds: weaponsWithSub, }; }) .filter((group) => group.weaponIds.length > 0); } return specialWeaponIds .map((specialId) => { const weaponsWithSpecial = mainWeaponIds.filter((weaponId) => { const params = mainWeaponParams(weaponId); return params.specialWeaponId === specialId; }); return { key: `special-${specialId}`, name: `SPECIAL_${specialId}`, iconPath: specialWeaponImageUrl(specialId as SpecialWeaponId), weaponIds: weaponsWithSpecial, }; }) .filter((group) => group.weaponIds.length > 0); }