import { Box, Heading, Flex, Text, Link } from '@theme-ui/components' import NextLink from 'next/link' import { pick } from 'ramda' import React, { useMemo, useState } from 'react' import FilterButton from '../../../components/atoms/FilterButton' import SquareImageBox from '../../../components/atoms/SquareImageBox' import Breadcrumb from '../../../components/organisms/Breadcrumb' import Honkai3rdNavigator from '../../../components/organisms/Honkai3rdNavigator' import { BattlesuitData, listBattlesuits, } from '../../../data/honkai3rd/battlesuits' import { battlesuitStrengths } from '../../../lib/safeData' type BattlesuitListItemData = Pick< BattlesuitData, 'id' | 'name' | 'strengths' | 'type' | 'valkyrie' > interface BattlesuitListPageProps { battlesuits: BattlesuitListItemData[] } const featureFilterOptions = [ { value: 'all', label: 'All' }, ...battlesuitStrengths, ] const valkyrieFilterOptions = [ { value: 'all', label: 'All' }, { value: 'mecha', label: 'Mecha' }, { value: 'biologic', label: 'Biologic' }, { value: 'psychic', label: 'Psychic' }, { value: 'quantum', label: 'Quantum' }, { value: 'imaginary', label: 'Imaginary' }, { value: 'kiana', label: 'Kiana' }, { value: 'mei', label: 'Mei' }, { value: 'bronya', label: 'Bronya' }, { value: 'himeko', label: 'Himeko' }, { value: 'theresa', label: 'Theresa' }, { value: 'fuhua', label: 'Fu Hua' }, { value: 'rita', label: 'Rita' }, { value: 'sakura', label: 'Sakura' }, { value: 'kallen', label: 'Kallen' }, { value: 'olenyevas', label: 'Olenyevas' }, { value: 'seele', label: 'Seele' }, { value: 'durandal', label: 'Durandal' }, { value: 'fischl', label: 'Fischl' }, { value: 'elysia', label: 'Elysia' }, { value: 'mobius', label: 'Mobius' }, { value: 'raven', label: 'Raven' }, { value: 'carole', label: 'Carole' }, ] const BattlesuitListPage = ({ battlesuits }: BattlesuitListPageProps) => { const [filter, setFilter] = useState('all') const battlesuitList = useMemo(() => { return battlesuits.map((battlesuit) => { const hidden = isBattlesuitHidden(battlesuit, filter) return ( {battlesuit.name} ) }) }, [battlesuits, filter]) return ( Battlesuits Filter by Features {featureFilterOptions.map(({ value, label }) => { return ( ) })} Filter by Valkyries {valkyrieFilterOptions.map(({ value, label }) => { return ( ) })} {battlesuitList} ) } export default BattlesuitListPage export async function getStaticProps() { return { props: { battlesuits: listBattlesuits().map((battlesuit) => pick(['id', 'name', 'strengths', 'type', 'valkyrie'], battlesuit) ), }, } } function isBattlesuitHidden( battlesuit: BattlesuitListItemData, filter: string ): boolean { switch (filter) { case 'physical': case 'fire dmg': case 'ice dmg': case 'lightning dmg': case 'freeze': case 'paralyze': case 'stun': case 'ignite': case 'bleed': case 'heavy atk': case 'weaken': case 'impair': case 'time mastery': case 'gather': case 'heal': case 'fast atk': case 'burst': case 'aerial': return !battlesuit.strengths.some((strength) => strength === filter) case 'mecha': case 'biologic': case 'psychic': case 'quantum': case 'imaginary': return battlesuit.type !== filter case 'kiana': case 'mei': case 'bronya': case 'himeko': case 'theresa': case 'fuhua': case 'rita': case 'sakura': case 'kallen': case 'olenyevas': case 'seele': case 'durandal': case 'fischl': case 'elysia': case 'mobius': case 'raven': case 'carole': return battlesuit.valkyrie !== filter default: case 'all': return false } }