"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 { HomeDecor } from "./home-decor-detail-dialog" import { createHomeDecor, updateHomeDecor } from "@/lib/api/home-decor" // 判断是否为有效图片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 AddHomeDecorDialogProps = { mode?: "create" | "edit" initialDecor?: HomeDecor open?: boolean onOpenChange?: (open: boolean) => void onSave?: (decor: HomeDecor) => void } export function AddHomeDecorDialog({ mode = "create", initialDecor, open: controlledOpen, onOpenChange: setControlledOpen, onSave, }: AddHomeDecorDialogProps) { const [open, setOpen] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false) // 表单状态 const [name, setName] = useState("") const [decorType, setDecorType] = useState("") const [rarity, setRarity] = useState("") const [description, setDescription] = useState("") const [isLimited, setIsLimited] = useState(false) const [imageUrl, setImageUrl] = useState() const [previewId, setPreviewId] = useState( "DEC" + Math.floor(Math.random() * 1000) .toString() .padStart(3, "0"), ) // 当编辑模式且有装饰数据时,初始化表单 useEffect(() => { if (mode === "edit" && initialDecor) { setName(initialDecor.name) setDecorType(initialDecor.type) setRarity(initialDecor.rarity) setDescription(initialDecor.description) setIsLimited(initialDecor.type.includes("限定")) setPreviewId(initialDecor.id) setImageUrl(isRealImageUrl(initialDecor.image) ? initialDecor.image : undefined) } }, [mode, initialDecor]) // 处理受控和非受控开关状态 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("") setDecorType("") setRarity("") setDescription("") setIsLimited(false) setImageUrl(undefined) setPreviewId( "DEC" + Math.floor(Math.random() * 1000) .toString() .padStart(3, "0"), ) } } const handleSubmit = async () => { // 表单验证 if (!name || !decorType || !rarity || !description) { alert("请填写所有必填字段!") return } setIsSubmitting(true) try { const actualType = isLimited ? `限定${decorType}` : decorType if (mode === "create") { // 调用后端创建 API const created = await createHomeDecor({ name, description, category: actualType, rarityValue: RARITY_MAP[rarity] || rarity, imageUrl, }) // 构建组件格式的 HomeDecor 用于回调 const decor: HomeDecor = { 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(decor) } } else { // 调用后端更新 API const updated = await updateHomeDecor(initialDecor!.id, { name, description, category: actualType, imageUrl, }) const decor: HomeDecor = { id: updated.id, name: updated.name, type: updated.category || actualType, rarity: updated.rarity || rarity, description: updated.description || description, releaseDate: initialDecor?.releaseDate || "", status: updated.status || initialDecor?.status || "未发布", activatedCount: updated.activeCardsCount || initialDecor?.activatedCount || 0, image: updated.imageUrl || initialDecor?.image || "/placeholder.svg?height=300&width=300", } if (onSave) { onSave(decor) } } // 关闭对话框 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 />