import { useEffect, useMemo, useState } from "react" import { FirearmApi } from "@/api" import slotNames from "@/constant/slots.json" import tuningNames from "@/constant/tunings.json" import { Firearm, ModificationRequest } from "@/types" import { AutoComplete, Button, Card, Form, Input, InputNumber, Select, Space } from "antd" interface ModificationFormProps { form: ReturnType>[0] onFinish: (values: ModificationRequest) => void lockFirearmId?: number } const slotOptions = slotNames.map((slotName) => ({ value: slotName })) const tuningOptions = tuningNames.map((tuningName) => ({ value: tuningName })) export default function ModificationForm({ form, onFinish, lockFirearmId }: ModificationFormProps) { const [firearmOptions, setFirearmOptions] = useState>([]) const [firearmLoading, setFirearmLoading] = useState(false) useEffect(() => { let active = true async function loadAllFirearms() { setFirearmLoading(true) try { const allFirearms: Firearm[] = [] let page = 0 let totalPages = 1 while (page < totalPages) { const paged = await FirearmApi.getFirearms({ page, size: 100, sortBy: "id", direction: "ASC", }) allFirearms.push(...paged.items) totalPages = paged.totalPages page += 1 } if (!active) { return } setFirearmOptions( allFirearms.map((firearm) => ({ value: firearm.id, label: `${firearm.name}`, })) ) } finally { if (active) { setFirearmLoading(false) } } } void loadAllFirearms() return () => { active = false } }, []) const mergedFirearmOptions = useMemo(() => { if ( lockFirearmId === undefined || firearmOptions.some((option) => option.value === lockFirearmId) ) { return firearmOptions } return [{ value: lockFirearmId, label: `武器 ID: ${lockFirearmId}` }, ...firearmOptions] }, [firearmOptions, lockFirearmId]) return ( form={form} layout="vertical" onFinish={onFinish} requiredMark={false}> name="firearmId" label="武器" rules={[{ required: true, message: "请输入武器" }]}> className="w-full" placeholder="请选择武器" options={mergedFirearmOptions} loading={firearmLoading} disabled={lockFirearmId !== undefined} showSearch={{ filterOption: (input, option) => { const labelText = String(option?.label ?? "") return labelText.toLowerCase().includes(input.toLowerCase()) }, }} /> name="name" label="改装名称" rules={[{ required: true, message: "请输入改装名称" }]}> name="code" label="改枪码" rules={[{ required: true, message: "请输入改枪码" }]}> name="tags" label="标签"> name="videoUrl" label="视频链接"> name="note" label="备注"> {(accessoryFields, { add: addAccessory, remove: removeAccessory }) => (
{accessoryFields.map((accessoryField) => ( removeAccessory(accessoryField.name)}> 删除配件 }> {(tuningFields, { add: addTuning, remove: removeTuning }) => (
{tuningFields.map((tuningField) => ( ))}
)}
))}
)}
) }