"use client" import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Plus, AlertTriangle, Loader2, Trash2 } from "lucide-react" import { Switch } from "@/components/ui/switch" import { FileUpload } from "@/components/ui/file-upload" import type { Prop } from "./prop-detail-dialog" import { createProp, updateProp } from "@/lib/api/props" // 判断是否为有效图片URL(非placeholder) function isRealImageUrl(url?: string): boolean { if (!url) return false return !url.includes("placeholder") } // 中文稀有度 -> 后端 rarity key const RARITY_MAP: Record = { "普通": "common", "稀有": "rare", "史诗": "epic", "传说": "legendary", } type AddPropDialogProps = { mode?: "create" | "edit" initialProp?: Prop open?: boolean onOpenChange?: (open: boolean) => void onSave?: (prop: Prop) => void } export function AddPropDialog({ mode = "create", initialProp, open: controlledOpen, onOpenChange: setControlledOpen, onSave, }: AddPropDialogProps) { const [open, setOpen] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false) // 表单状态 const [name, setName] = useState("") const [propType, setPropType] = useState("") const [rarity, setRarity] = useState("") const [description, setDescription] = useState("") const [isLimited, setIsLimited] = useState(false) const [imageUrl, setImageUrl] = useState() const [previewId, setPreviewId] = useState( "PRP" + Math.floor(Math.random() * 1000) .toString() .padStart(3, "0"), ) // 当编辑模式且有道具数据时,初始化表单 useEffect(() => { if (mode === "edit" && initialProp) { setName(initialProp.name) setPropType(initialProp.type) setRarity(initialProp.rarity) setDescription(initialProp.description) setIsLimited(initialProp.type === "限定道具") setPreviewId(initialProp.id) setImageUrl(isRealImageUrl(initialProp.image) ? initialProp.image : undefined) } }, [mode, initialProp]) // 处理受控和非受控开关状态 useEffect(() => { if (controlledOpen !== undefined) { setOpen(controlledOpen) } }, [controlledOpen]) // 处理对话框关闭 const handleOpenChange = (newOpen: boolean) => { setOpen(newOpen) if (setControlledOpen) { setControlledOpen(newOpen) } // 如果关闭对话框,重置表单(仅在创建模式下) if (!newOpen && mode === "create") { resetForm() } } // 重置表单 const resetForm = () => { if (mode === "create") { setName("") setPropType("") setRarity("") setDescription("") setIsLimited(false) setImageUrl(undefined) setPreviewId( "PRP" + Math.floor(Math.random() * 1000) .toString() .padStart(3, "0"), ) } } const handleSubmit = async () => { // 表单验证 if (!name || !propType || !rarity || !description) { alert("请填写所有必填字段!") return } setIsSubmitting(true) try { const actualType = isLimited ? "限定道具" : propType if (mode === "create") { // 调用后端创建 API const created = await createProp({ name, description, category: actualType, rarityValue: RARITY_MAP[rarity] || rarity, imageUrl, }) // 构建组件格式的 Prop 用于回调 const prop: Prop = { id: created.id, name: created.name, type: created.category || actualType, rarity: created.rarity || rarity, description: created.description || description, releaseDate: created.createdAt || "", status: created.status || "未发布", activatedCount: created.activeCardsCount || 0, image: created.imageUrl || "/placeholder.svg?height=300&width=300", } if (onSave) { onSave(prop) } } else { // 调用后端更新 API const updated = await updateProp(initialProp!.id, { name, description, category: actualType, imageUrl, }) const prop: Prop = { id: updated.id, name: updated.name, type: updated.category || actualType, rarity: updated.rarity || rarity, description: updated.description || description, releaseDate: initialProp?.releaseDate || "", status: updated.status || initialProp?.status || "未发布", activatedCount: updated.activeCardsCount || initialProp?.activatedCount || 0, image: updated.imageUrl || initialProp?.image || "/placeholder.svg?height=300&width=300", } if (onSave) { onSave(prop) } } // 关闭对话框 handleOpenChange(false) } catch (error) { console.error(mode === "create" ? "创建道具失败:" : "更新道具失败:", error) alert(mode === "create" ? "创建道具失败,请重试!" : "更新道具失败,请重试!") } finally { setIsSubmitting(false) } } return ( {mode === "create" && ( )} {mode === "create" ? "添加新道具" : "编辑道具"} {mode === "create" ? "填写道具信息以创建新的道具卡牌。创建后将生成唯一的卡牌ID。" : "修改道具信息。"}
setName(e.target.value)} required />