"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 { createOutfit, updateOutfit } from "@/lib/api/outfits" function isRealImageUrl(url?: string): boolean { if (!url) return false return !url.includes("placeholder") } const RARITY_MAP: Record = { "普通": "common", "稀有": "rare", "史诗": "epic", "传说": "legendary", } export type DisplayOutfit = { id: string name: string type: string rarity: string description: string releaseDate: string status: string activatedCount: number image?: string } type AddOutfitDialogProps = { mode?: "create" | "edit" initialOutfit?: DisplayOutfit open?: boolean onOpenChange?: (open: boolean) => void onSave?: (outfit: DisplayOutfit) => void } export function AddOutfitDialog({ mode = "create", initialOutfit, open: controlledOpen, onOpenChange: setControlledOpen, onSave, }: AddOutfitDialogProps) { const [open, setOpen] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false) const [name, setName] = useState("") const [outfitType, setOutfitType] = useState("") const [rarity, setRarity] = useState("") const [description, setDescription] = useState("") const [isLimited, setIsLimited] = useState(false) const [imageUrl, setImageUrl] = useState() const [previewId, setPreviewId] = useState( "OFT" + Math.floor(Math.random() * 1000) .toString() .padStart(3, "0"), ) useEffect(() => { if (mode === "edit" && initialOutfit) { setName(initialOutfit.name) setOutfitType(initialOutfit.type) setRarity(initialOutfit.rarity) setDescription(initialOutfit.description) setIsLimited(initialOutfit.type === "限定服装") setPreviewId(initialOutfit.id) setImageUrl(isRealImageUrl(initialOutfit.image) ? initialOutfit.image : undefined) } }, [mode, initialOutfit]) 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("") setOutfitType("") setRarity("") setDescription("") setIsLimited(false) setImageUrl(undefined) setPreviewId( "OFT" + Math.floor(Math.random() * 1000) .toString() .padStart(3, "0"), ) } } const handleSubmit = async () => { if (!name || !outfitType || !rarity || !description) { alert("请填写所有必填字段!") return } setIsSubmitting(true) try { const actualType = isLimited ? "限定服装" : outfitType if (mode === "create") { const created = await createOutfit({ name, description, category: actualType, rarityValue: RARITY_MAP[rarity] || rarity, imageUrl, }) const outfit: DisplayOutfit = { 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 || "", } if (onSave) { onSave(outfit) } } else { const updated = await updateOutfit(initialOutfit!.id, { name, description, category: actualType, imageUrl, }) const outfit: DisplayOutfit = { id: updated.id, name: updated.name, type: updated.category || actualType, rarity: updated.rarity || rarity, description: updated.description || description, releaseDate: initialOutfit?.releaseDate || "", status: updated.status || initialOutfit?.status || "未发布", activatedCount: updated.activeCardsCount || initialOutfit?.activatedCount || 0, image: updated.imageUrl || initialOutfit?.image || "", } if (onSave) { onSave(outfit) } } 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 />