Refactor battlesuit list page
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
import { Box, Heading, Flex, Text, Link, Button } from '@theme-ui/components'
|
import { Box, Heading, Flex, Text, Link, Button } from '@theme-ui/components'
|
||||||
import Image from 'next/image'
|
|
||||||
import NextLink from 'next/link'
|
import NextLink from 'next/link'
|
||||||
import { pick } from 'ramda'
|
import { pick } from 'ramda'
|
||||||
import React, { useCallback, useMemo, useState } from 'react'
|
import React, { useCallback, useMemo, useState } from 'react'
|
||||||
@@ -71,63 +70,9 @@ const valkyrieFilterOptions = [
|
|||||||
const BattlesuitListPage = ({ battlesuits }: BattlesuitListPageProps) => {
|
const BattlesuitListPage = ({ battlesuits }: BattlesuitListPageProps) => {
|
||||||
const [filter, setFilter] = useState('all')
|
const [filter, setFilter] = useState('all')
|
||||||
|
|
||||||
const isBattlesuitHidden = useCallback(
|
|
||||||
(battlesuit: BattlesuitListItemData) => {
|
|
||||||
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
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[filter]
|
|
||||||
)
|
|
||||||
|
|
||||||
const battlesuitList = useMemo(() => {
|
const battlesuitList = useMemo(() => {
|
||||||
return battlesuits.map((battlesuit) => {
|
return battlesuits.map((battlesuit) => {
|
||||||
const hidden = isBattlesuitHidden(battlesuit)
|
const hidden = isBattlesuitHidden(battlesuit, filter)
|
||||||
return (
|
return (
|
||||||
<Box
|
<Box
|
||||||
key={battlesuit.id}
|
key={battlesuit.id}
|
||||||
@@ -140,8 +85,7 @@ const BattlesuitListPage = ({ battlesuits }: BattlesuitListPageProps) => {
|
|||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
borderStyle: 'solid',
|
borderStyle: 'solid',
|
||||||
borderRadius: 8,
|
borderRadius: 8,
|
||||||
transition:
|
transition: 'box-shadow 200ms ease-in-out',
|
||||||
'box-shadow 200ms ease-in-out, opacity 200ms ease-in-out',
|
|
||||||
'&:hover': {
|
'&:hover': {
|
||||||
borderColor: 'gray.3',
|
borderColor: 'gray.3',
|
||||||
boxShadow: '0 4px 8px rgba(0, 0, 0, 0.2)',
|
boxShadow: '0 4px 8px rgba(0, 0, 0, 0.2)',
|
||||||
@@ -157,22 +101,11 @@ const BattlesuitListPage = ({ battlesuits }: BattlesuitListPageProps) => {
|
|||||||
passHref={true}
|
passHref={true}
|
||||||
>
|
>
|
||||||
<Link>
|
<Link>
|
||||||
<Box
|
<SquareImageBox
|
||||||
sx={{
|
alt={battlesuit.name}
|
||||||
position: 'relative',
|
src={`/assets/honkai3rd/battlesuits/portrait-${battlesuit.id}.png`}
|
||||||
overflow: 'hidden',
|
size={140}
|
||||||
width: '140px',
|
/>
|
||||||
height: '140px',
|
|
||||||
borderRadius: 4,
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Image
|
|
||||||
alt={battlesuit.name}
|
|
||||||
layout='fill'
|
|
||||||
objectFit='cover'
|
|
||||||
src={`/assets/honkai3rd/battlesuits/portrait-${battlesuit.id}.png`}
|
|
||||||
/>
|
|
||||||
</Box>
|
|
||||||
<Box
|
<Box
|
||||||
sx={{
|
sx={{
|
||||||
overflow: 'hidden',
|
overflow: 'hidden',
|
||||||
@@ -189,7 +122,7 @@ const BattlesuitListPage = ({ battlesuits }: BattlesuitListPageProps) => {
|
|||||||
</Box>
|
</Box>
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
}, [battlesuits, isBattlesuitHidden])
|
}, [battlesuits, filter])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
@@ -296,3 +229,57 @@ const FilterButton = ({
|
|||||||
</Button>
|
</Button>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user