mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-23 19:49:50 +02:00
feat: reintroduced links
This commit is contained in:
1 parent
d8bbd02715
commit
3448427de0
2 files changed
+85
-29
No files matched your search
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
Reference in new issue
Block a user