feat: reintroduced links

This commit is contained in:
TrèsAbhi committed 2024-04-04 15:35:27 -05:00
1 parent d8bbd02715
commit 3448427de0
2 files changed
+85 -29

No files matched your search

+63 -29
View File
@@ -2,32 +2,70 @@
import { PlusIcon } from '@radix-ui/react-icons'; import { PlusIcon } from '@radix-ui/react-icons';
import { Button, Dialog, Flex, Table, Text } from '@radix-ui/themes'; import { Button, Dialog, Flex, Table, Text } from '@radix-ui/themes';
import { useSearchParams } from 'next/navigation'; import { usePathname, useRouter, useSearchParams } from 'next/navigation';
import { use, useState } from 'react'; import { use, useCallback, useEffect, useMemo, useState } from 'react';
import PageWrapper from '../../../components/PageWrapper'; import PageWrapper from '../../../components/PageWrapper';
import { tankCharacteristics } from '../../../core/blitzkrieg/tankCharacteristics'; import { tankCharacteristics } from '../../../core/blitzkrieg/tankCharacteristics';
import { tankDefinitions } from '../../../core/blitzkrieg/tankDefinitions';
import { tankIcon } from '../../../core/blitzkrieg/tankIcon'; import { tankIcon } from '../../../core/blitzkrieg/tankIcon';
import mutateCompare, { useCompare } from '../../../stores/compare'; import { tankToDuelMember } from '../../../core/blitzkrieg/tankToDuelMember';
import { genericDefaultEquipmentMatrix } from '../../../stores/duel/constants'; import mutateCompare, {
CompareMember,
useCompare,
} from '../../../stores/compare';
import { TankSearch } from '../tankopedia/components/TankSearch'; import { TankSearch } from '../tankopedia/components/TankSearch';
export default function Page() { export default function Page() {
const pathname = usePathname();
const router = useRouter();
const awaitedTankDefinitions = use(tankDefinitions);
const searchParams = useSearchParams(); const searchParams = useSearchParams();
const tanks = useCompare((state) => state.tanks); const tanks = useCompare((state) => state.tanks);
const [addTankDialogOpen, setAddTankDialogOpen] = useState(false); const [addTankDialogOpen, setAddTankDialogOpen] = useState(false);
const stats = use( const statsPromise = useMemo(
Promise.all( () =>
tanks.map((item) => Promise.all(
tankCharacteristics({ tanks.map((item) =>
...item, tankCharacteristics({
stockEngine: item.tank.engines[0], ...item,
stockGun: item.tank.turrets[0].guns[0], stockEngine: item.tank.engines[0],
stockTrack: item.tank.tracks[0], stockGun: item.tank.turrets[0].guns[0],
stockTurret: item.tank.turrets[0], stockTrack: item.tank.tracks[0],
}), stockTurret: item.tank.turrets[0],
}),
),
), ),
), [tanks],
); );
const stats = use(statsPromise);
const createQueryString = useCallback(
(name: string, value: string) => {
const params = new URLSearchParams(searchParams.toString());
params.set(name, value);
return params.toString();
},
[searchParams],
);
useEffect(() => {
const tanksParam = searchParams.get('tanks');
if (tanksParam) {
mutateCompare((draft) => {
draft.tanks = tanksParam
.split(',')
.map(Number)
.map(
(id) =>
({
...tankToDuelMember(awaitedTankDefinitions[id]),
crewSkills: {},
}) satisfies CompareMember,
);
});
}
}, []);
function Row({ function Row({
value, value,
@@ -85,22 +123,18 @@ export default function Page() {
onSelect={(tank) => { onSelect={(tank) => {
mutateCompare((draft) => { mutateCompare((draft) => {
draft.tanks.push({ draft.tanks.push({
camouflage: true, ...tankToDuelMember(tank),
consumables: [],
equipmentMatrix: genericDefaultEquipmentMatrix,
cooldownBooster: 0,
crewMastery: 1,
provisions: [],
engine: tank.engines.at(-1)!,
gun: tank.turrets.at(-1)!.guns.at(-1)!,
shell: tank.turrets.at(-1)!.guns.at(-1)!.shells[0],
tank,
track: tank.tracks.at(-1)!,
yaw: 0,
pitch: 0,
turret: tank.turrets.at(-1)!,
crewSkills: {}, crewSkills: {},
}); });
router.push(
pathname +
'?' +
createQueryString(
'tanks',
draft.tanks.map(({ tank }) => tank.id).join(','),
),
);
}); });
setAddTankDialogOpen(false); setAddTankDialogOpen(false);
+22
View File
@@ -0,0 +1,22 @@
import { DuelMember } from '../../stores/duel';
import { genericDefaultEquipmentMatrix } from '../../stores/duel/constants';
import { TankDefinition } from './tankDefinitions';
export function tankToDuelMember(tank: TankDefinition) {
return {
camouflage: true,
consumables: [],
equipmentMatrix: genericDefaultEquipmentMatrix,
cooldownBooster: 0,
crewMastery: 1,
provisions: [],
engine: tank.engines.at(-1)!,
gun: tank.turrets.at(-1)!.guns.at(-1)!,
shell: tank.turrets.at(-1)!.guns.at(-1)!.shells[0],
tank,
track: tank.tracks.at(-1)!,
yaw: 0,
pitch: 0,
turret: tank.turrets.at(-1)!,
} satisfies DuelMember;
}