feat: add firearm type filter to firearms page
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
import { useEffect, useState } from "react"
|
import { useEffect, useState } from "react"
|
||||||
import { FirearmApi } from "@/api"
|
import { FirearmApi } from "@/api"
|
||||||
import { Firearm, FirearmType } from "@/types"
|
import { Firearm, FirearmType } from "@/types"
|
||||||
import { Card, Col, Pagination, Row, Tag, Typography } from "antd"
|
import { Card, Col, Pagination, Row, Select, Tag, Typography } from "antd"
|
||||||
|
|
||||||
const firearmTypeText: Record<FirearmType, string> = {
|
const firearmTypeText: Record<FirearmType, string> = {
|
||||||
RIFLE: "步枪",
|
RIFLE: "步枪",
|
||||||
@@ -14,8 +14,12 @@ const firearmTypeText: Record<FirearmType, string> = {
|
|||||||
SPECIAL: "特殊",
|
SPECIAL: "特殊",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const allTypeValue = "ALL"
|
||||||
|
type FirearmTypeFilter = FirearmType | typeof allTypeValue
|
||||||
|
|
||||||
export default function FirearmsPage() {
|
export default function FirearmsPage() {
|
||||||
const [page, setPage] = useState<number>(1)
|
const [page, setPage] = useState<number>(1)
|
||||||
|
const [typeFilter, setTypeFilter] = useState<FirearmTypeFilter>(allTypeValue)
|
||||||
const [firearms, setFirearms] = useState<Firearm[]>([])
|
const [firearms, setFirearms] = useState<Firearm[]>([])
|
||||||
const [total, setTotal] = useState<number>(0)
|
const [total, setTotal] = useState<number>(0)
|
||||||
|
|
||||||
@@ -25,14 +29,32 @@ export default function FirearmsPage() {
|
|||||||
size: 12,
|
size: 12,
|
||||||
sortBy: "id",
|
sortBy: "id",
|
||||||
direction: "ASC",
|
direction: "ASC",
|
||||||
|
type: typeFilter === allTypeValue ? undefined : typeFilter,
|
||||||
}).then((pagedData) => {
|
}).then((pagedData) => {
|
||||||
setFirearms(pagedData.items)
|
setFirearms(pagedData.items)
|
||||||
setTotal(pagedData.totalElements)
|
setTotal(pagedData.totalElements)
|
||||||
})
|
})
|
||||||
}, [page])
|
}, [page, typeFilter])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
<div className="mb-4 flex justify-end">
|
||||||
|
<Select<FirearmTypeFilter>
|
||||||
|
className="w-full sm:w-64"
|
||||||
|
value={typeFilter}
|
||||||
|
options={[
|
||||||
|
{ value: allTypeValue, label: "全部类型" },
|
||||||
|
...Object.entries(firearmTypeText).map(([value, label]) => ({
|
||||||
|
value,
|
||||||
|
label,
|
||||||
|
})),
|
||||||
|
]}
|
||||||
|
onChange={(nextType) => {
|
||||||
|
setPage(1)
|
||||||
|
setTypeFilter(nextType)
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
<div className="mb-6">
|
<div className="mb-6">
|
||||||
<Row gutter={[16, 16]}>
|
<Row gutter={[16, 16]}>
|
||||||
{firearms.map((firearm) => (
|
{firearms.map((firearm) => (
|
||||||
@@ -47,13 +69,12 @@ export default function FirearmsPage() {
|
|||||||
<div className="flex flex-col gap-3">
|
<div className="flex flex-col gap-3">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<Tag color="blue">{firearmTypeText[firearm.type]}</Tag>
|
<Tag color="blue">{firearmTypeText[firearm.type]}</Tag>
|
||||||
<Typography.Text type="secondary">ID: {firearm.id}</Typography.Text>
|
|
||||||
</div>
|
</div>
|
||||||
<Typography.Text>
|
<Typography.Text>
|
||||||
<strong>解锁等级:</strong>
|
<strong>武器输出等级:</strong>
|
||||||
{firearm.level}
|
{firearm.level}
|
||||||
</Typography.Text>
|
</Typography.Text>
|
||||||
<Typography.Paragraph className="!mb-0" type="secondary" ellipsis={{ rows: 3 }}>
|
<Typography.Paragraph style={{ marginBottom: 0 }} type="secondary" ellipsis={{ rows: 3 }}>
|
||||||
{firearm.review || "暂无描述"}
|
{firearm.review || "暂无描述"}
|
||||||
</Typography.Paragraph>
|
</Typography.Paragraph>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user