mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 12:09:51 +02:00
feat: versus tank lookup
This commit is contained in:
1 parent
b1a59aa871
commit
adb0bb2e69
1 file changed
+98
-7
@@ -1,6 +1,10 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { ArrowLeftIcon, CaretRightIcon } from '@radix-ui/react-icons';
|
import {
|
||||||
|
ArrowLeftIcon,
|
||||||
|
CaretRightIcon,
|
||||||
|
MagnifyingGlassIcon,
|
||||||
|
} from '@radix-ui/react-icons';
|
||||||
import {
|
import {
|
||||||
Button,
|
Button,
|
||||||
Card,
|
Card,
|
||||||
@@ -8,16 +12,20 @@ import {
|
|||||||
Dialog,
|
Dialog,
|
||||||
Flex,
|
Flex,
|
||||||
Heading,
|
Heading,
|
||||||
|
Separator,
|
||||||
Slider,
|
Slider,
|
||||||
Tabs,
|
Tabs,
|
||||||
Text,
|
Text,
|
||||||
|
TextField,
|
||||||
Theme,
|
Theme,
|
||||||
Tooltip,
|
Tooltip,
|
||||||
} from '@radix-ui/themes';
|
} from '@radix-ui/themes';
|
||||||
import { OrbitControls } from '@react-three/drei';
|
import { OrbitControls } from '@react-three/drei';
|
||||||
import { Canvas } from '@react-three/fiber';
|
import { Canvas } from '@react-three/fiber';
|
||||||
|
import { go } from 'fuzzysort';
|
||||||
|
import { debounce } from 'lodash';
|
||||||
import Link from 'next/link';
|
import Link from 'next/link';
|
||||||
import { use, useEffect, useState } from 'react';
|
import { use, useEffect, useRef, useState } from 'react';
|
||||||
import { Flag } from '../../../../components/Flag';
|
import { Flag } from '../../../../components/Flag';
|
||||||
import PageWrapper from '../../../../components/PageWrapper';
|
import PageWrapper from '../../../../components/PageWrapper';
|
||||||
import { asset } from '../../../../core/blitzkrieg/asset';
|
import { asset } from '../../../../core/blitzkrieg/asset';
|
||||||
@@ -26,6 +34,7 @@ import { shellDefinitions } from '../../../../core/blitzkrieg/definitions/shells
|
|||||||
import {
|
import {
|
||||||
TIER_ROMAN_NUMERALS,
|
TIER_ROMAN_NUMERALS,
|
||||||
tankDefinitions,
|
tankDefinitions,
|
||||||
|
tankNamesDiacritics,
|
||||||
tanksDefinitionsArray,
|
tanksDefinitionsArray,
|
||||||
} from '../../../../core/blitzkrieg/definitions/tanks';
|
} from '../../../../core/blitzkrieg/definitions/tanks';
|
||||||
import { turretDefinitions } from '../../../../core/blitzkrieg/definitions/turrets';
|
import { turretDefinitions } from '../../../../core/blitzkrieg/definitions/turrets';
|
||||||
@@ -40,18 +49,25 @@ export default function Page({ params }: { params: { id: string } }) {
|
|||||||
const awaitedTurretDefinitions = use(turretDefinitions);
|
const awaitedTurretDefinitions = use(turretDefinitions);
|
||||||
const awaitedGunDefinitions = use(gunDefinitions);
|
const awaitedGunDefinitions = use(gunDefinitions);
|
||||||
const awaitedShellDefinitions = use(shellDefinitions);
|
const awaitedShellDefinitions = use(shellDefinitions);
|
||||||
|
const awaitedTankNamesDiacritics = use(tankNamesDiacritics);
|
||||||
const tank = awaitedTankDefinitions[id];
|
const tank = awaitedTankDefinitions[id];
|
||||||
const [turret, setTurret] = useState(
|
const [turret, setTurret] = useState(
|
||||||
awaitedTurretDefinitions[tank.turrets[0]],
|
awaitedTurretDefinitions[tank.turrets[0]],
|
||||||
);
|
);
|
||||||
const [gun, setGun] = useState(awaitedGunDefinitions[turret.guns[0]]);
|
const [gun, setGun] = useState(awaitedGunDefinitions[turret.guns[0]]);
|
||||||
const [crew, setCrew] = useState(100);
|
const [crew, setCrew] = useState(100);
|
||||||
const [versusTank, setVersusTank] = useState(
|
const [versusTankId, setVersusTankId] = useState(
|
||||||
awaitedTanksDefinitionsArray[0].id,
|
awaitedTanksDefinitionsArray[0].id,
|
||||||
);
|
);
|
||||||
const [mode, setMode] = useState<Mode>('model');
|
const [mode, setMode] = useState<Mode>('model');
|
||||||
|
const versusTankSearchInput = useRef<HTMLInputElement>(null);
|
||||||
console.log(versusTank);
|
const [versusTankSearchResults, setVersusTankSearchResults] = useState<
|
||||||
|
number[]
|
||||||
|
>([]);
|
||||||
|
const [versusTankTurretId, setVersusTankTurretId] = useState(
|
||||||
|
awaitedTurretDefinitions[tank.turrets[0]].id,
|
||||||
|
);
|
||||||
|
const versusTank = awaitedTankDefinitions[versusTankId];
|
||||||
|
|
||||||
useEffect(() => setGun(awaitedGunDefinitions[turret.guns[0]]), [turret]);
|
useEffect(() => setGun(awaitedGunDefinitions[turret.guns[0]]), [turret]);
|
||||||
|
|
||||||
@@ -120,12 +136,87 @@ export default function Page({ params }: { params: { id: string } }) {
|
|||||||
<Dialog.Root>
|
<Dialog.Root>
|
||||||
<Dialog.Trigger>
|
<Dialog.Trigger>
|
||||||
<Button variant="ghost">
|
<Button variant="ghost">
|
||||||
{awaitedTankDefinitions[versusTank].name}
|
{awaitedTankDefinitions[versusTankId].name}
|
||||||
<CaretRightIcon />
|
<CaretRightIcon />
|
||||||
</Button>
|
</Button>
|
||||||
</Dialog.Trigger>
|
</Dialog.Trigger>
|
||||||
|
|
||||||
<Dialog.Content>Do something lol</Dialog.Content>
|
<Dialog.Content>
|
||||||
|
<Flex direction="column" gap="6">
|
||||||
|
<Flex direction="column" gap="2">
|
||||||
|
<Heading size="4">Search tank</Heading>
|
||||||
|
|
||||||
|
<TextField.Root>
|
||||||
|
<TextField.Slot>
|
||||||
|
<MagnifyingGlassIcon />
|
||||||
|
</TextField.Slot>
|
||||||
|
<TextField.Input
|
||||||
|
ref={versusTankSearchInput}
|
||||||
|
placeholder="Search tank..."
|
||||||
|
onChange={debounce(() => {
|
||||||
|
setVersusTankSearchResults(
|
||||||
|
go(
|
||||||
|
versusTankSearchInput.current!.value,
|
||||||
|
awaitedTankNamesDiacritics,
|
||||||
|
{ key: 'combined', limit: 8 },
|
||||||
|
).map((item) => item.obj.id),
|
||||||
|
);
|
||||||
|
}, 500)}
|
||||||
|
/>
|
||||||
|
</TextField.Root>
|
||||||
|
</Flex>
|
||||||
|
|
||||||
|
{(versusTankSearchResults.length > 0 ||
|
||||||
|
versusTankSearchInput.current?.value) && (
|
||||||
|
<Flex direction="column" gap="2">
|
||||||
|
{versusTankSearchResults.map((id) => (
|
||||||
|
<Button
|
||||||
|
key={id}
|
||||||
|
variant="ghost"
|
||||||
|
onClick={() => {
|
||||||
|
setVersusTankId(id);
|
||||||
|
setVersusTankSearchResults([]);
|
||||||
|
versusTankSearchInput.current!.value = '';
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{awaitedTankDefinitions[id].name}
|
||||||
|
</Button>
|
||||||
|
))}
|
||||||
|
|
||||||
|
{versusTankSearchResults.length === 0 &&
|
||||||
|
(versusTankSearchInput.current
|
||||||
|
? versusTankSearchInput.current.value.length > 0
|
||||||
|
: false) && (
|
||||||
|
<Button disabled variant="ghost">
|
||||||
|
No search results
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
</Flex>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<Separator style={{ width: '100%' }} />
|
||||||
|
|
||||||
|
<Flex direction="column" gap="2">
|
||||||
|
<Heading size="4">
|
||||||
|
{awaitedTankDefinitions[versusTankId].name}
|
||||||
|
</Heading>
|
||||||
|
|
||||||
|
<Flex>
|
||||||
|
{versusTank.turrets.map((id) => (
|
||||||
|
<Button
|
||||||
|
key={id}
|
||||||
|
variant="ghost"
|
||||||
|
onClick={() => setVersusTankTurretId(id)}
|
||||||
|
radius="small"
|
||||||
|
color="gray"
|
||||||
|
>
|
||||||
|
{awaitedTurretDefinitions[id].name}
|
||||||
|
</Button>
|
||||||
|
))}
|
||||||
|
</Flex>
|
||||||
|
</Flex>
|
||||||
|
</Flex>
|
||||||
|
</Dialog.Content>
|
||||||
</Dialog.Root>
|
</Dialog.Root>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user