"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, Upload, AlertTriangle, Loader2 } from "lucide-react" import { Switch } from "@/components/ui/switch" import type { Prop } from "./prop-detail-dialog" 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 [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) } }, [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) 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 prop: Prop = { id: initialProp?.id || previewId, name, type: isLimited ? "限定道具" : propType, rarity, description, releaseDate: initialProp?.releaseDate || "", status: initialProp?.status || "未发布", activatedCount: initialProp?.activatedCount || 0, image: initialProp?.image || "/placeholder.svg?height=300&width=300", } // 模拟API请求 await new Promise((resolve) => setTimeout(resolve, 1500)) // 调用保存回调 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 />