import { asset, availableProvisions, permanentSkills } from "@blitzkit/core"; import { checkConsumableProvisionInclusivity } from "@blitzkit/core/src/blitzkit/checkConsumableProvisionInclusivity"; import { ComponentPlaceholderIcon } from "@radix-ui/react-icons"; import { Button, Flex, IconButton, Popover, Table } from "@radix-ui/themes"; import { times } from "lodash-es"; import { awaitableConsumableDefinitions } from "../../core/awaitables/consumableDefinitions"; import { awaitableEquipmentDefinitions } from "../../core/awaitables/equipmentDefinitions"; import { awaitableProvisionDefinitions } from "../../core/awaitables/provisionDefinitions"; import { awaitableSkillDefinitions } from "../../core/awaitables/skillDefinitions"; import type { TankCharacteristics } from "../../core/blitzkit/tankCharacteristics"; import { Var } from "../../core/radix/var"; import { useLocale } from "../../hooks/useLocale"; import { CompareEphemeral } from "../../stores/compareEphemeral"; import type { EquipmentMatrix } from "../../stores/duel"; import { BlitzkitButtonGrayIcon } from "../BlitzkitButtonGrayIcon"; import { ConsumablesManager } from "../ConsumablesManager"; import { CrewSkillManager } from "../CrewSkillManager"; import { EquipmentManager } from "../EquipmentManager"; import { ModuleManager } from "../ModuleManager"; import { ProvisionsManager } from "../ProvisionsManager"; import { StickyColumnHeaderCell } from "../StickyColumnHeaderCell"; import { StickyTableRoot } from "../StickyTableRoot"; import { Body } from "./Body"; import { InsertionMarker } from "./IntersectionMarker"; import { TankCard } from "./TankCard"; interface CompareTableProps { stats: TankCharacteristics[]; } const [ skillDefinitions, equipmentDefinitions, consumableDefinitions, provisionDefinitions, ] = await Promise.all([ awaitableSkillDefinitions, awaitableEquipmentDefinitions, awaitableConsumableDefinitions, awaitableProvisionDefinitions, ]); export function CompareTable({ stats }: CompareTableProps) { const crewSkills = CompareEphemeral.use((state) => state.crewSkills); const members = CompareEphemeral.use((state) => state.members); const { unwrap, strings } = useLocale(); return ( {members.map(({ tank, key }, index) => { return ; })} { CompareEphemeral.mutate((draft) => { draft.crewSkills = skills; }); }} /> {members.map( ( { equipmentMatrix, tank, key, provisions, gun, shell, turret, engine, track, consumables, camouflage, }, index ) => { const equipmentPreset = equipmentDefinitions.presets[tank.equipment_preset]; const provisionsList = availableProvisions( tank, gun, provisionDefinitions ); const consumablesList = Object.values( consumableDefinitions.consumables ).filter((consumable) => checkConsumableProvisionInclusivity(consumable, tank, gun) ); return ( { CompareEphemeral.mutate((draft) => { draft.members[index] = { ...draft.members[index], ...modules, }; }); }} /> provision.id )} selected={provisions} disabled={tank.max_provisions === provisions.length} onChange={(provisions) => { CompareEphemeral.mutate((draft) => { draft.members[index].provisions = provisions; }); }} /> { CompareEphemeral.mutate((draft) => { draft.members[index].equipmentMatrix = matrix; draft.sorting = undefined; }); }} /> { CompareEphemeral.mutate((draft) => { draft.members[index].consumables = consumables; }); }} disabled={ tank.max_consumables === consumables.length } /> {!tank.fixed_camouflage && ( { CompareEphemeral.mutate((draft) => { draft.members[index].camouflage = !camouflage; }); }} variant={camouflage ? "solid" : "outline"} > )} ); } )} ); }