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);
}