Files
blitzkit/packages/website/src/components/TankopediaSkinSwitcher/index.tsx
T

76 lines
2.6 KiB
TypeScript
Raw Normal View History

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";
import { SidebarIconButton } from "../Tankopedia/HeroSection/components/Options/components/SidebarIconButton";
import { Tooltip } from "../Tooltip";
import styles from "./index.module.css";
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);
const skin = Tankopedia.use((state) => state.requestedSkin);
const requestedDisplay = Tankopedia.use((state) => state.requestedDisplay);
const disturbed = Tankopedia.use((state) => state.disturbed);
2026-10-27 11:51:14 -05: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"]}
data-visible={disturbed && requestedDisplay === TankopediaDisplay.Model}
>
{skins.map((camouflage, index) => {
const name = unwrap(camouflage.name!).replace(
"%(camo_num)",
SKIN_NUMBER,
);
const top = index === 0 ? "var(--radius-full)" : "0";
const bottom = index === skins.length - 1 ? "var(--radius-full)" : "0";
return (
2026-10-27 11:51:14 -05:00
<Tooltip key={camouflage.id} tooltip={name} side="left">
<SidebarIconButton
selected={skin === camouflage.id}
alt={name}
src={alias("api", `/icons/camouflages/${camouflage.id}.webp`)}
size={{ initial: "3", sm: "4" }}
radius="full"
style={{
borderRadius: `${top} ${top} ${bottom} ${bottom}`,
}}
imageStyle={{
width: "70%",
height: "70%",
borderRadius: "50%",
}}
onClick={() => {
Tankopedia.mutate((draft) => {
draft.requestedSkin =
draft.requestedSkin === camouflage.id
? undefined
: camouflage.id;
});
}}
/>
</Tooltip>
);
})}
2026-10-27 11:51:14 -05:00
</div>
);
}