From 6e0429332d4e0cf21195e69b517d79f8a40d23ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Thu, 18 Sep 2025 10:41:42 -0500 Subject: [PATCH] feat: mixer tank selector --- packages/i18n/strings/en.json | 2 + packages/varuna/src/index.ts | 3 + .../src/components/Compare/TankControl.tsx | 6 +- .../MixerScene/components/Model.tsx | 24 --- .../TankSearch/components/TankCardWrapper.tsx | 7 +- .../src/components/TankSearch/index.tsx | 2 +- .../HeroSection/components/Options/index.tsx | 4 +- .../src/pages/[...locale]/mixer/_index.tsx | 150 +++++++++++++++++- .../src/pages/[...locale]/mixer/index.astro | 8 +- 9 files changed, 161 insertions(+), 45 deletions(-) diff --git a/packages/i18n/strings/en.json b/packages/i18n/strings/en.json index fb3901668..c5ca3d70b 100644 --- a/packages/i18n/strings/en.json +++ b/packages/i18n/strings/en.json @@ -763,6 +763,8 @@ }, "tank_search": { + "select_dialog_title": "Search for tanks", + "swap_dialog_title": "Swap tank", "clear_filters": "Clear filters", "search_bar_hint": "Search tanks...", "recent": "Recently viewed", diff --git a/packages/varuna/src/index.ts b/packages/varuna/src/index.ts index a7108c2fa..adb812cba 100644 --- a/packages/varuna/src/index.ts +++ b/packages/varuna/src/index.ts @@ -39,6 +39,8 @@ export class Varuna { } useInitialization(...args: Arguments[]) { + if (this.initialized) return; + const initializedThisMount = useRef(false); if (initializedThisMount.current) return; @@ -53,6 +55,7 @@ export class Varuna { private dispatch() { const state = this.state; + console.log("dispatched"); this.listeners.forEach((callback) => callback(state)); } diff --git a/packages/website/src/components/Compare/TankControl.tsx b/packages/website/src/components/Compare/TankControl.tsx index 41c54f2b0..a9ebe9a4a 100644 --- a/packages/website/src/components/Compare/TankControl.tsx +++ b/packages/website/src/components/Compare/TankControl.tsx @@ -16,7 +16,7 @@ interface TankControlProps { const provisionDefinitions = await awaitableProvisionDefinitions; export function TankControl({ index, slug }: TankControlProps) { - const { locale } = useLocale(); + const { locale, strings } = useLocale(); const [switchTankDialogOpen, setSwitchTankDialogOpen] = useState(false); return ( @@ -44,7 +44,9 @@ export function TankControl({ index, slug }: TankControlProps) { - Switch tanks + + {strings.website.common.tank_search.swap_dialog_title} + - test hull - - - - test turret - - & { compact?: boolean; onSelect?: (tank: TankDefinition) => void; diff --git a/packages/website/src/components/Tankopedia/HeroSection/components/Options/index.tsx b/packages/website/src/components/Tankopedia/HeroSection/components/Options/index.tsx index 6645f2d83..0171aadca 100644 --- a/packages/website/src/components/Tankopedia/HeroSection/components/Options/index.tsx +++ b/packages/website/src/components/Tankopedia/HeroSection/components/Options/index.tsx @@ -331,7 +331,9 @@ export function Options({ thicknessRange, canvas, skeleton }: OptionsProps) { - Select tank + + {strings.website.common.tank_search.select_dialog_title} + { return tank.tier >= 10 && !turretModel.yaw; }); -export function Page({ locale }: LocaleAcceptorProps) { +export function Page({ + locale, + skeleton, +}: LocaleAcceptorProps & MaybeSkeletonComponentProps) { const hull = useRef(tanks[Math.floor(Math.random() * tanks.length)]); const turretTank = useRef(tanks[Math.floor(Math.random() * tanks.length)]); const turret = useRef( @@ -50,18 +70,132 @@ export function Page({ locale }: LocaleAcceptorProps) { }); return ( - - - + + + + + ); } -function Content() { +function ModuleButton({ + skeleton, + tank, + onSelect, + ...props +}: Omit & + MaybeSkeletonComponentProps & { + tank: number; + onSelect: TankSearchProps["onSelect"]; + }) { + const { strings } = useLocale(); + const [open, setOpen] = useState(false); + + return ( + + + + + + + + {strings.website.common.tank_search.select_dialog_title} + + + { + onSelect?.(tank); + setOpen(false); + }} + /> + + + ); +} + +function ModuleSeparator() { + return ( + + + + ); +} + +function Content({ skeleton }: MaybeSkeletonComponentProps) { + const hullId = Mixer.use((state) => state.hull.id); + const turretId = Mixer.use((state) => state.turret.tank.id); + const gunId = Mixer.use((state) => state.gun.tank.id); + return ( - + {!skeleton && } + + + { + Mixer.mutate((draft) => { + draft.hull = tank; + }); + }} + /> + + { + Mixer.mutate((draft) => { + draft.turret = { + tank, + turret: tank.turrets.at(-1)!, + }; + }); + }} + /> + + { + Mixer.mutate((draft) => { + draft.gun = { + tank, + turret: tank.turrets.at(-1)!, + gun: tank.turrets.at(-1)!.guns.at(-1)!, + }; + }); + }} + /> + ); } diff --git a/packages/website/src/pages/[...locale]/mixer/index.astro b/packages/website/src/pages/[...locale]/mixer/index.astro index 340362892..7cfaca4a2 100644 --- a/packages/website/src/pages/[...locale]/mixer/index.astro +++ b/packages/website/src/pages/[...locale]/mixer/index.astro @@ -9,7 +9,7 @@ const { locale } = Astro.params; --- - - - - + + + +