"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 } from "lucide-react" import { Switch } from "@/components/ui/switch" import { FoodMediaUpload } from "./food-media-upload" import { createFood, updateFood } from "@/lib/api/food" import { useToast } from "@/components/ui/use-toast" import type { Food } from "./food-detail-dialog" type AddFoodDialogProps = { mode?: "create" | "edit" initialFood?: Food open?: boolean onOpenChange?: (open: boolean) => void onSave?: (food: Food) => void } export function AddFoodDialog({ mode = "create", initialFood, open: controlledOpen, onOpenChange: setControlledOpen, onSave, }: AddFoodDialogProps) { const { toast } = useToast() const [open, setOpen] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false) // 表单状态 const [name, setName] = useState("") const [foodType, setFoodType] = useState("") const [rarity, setRarity] = useState("") const [description, setDescription] = useState("") const [calories, setCalories] = useState() const [tasteTags, setTasteTags] = useState("") const [nutritionalValue, setNutritionalValue] = useState("") const [effectDescription, setEffectDescription] = useState("") const [isLimited, setIsLimited] = useState(false) const [imageUrl, setImageUrl] = useState() const [animationUrl, setAnimationUrl] = useState() const [audioUrl, setAudioUrl] = useState() const [previewId, setPreviewId] = useState( "FOD" + Math.floor(Math.random() * 1000) .toString() .padStart(3, "0"), ) // 当编辑模式且有食物数据时,初始化表单 useEffect(() => { if (mode === "edit" && initialFood) { console.log("🔧 初始化编辑模式表单:", initialFood) setName(initialFood.name) setFoodType(initialFood.food_type) setRarity(initialFood.rarity) setDescription(initialFood.description) setCalories(initialFood.calories) setTasteTags(initialFood.taste_tags || "") setNutritionalValue(initialFood.nutritional_value || "") setEffectDescription(initialFood.effect_description || "") setIsLimited(initialFood.is_limited || false) setPreviewId(initialFood.id) setImageUrl(initialFood.image) setAnimationUrl(initialFood.animation_file) setAudioUrl(initialFood.sound_effect) } }, [mode, initialFood]) // 处理受控和非受控开关状态 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("") setFoodType("") setRarity("") setDescription("") setCalories(undefined) setTasteTags("") setNutritionalValue("") setEffectDescription("") setIsLimited(false) setImageUrl(undefined) setAnimationUrl(undefined) setAudioUrl(undefined) setPreviewId( "FOD" + Math.floor(Math.random() * 1000) .toString() .padStart(3, "0"), ) } } const handleSubmit = async () => { // 表单验证 if (!name || !foodType || !rarity || !description) { toast({ title: "表单验证失败", description: "请填写所有必填字段!", variant: "destructive", }) return } // 图片是必填的(至少在创建模式下) if (mode === "create" && !imageUrl) { toast({ title: "表单验证失败", description: "请上传食物图片!", variant: "destructive", }) return } setIsSubmitting(true) try { // 构建食物数据 const foodData: Partial = { name, food_type: foodType, rarity, description, image: imageUrl, animation_file: animationUrl, sound_effect: audioUrl, calories, taste_tags: tasteTags, nutritional_value: nutritionalValue, effect_description: effectDescription, is_limited: isLimited, ...(mode === "create" ? { status: "draft" } : {}), } let result: Food if (mode === "create") { // 创建新食物 const response = await createFood(foodData) if (!response.success) { throw new Error(response.message || "创建食物失败") } result = response.data console.log("✅ 食物创建成功:", result) } else { // 更新食物 if (!initialFood?.id) { throw new Error("缺少食物ID,无法更新") } console.log("🔄 更新食物数据:", { id: initialFood.id, foodData }) const response = await updateFood(initialFood.id, foodData) if (!response.success) { throw new Error(response.message || "更新食物失败") } result = response.data console.log("✅ 食物更新成功:", result) } // 调用保存回调 if (onSave) { onSave(result) } // 显示成功消息 toast({ title: mode === "create" ? "创建成功" : "更新成功", description: `食物 ${name} 已${mode === "create" ? "创建" : "更新"}成功!`, }) // 关闭对话框 handleOpenChange(false) } catch (error) { console.error(mode === "create" ? "创建食物失败:" : "更新食物失败:", error) const errorMessage = error instanceof Error ? error.message : "操作失败,请重试!" toast({ title: mode === "create" ? "创建失败" : "更新失败", description: errorMessage, variant: "destructive", }) } finally { setIsSubmitting(false) } } return ( {mode === "create" && ( )} {mode === "create" ? "添加新食物" : "编辑食物"} {mode === "create" ? "填写食物信息以创建新的食物卡牌。创建后将生成唯一的卡牌ID。" : "修改食物信息。"}
setName(e.target.value)} required />