diff --git a/src/components/atoms/FilterButton.tsx b/src/components/atoms/FilterButton.tsx
index 4fc3d054..8cc30d96 100644
--- a/src/components/atoms/FilterButton.tsx
+++ b/src/components/atoms/FilterButton.tsx
@@ -8,7 +8,7 @@ interface FilterButtonProps {
active?: boolean
icon?: string
label: string
- value: string
+ href: string
m?: string | number
close?: () => void
}
@@ -17,14 +17,14 @@ const FilterButton = ({
active = false,
icon,
label,
- value,
+ href,
m,
close,
}: FilterButtonProps) => {
const { push } = useRouter()
return (
{icon != null && (
diff --git a/src/pages/honkai3rd/battlesuits/index.tsx b/src/pages/honkai3rd/battlesuits/index.tsx
index 008b7de5..da57e761 100644
--- a/src/pages/honkai3rd/battlesuits/index.tsx
+++ b/src/pages/honkai3rd/battlesuits/index.tsx
@@ -54,26 +54,43 @@ const BattlesuitListPage = ({ battlesuits }: BattlesuitListPageProps) => {
setHiddenFilters(true)
}, [])
- const filter = useMemo(() => {
- if (query.filter == null) {
+ const valkyrieFilter = useMemo(() => {
+ if (query.valkyrie == null) {
return 'all'
}
- return typeof query.filter === 'string' ? query.filter : query.filter[0]
+ return typeof query.valkyrie === 'string'
+ ? query.valkyrie
+ : query.valkyrie[0]
}, [query])
- const battlesuitList = useMemo(() => {
- return battlesuits.map((battlesuit) => {
- const hidden = isBattlesuitHidden(battlesuit, filter)
- return (
-
- )
- })
- }, [battlesuits, filter])
+ const featureFilter = useMemo(() => {
+ if (query.feature == null) {
+ return 'all'
+ }
+
+ return typeof query.feature === 'string' ? query.feature : query.feature[0]
+ }, [query])
+
+ const battlesuitsFiteredByValkyrie = useMemo(() => {
+ return battlesuits.filter((battlesuit) =>
+ isValkyrieFilterMatching(battlesuit, valkyrieFilter)
+ )
+ }, [battlesuits, valkyrieFilter])
+
+ const availableFeatureSet = battlesuitsFiteredByValkyrie.reduce(
+ (set, battlesuit) => {
+ battlesuit.features.forEach((feature) => set.add(feature))
+ return set
+ },
+ new Set()
+ )
+
+ const battlesuitsFilteredByFeature = useMemo(() => {
+ return battlesuitsFiteredByValkyrie.filter((battlesuit) =>
+ isFeatureFilterMatching(battlesuit, featureFilter)
+ )
+ }, [battlesuitsFiteredByValkyrie, featureFilter])
return (
@@ -117,14 +134,14 @@ const BattlesuitListPage = ({ battlesuits }: BattlesuitListPageProps) => {
},
}}
>
- {t('battlesuits-list.filter-by-features')}
+ {t('battlesuits-list.filter-by-valkyries')}
- {featureFilterOptions.map(({ value, label, icon, krLabel }) => {
+ {valkyrieFilterOptions.map(({ value, label, icon, krLabel }) => {
return (
{
)
})}
-
- {t('battlesuits-list.filter-by-valkyries')}
+ {t('battlesuits-list.filter-by-features')}
- {valkyrieFilterOptions.map(({ value, label, icon, krLabel }) => {
- return (
-
- )
- })}
+ {featureFilterOptions
+ .filter((filterOption) => {
+ if (filterOption.value === 'all') {
+ return true
+ }
+ return availableFeatureSet.has(filterOption.value)
+ })
+ .map(({ value, label, icon, krLabel }) => {
+ return (
+
+ )
+ })}
@@ -158,7 +181,11 @@ const BattlesuitListPage = ({ battlesuits }: BattlesuitListPageProps) => {
justifyContent: 'space-around',
}}
>
- {battlesuitList}
+ {battlesuitsFilteredByFeature.map((battlesuit) => {
+ return (
+
+ )
+ })}
@@ -184,36 +211,17 @@ export async function getStaticProps({ locale }: NextPageContext) {
}
}
-function isBattlesuitHidden(
+function isValkyrieFilterMatching(
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.features.some((feature) => feature === filter)
+ valkyrieFilter: string
+) {
+ switch (valkyrieFilter) {
case 'mecha':
case 'biologic':
case 'psychic':
case 'quantum':
case 'imaginary':
- return battlesuit.type !== filter
+ return battlesuit.type === valkyrieFilter
case 'kiana':
case 'mei':
case 'bronya':
@@ -237,9 +245,19 @@ function isBattlesuitHidden(
case 'eden':
case 'griseo':
case 'vill-v':
- return battlesuit.valkyrie !== filter
+ return battlesuit.valkyrie === valkyrieFilter
default:
case 'all':
- return false
+ return true
}
}
+
+function isFeatureFilterMatching(
+ battlesuit: BattlesuitListItemData,
+ featureFilter: string
+) {
+ if (featureFilter === 'all') {
+ return true
+ }
+ return battlesuit.features.some((feature) => feature === featureFilter)
+}
diff --git a/src/pages/honkai3rd/weapons/index.tsx b/src/pages/honkai3rd/weapons/index.tsx
index ab0138a4..f3fd0f40 100644
--- a/src/pages/honkai3rd/weapons/index.tsx
+++ b/src/pages/honkai3rd/weapons/index.tsx
@@ -41,20 +41,22 @@ const WeaponListPage = ({ weaponDataList }: WeaponListPageProps) => {
const { query, locale } = useRouter()
const { t } = useTranslation()
- const filter = useMemo(() => {
- if (query.filter == null) {
+ const categoryFilter = useMemo(() => {
+ if (query.category == null) {
return 'all'
}
- return typeof query.filter === 'string' ? query.filter : query.filter[0]
+ return typeof query.category === 'string'
+ ? query.category
+ : query.category[0]
}, [query])
const weaponList = useMemo(() => {
return weaponDataList.map((weapon) => {
- const hidden = isWeaponHidden(weapon, filter)
+ const hidden = isWeaponHidden(weapon, categoryFilter)
return
})
- }, [weaponDataList, filter])
+ }, [weaponDataList, categoryFilter])
return (
@@ -82,8 +84,8 @@ const WeaponListPage = ({ weaponDataList }: WeaponListPageProps) => {
return (
diff --git a/tsconfig.json b/tsconfig.json
index 50be8da1..38608e93 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -13,6 +13,7 @@
"module": "esnext",
"moduleResolution": "node",
"resolveJsonModule": true,
+ "downlevelIteration": true,
"isolatedModules": true,
"jsx": "preserve",
"baseUrl": "./src"