From 85d699dbfc1eb5d893c98d7081ef39ad2cf140f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Sat, 6 Apr 2024 19:04:57 -0500 Subject: [PATCH] feat: provisions --- src/app/tools/compare/page.tsx | 115 +++++++++++------- .../Characteristics/components/Provisions.tsx | 41 ++----- src/components/ProvisionsManager.tsx | 49 ++++++++ 3 files changed, 132 insertions(+), 73 deletions(-) create mode 100644 src/components/ProvisionsManager.tsx diff --git a/src/app/tools/compare/page.tsx b/src/app/tools/compare/page.tsx index 4d095df7d..f39307c4b 100644 --- a/src/app/tools/compare/page.tsx +++ b/src/app/tools/compare/page.tsx @@ -23,7 +23,9 @@ import { usePathname, useRouter, useSearchParams } from 'next/navigation'; import { use, useCallback, useEffect, useMemo, useState } from 'react'; import { EquipmentManager } from '../../../components/EquipmentManager'; import PageWrapper from '../../../components/PageWrapper'; +import { ProvisionsManager } from '../../../components/ProvisionsManager'; import { asset } from '../../../core/blitzkrieg/asset'; +import { availableProvisions } from '../../../core/blitzkrieg/availableProvisions'; import { equipmentDefinitions } from '../../../core/blitzkrieg/equipmentDefinitions'; import { modelDefinitions } from '../../../core/blitzkrieg/modelDefinitions'; import { provisionDefinitions } from '../../../core/blitzkrieg/provisionDefinitions'; @@ -439,9 +441,14 @@ export default function Page() { {members.map( - ({ equipmentMatrix, tank, key, provisions }, index) => { + ({ equipmentMatrix, tank, key, provisions, gun }, index) => { const equipmentPreset = awaitedEquipmentDefinitions.presets[tank.equipment]; + const provisionsList = availableProvisions( + tank, + gun, + awaitedProvisionDefinitions, + ); return ( @@ -559,48 +566,70 @@ export default function Page() { - + + + + + + + provision.id, + )} + selected={provisions} + disabled={ + tank.provisions === provisionsList.length + } + onChange={(provisions) => { + mutateCompareTemporary((draft) => { + draft.members[index].provisions = + provisions; + }); + }} + /> + + ); diff --git a/src/app/tools/tankopedia/[id]/components/Characteristics/components/Provisions.tsx b/src/app/tools/tankopedia/[id]/components/Characteristics/components/Provisions.tsx index daf7eafde..677bdb5ee 100644 --- a/src/app/tools/tankopedia/[id]/components/Characteristics/components/Provisions.tsx +++ b/src/app/tools/tankopedia/[id]/components/Characteristics/components/Provisions.tsx @@ -1,6 +1,6 @@ import { Button, Flex, Heading } from '@radix-ui/themes'; import { use } from 'react'; -import { ProvisionButton } from '../../../../../../../components/ModuleButtons/ProvisionButton'; +import { ProvisionsManager } from '../../../../../../../components/ProvisionsManager'; import { availableProvisions } from '../../../../../../../core/blitzkrieg/availableProvisions'; import { provisionDefinitions } from '../../../../../../../core/blitzkrieg/provisionDefinitions'; import { mutateDuel, useDuel } from '../../../../../../../stores/duel'; @@ -33,35 +33,16 @@ export function Provisions() { - - {provisionsList.map((provision, index) => { - const selected = provisions.includes(provision.id); - - return ( - { - mutateDuel((draft) => { - if (selected) { - draft.protagonist!.provisions = - draft.protagonist!.provisions.filter( - (id) => id !== provision.id, - ); - } else { - draft.protagonist!.provisions.push(provision.id); - } - }); - }} - /> - ); - })} - + provision.id)} + selected={provisions} + disabled={tank.provisions === provisionsList.length} + onChange={(provisions) => { + mutateDuel((draft) => { + draft.protagonist!.provisions = provisions; + }); + }} + /> ); } diff --git a/src/components/ProvisionsManager.tsx b/src/components/ProvisionsManager.tsx new file mode 100644 index 000000000..b8aa7bf8d --- /dev/null +++ b/src/components/ProvisionsManager.tsx @@ -0,0 +1,49 @@ +import { Flex } from '@radix-ui/themes'; +import { ProvisionButton } from './ModuleButtons/ProvisionButton'; + +interface ProvisionsManagerProps { + provisions: number[]; + selected: number[]; + disabled?: boolean; + onChange?: (provisions: number[]) => void; +} + +export function ProvisionsManager({ + provisions, + selected, + onChange, + disabled, +}: ProvisionsManagerProps) { + return ( + + {provisions.map((provision, index) => { + const isSelected = selected.includes(provision); + + return ( + { + if (!onChange) return; + + const draft = [...selected]; + + if (isSelected) { + draft.splice(draft.indexOf(provision), 1); + } else { + draft.push(provision); + } + + onChange(draft); + }} + /> + ); + })} + + ); +}