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