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 mutateCompareEphemeral = CompareEphemeral.useMutation(); const { unwrap, strings } = useLocale(); return ( {members.map(({ tank, key }, index) => { return ; })} { mutateCompareEphemeral((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 ( { mutateCompareEphemeral((draft) => { draft.members[index] = { ...draft.members[index], ...modules, }; }); }} /> provision.id, )} selected={provisions} disabled={tank.max_provisions === provisions.length} onChange={(provisions) => { mutateCompareEphemeral((draft) => { draft.members[index].provisions = provisions; }); }} /> { mutateCompareEphemeral((draft) => { draft.members[index].equipmentMatrix = matrix; draft.sorting = undefined; }); }} /> { mutateCompareEphemeral((draft) => { draft.members[index].consumables = consumables; }); }} disabled={ tank.max_consumables === consumables.length } /> {!tank.fixed_camouflage && ( { mutateCompareEphemeral((draft) => { draft.members[index].camouflage = !camouflage; }); }} variant={camouflage ? 'solid' : 'outline'} > )} ); }, )} ); }