Closed y4shiro closed 2 years ago
一応取得できるが、計算量的には cardDeckSlice に cards のデータを直接追加したほうが少なく済む
const Skills = (): JSX.Element => {
const { data, error, isLoading } = useGetCardsQuery();
const deck = useSelector((state: RootState) => state.cardDeck);
const deckCardidLists = deck.filter((card) => card.cardId).flatMap((card) => card.cardId);
const deckCardSkillsLists = data
?.filter((card) => deckCardidLists.includes(card.card_id))
.map((card) => {
return {
card_id: card.card_id,
card_name: card.card_name,
event_skills: card.event_skills,
};
});
return (
<VStack w='100%' bgColor='blue.100'>
<Text>Skills</Text>
{deckCardSkillsLists?.map((card) =>
card.event_skills?.map((skill) => (
<Text key={skill.name}>
{card.card_name}:{skill.name}
</Text>
)),
)}
</VStack>
);
};
イベントスキルは前項で表示できているので、トレーニングスキルを表示するコードを提示する。
const deckCardSkillsLists = data
?.filter((card) => deckCardidLists.includes(card.card_id))
.map((card) => {
return {
card_id: card.card_id,
card_name: card.card_name,
event_skills: card.event_skills,
training_skills: card.training_skills, // 追加
};
});
return (
// ...
<VStack>
<Text fontSize='2xl'>トレーニング取得スキル</Text>
{deckCardSkillsLists?.map((card) =>
card.training_skills?.map((skill) => (
<Text key={skill.name}>
{card.card_name}:{skill.name}
</Text>
)),
)}
</VStack>
</VStack>
);
基本的にゲームに寄せるが、ある程度簡略化する
src/features/Support/Skills/SkillItem/index.tsx
type Props = {
skillName: string;
skillPt: number | null;
cardName: string;
};
const SkillItem: React.FC<Props> = ({ skillName, skillPt, cardName }) => {
return (
<HStack w='480px' p='4' gap='4' borderRadius='8' bgColor='white'>
<Box boxSize='48px' bgColor='gray.200'>
icon
</Box>
<VStack w='100%' divider={<Divider />}>
<HStack w='100%'>
<Text>{skillName}</Text>
<Spacer />
{skillPt && <Text>{skillPt}Pt</Text>}
</HStack>
<Text w='100%'>{cardName}</Text>
</VStack>
</HStack>
);
};
こちらはスキルのデータにレアリティの項目追加が必要なので、新規 Issue を立てて対応する master.mdb の skill_data テーブルに rarity カラムが存在するので、そこから Insert 用のデータを生成する 更に Supabase の skills テーブルに rarity カラムを追加し、View の方も修正する
現在ははカード名を表示しているが、最終的にはサポカのアイコンを表示させたい 優先順位低いので今回は対処しない
こちらも Supabase にスキルとアイコンの対応がなされていないので新規 Issue を立てて対応する master.mdb の skill_data に icon_id カラムが存在するので、これを Supabase の skills テーブルに追加する
スマホ版(base / sm)は 1 カラム、 PC版 (md 以上)は 2 カラムにしたい Chakra UI のSimpleGrid 使おう
<SimpleGrid w='100%' columns={{ base: 1, md: 2 }} gap={{ base: '2', md: '4' }}>
{skillLists?.map((card) =>
card.card_skills?.map((skill) => (
<SkillItem
key={skill.name}
skillName={skill.name}
skillPt={skill.skill_pt}
cardName={card.card_name}
/>
)),
)}
</SimpleGrid>
現在、Skills コンポーネントにトレーニング取得スキルとイベント取得スキルをベタ書きしているが、 これらはほぼ同じ構造なので SkillList コンポーネントとして新たに切り出す
src/features/Support/Skills/SkillList/index.tsx
type Props = {
heading: string;
skillLists:
| {
card_id: number;
card_name: string;
card_skills: EventSkill[] | TrainingSkill[];
}[]
| undefined;
};
const SkillList: React.FC<Props> = ({ heading, skillLists }) => {
return (
<VStack w='100%' p='4' gap='2' bgColor='blue.200'>
<Heading as='h2' fontSize='2xl'>
{heading}
</Heading>
<SimpleGrid w='100%' columns={{ base: 1, md: 2 }} gap={{ base: '2', md: '4' }}>
{skillLists?.map((card) =>
card.card_skills?.map((skill) => (
<SkillItem
key={skill.name}
skillName={skill.name}
skillPt={skill.skill_pt}
cardName={card.card_name}
/>
)),
)}
</SimpleGrid>
</VStack>
);
};
rarity カラムと icon_id カラムを Supabase の skills テーブルに追加したい これらは両方とも master.mdb の skill_data テーブルに存在し、追加先も同じテーブルなので 1 つの Issue で対応する UI 側の実装は別物なので、個別で Issue 立てて対応したい
また、フォントサイズがスマホだと大きいのでこれは後ほど修正
merge したので close