import { Box, Flex } from "@radix-ui/themes"; import { times } from "lodash-es"; import { useEffect, useMemo, useRef } from "react"; import { api } from "../../../core/blitzkit/api"; import { defaultEqualizer } from "../../../core/blitzkit/tankToDuelMember"; import { useFullScreen } from "../../../hooks/useFullScreen"; import { Duel } from "../../../stores/duel"; import { Tankopedia } from "../../../stores/tankopedia"; import type { MaybeSkeletonComponentProps } from "../../../types/maybeSkeletonComponentProps"; import type { ThicknessRange } from "../../Armor/components/StaticArmor"; import { Options } from "./components/Options"; import { TankSandbox } from "./components/TankSandbox"; import { Title } from "./components/TankSandbox/Title"; const tankDefinitions = await api.tankDefinitions(); export function HeroSection({ skeleton }: MaybeSkeletonComponentProps) { const equalize = Duel.use((state) => state.equalize); const disturbed = Tankopedia.use((state) => state.disturbed); const canvas = useRef(null!); const isFullScreen = useFullScreen(); const protagonist = Duel.use((state) => state.protagonist.tank); const thicknessRange = useMemo(() => { const entries = Object.values(tankDefinitions.tanks); const filtered = entries.filter( (thisTank) => thisTank.tier === protagonist.tier, ); const value = (filtered.reduce((accumulator, thisTank) => { return ( accumulator + thisTank.turrets.at(-1)!.guns.at(-1)!.shells[0].penetration!.near * ((equalize ? thisTank.equalizer : undefined) ?? defaultEqualizer) .penetration ); }, 0) / filtered.length) * (3 / 4); return { value } satisfies ThicknessRange; }, [protagonist, equalize]); useEffect(() => { if (disturbed) { document.body.classList.remove("no-navbar"); } }, [disturbed]); useEffect(() => { function handleKeyDown(event: KeyboardEvent) { times(3, (index) => { if ( event.key === `${index + 1}` && Duel.state.antagonist.gun.shells.length > index ) { Duel.mutate((draft) => { draft.antagonist.shell = Duel.state.antagonist.gun.shells[index]; }); Tankopedia.mutate((draft) => { draft.customShell = undefined; }); } }); } window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); }, []); return ( {/* */} {!skeleton && ( )} <Options skeleton={skeleton} canvas={canvas} thicknessRange={thicknessRange} /> </Box> </Box> </Flex> </Flex> ); }