Files
blitzkit/packages/website/src/components/CrewSkillManager.tsx
T

59 lines
1.7 KiB
TypeScript
Raw Normal View History

2024-09-08 10:11:24 -05:00
import {
asset,
2024-10-06 00:02:50 -05:00
fetchSkillDefinitions,
2024-09-08 10:11:24 -05:00
permanentSkills,
TIER_ROMAN_NUMERALS,
2024-09-21 20:26:58 -05:00
type Tier,
2024-09-08 10:11:24 -05:00
} from '@blitzkit/core';
import { Flex } from '@radix-ui/themes';
import { GenericTankComponentButton } from './ModuleButtons/GenericTankComponentButton';
interface CrewSkillManagerProps {
skillLevels: Record<string, number>;
onChange?: (skillLevels: Record<string, number>) => void;
}
2024-10-06 00:02:50 -05:00
const skillDefinitions = await fetchSkillDefinitions();
2024-09-21 20:26:58 -05:00
export function CrewSkillManager({
skillLevels,
onChange,
}: CrewSkillManagerProps) {
return (
<Flex direction="column" gap="2">
2024-10-06 00:02:50 -05:00
{Object.entries(skillDefinitions.classes).map(([tankClass, skills]) => (
<Flex gap="2" key={tankClass}>
{skills.skills.map((skill) => {
const level = skillLevels[skill];
2024-10-06 00:02:50 -05:00
return (
<GenericTankComponentButton
key={skill}
special={!permanentSkills.includes(skill)}
selected={level > 0}
discriminator={
level === 0 ? undefined : TIER_ROMAN_NUMERALS[level as Tier]
}
icon={asset(`icons/skills/${skill}.webp`)}
onClick={(event) => {
if (!onChange) return;
const draft = { ...skillLevels };
if (event.shiftKey) {
draft[skill] = draft[skill] === 0 ? 7 : 0;
} else {
draft[skill] = level - 1;
if (draft[skill] < 0) draft[skill] = 7;
}
2024-10-06 00:02:50 -05:00
onChange(draft);
}}
/>
);
})}
</Flex>
))}
</Flex>
);
}