2026-10-22 16:12:03 +13:00
|
|
|
import { alias } from "@blitzkit/core";
|
|
|
|
|
import { uniqBy } from "lodash-es";
|
2026-10-27 11:51:14 -05:00
|
|
|
import { api } from "../../api/dynamic";
|
|
|
|
|
import { SKIN_NUMBER } from "../../constants/skinNumber";
|
|
|
|
|
import { DuelModule, useDuel } from "../../hooks/useDuel";
|
|
|
|
|
import { useUnwrapper } from "../../hooks/useUnwrapper";
|
|
|
|
|
import { Tankopedia } from "../../stores/tankopedia";
|
|
|
|
|
import { TankopediaDisplay } from "../../stores/tankopediaPersistent/constants";
|
2026-10-27 16:49:52 -05:00
|
|
|
import { IconButton } from "../IconButton";
|
2026-10-27 11:51:14 -05:00
|
|
|
import { Tooltip } from "../Tooltip";
|
|
|
|
|
import styles from "./index.module.css";
|
2026-10-22 16:12:03 +13:00
|
|
|
|
2026-10-27 11:51:14 -05:00
|
|
|
const camouflageDefinitions = await api.camouflages();
|
|
|
|
|
|
|
|
|
|
export function TankopediaSkinSwitcher() {
|
|
|
|
|
const unwrap = useUnwrapper();
|
|
|
|
|
|
|
|
|
|
const tank = useDuel("protagonist", DuelModule.Tank);
|
2026-10-22 16:12:03 +13:00
|
|
|
|
|
|
|
|
const skin = Tankopedia.use((state) => state.requestedSkin);
|
|
|
|
|
const requestedDisplay = Tankopedia.use((state) => state.requestedDisplay);
|
2026-10-29 11:36:29 -05:00
|
|
|
const revealed = Tankopedia.use((state) => state.revealed);
|
2026-10-27 11:51:14 -05:00
|
|
|
|
2026-10-22 16:12:03 +13:00
|
|
|
const skins = uniqBy(
|
|
|
|
|
Object.values(camouflageDefinitions.camouflages).filter(
|
|
|
|
|
(camouflage) => camouflage.tank_id === tank.id,
|
|
|
|
|
),
|
|
|
|
|
(camouflage) => unwrap(camouflage.name!),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if (skins.length === 0) return null;
|
|
|
|
|
|
|
|
|
|
return (
|
2026-10-27 11:51:14 -05:00
|
|
|
<div
|
|
|
|
|
className={styles["skin-switcher"]}
|
2026-10-29 11:36:29 -05:00
|
|
|
data-visible={revealed && requestedDisplay === TankopediaDisplay.Model}
|
2026-10-22 16:12:03 +13:00
|
|
|
>
|
2026-10-27 16:49:52 -05:00
|
|
|
{skins.map((camouflage) => {
|
2026-10-22 16:12:03 +13:00
|
|
|
const name = unwrap(camouflage.name!).replace(
|
|
|
|
|
"%(camo_num)",
|
|
|
|
|
SKIN_NUMBER,
|
|
|
|
|
);
|
2026-10-27 16:49:52 -05:00
|
|
|
|
|
|
|
|
const selected = skin === camouflage.id;
|
2026-10-22 16:12:03 +13:00
|
|
|
|
|
|
|
|
return (
|
2026-10-27 11:51:14 -05:00
|
|
|
<Tooltip key={camouflage.id} tooltip={name} side="left">
|
2026-10-27 16:49:52 -05:00
|
|
|
<IconButton
|
|
|
|
|
parentListChild="vertical"
|
|
|
|
|
color={selected ? undefined : "gray"}
|
|
|
|
|
variant={selected ? "solid" : "soft"}
|
|
|
|
|
highContrast={selected}
|
|
|
|
|
size="major"
|
2026-10-22 16:12:03 +13:00
|
|
|
onClick={() => {
|
|
|
|
|
Tankopedia.mutate((draft) => {
|
|
|
|
|
draft.requestedSkin =
|
|
|
|
|
draft.requestedSkin === camouflage.id
|
|
|
|
|
? undefined
|
|
|
|
|
: camouflage.id;
|
|
|
|
|
});
|
|
|
|
|
}}
|
2026-10-27 16:49:52 -05:00
|
|
|
>
|
|
|
|
|
<img
|
|
|
|
|
className={styles["camouflage-icon"]}
|
|
|
|
|
alt={name}
|
|
|
|
|
src={alias("api", `/icons/camouflages/${camouflage.id}.webp`)}
|
|
|
|
|
/>
|
|
|
|
|
</IconButton>
|
2026-10-22 16:12:03 +13:00
|
|
|
</Tooltip>
|
|
|
|
|
);
|
|
|
|
|
})}
|
2026-10-27 11:51:14 -05:00
|
|
|
</div>
|
2026-10-22 16:12:03 +13:00
|
|
|
);
|
|
|
|
|
}
|