import { App, Button, Card, Col, Pagination, Popconfirm, Row, Select, Space, Tag, Typography, } from "antd" import { useCallback, useEffect, useMemo, useState } from "react" import { Link, useSearchParams } from "react-router-dom" import { ModificationApi, TagApi } from "@/api" import ModificationCreateModal from "@/components/modification-create-modal" import ModificationEditModal from "@/components/modification-edit-modal" import { useAppSelector } from "@/hooks/store" import { Modification } from "@/types" const pageSize = 10 export default function ModCodesPage() { const user = useAppSelector((state) => state.auth.user) const { message } = App.useApp() const [searchParams] = useSearchParams() const firearmId = useMemo(() => searchParams.get("firearmId") || undefined, [searchParams]) const parsedFirearmId = useMemo(() => { if (!firearmId) { return undefined } const value = Number(firearmId) return Number.isFinite(value) ? value : undefined }, [firearmId]) const [page, setPage] = useState(1) const [modifications, setModifications] = useState([]) const [tagOptions, setTagOptions] = useState([]) const [selectedTags, setSelectedTags] = useState([]) const [total, setTotal] = useState(0) const [deletingId, setDeletingId] = useState(null) const [createModalOpen, setCreateModalOpen] = useState(false) const [editingModification, setEditingModification] = useState(null) useEffect(() => { const _firearmId = firearmId ? +firearmId : void 0 TagApi.getTags(_firearmId).then((tags) => { setTagOptions(tags) }) }, [firearmId]) const loadModifications = useCallback(async () => { return ModificationApi.getModifications({ page: page - 1, size: pageSize, sortBy: "id", direction: "DESC", firearmId, tags: selectedTags, }).then((pagedData) => { setModifications(pagedData.items) setTotal(pagedData.totalElements) }) }, [page, firearmId, selectedTags]) useEffect(() => { void loadModifications() }, [loadModifications]) async function handleDelete(modification: Modification) { if (!user) { return } setDeletingId(modification.id) try { await ModificationApi.removeModification(modification.id) message.success("改枪码删除成功") if (modifications.length === 1 && page > 1) { setPage(page - 1) } else { void loadModifications() } } catch { message.error("改枪码删除失败,请稍后重试") } finally { setDeletingId(null) } } useEffect(() => { setPage(1) }, [firearmId]) useEffect(() => { setPage(1) }, [selectedTags]) return ( <>
改枪码列表
标签: mode="multiple" allowClear placeholder="请选择标签" className="w-64" value={selectedTags} options={tagOptions.map((tag) => ({ value: tag, label: tag }))} onChange={(values) => { setSelectedTags(values) }} /> {firearmId && 武器 ID: {firearmId}} {(firearmId || selectedTags.length > 0) && ( )} {user && ( )}
{modifications.map((modification) => ( handleDelete(modification)}>
) : null } variant="outlined" styles={{ header: { minHeight: 56 }, }}>
改枪码: {modification.code}
作者: {modification.author || "未知"} {(modification.tags?.length || 0) > 0 && (
{(modification.tags || []).map((tag) => ( {tag} ))}
)}
配件配置: {(modification.accessories?.length || 0) > 0 ? (
{(modification.accessories || []).map((accessory, accessoryIndex) => (
{accessory.slotName || "未填写槽位"} {accessory.accessoryName || "未填写配件"}
{(accessory.tunings?.length || 0) > 0 ? (
{accessory.tunings.map((tuning, tuningIndex) => ( {tuning.tuningName || "未命名"}: {tuning.tuningValue ?? "-"} ))}
) : null}
))}
) : ( 暂无配件信息 )}
{modification.note || "暂无备注"} {modification.videoUrl && ( )}
))} {modifications.length === 0 && ( 暂无改枪码数据 )}
{ setPage(nextPage) }} showSizeChanger={false} />
setCreateModalOpen(false)} onSuccess={() => { setCreateModalOpen(false) void loadModifications() }} /> setEditingModification(null)} onSuccess={() => { setEditingModification(null) void loadModifications() }} /> ) }