"use client" import { useState, useEffect } from "react" import { DashboardShell } from "@/components/dashboard-shell" import { DashboardHeader } from "@/components/dashboard-header" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" import { Input } from "@/components/ui/input" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Badge } from "@/components/ui/badge" import { Search, Edit, Eye, Loader2 } from "lucide-react" import { AddFoodDialog } from "@/components/food/add-food-dialog" import { DeleteConfirmationDialog } from "@/components/delete-confirmation-dialog" import { useToast } from "@/components/ui/use-toast" import Link from "next/link" import type { Food } from "@/components/food/food-detail-dialog" import { getFoods, deleteFood as deleteFoodApi } from "@/lib/api/food" export default function FoodPage() { const { toast } = useToast() const [foods, setFoods] = useState([]) const [loading, setLoading] = useState(true) const [searchTerm, setSearchTerm] = useState("") const [currentPage, setCurrentPage] = useState(1) const [totalPages, setTotalPages] = useState(1) const [total, setTotal] = useState(0) const [selectedFood, setSelectedFood] = useState(null) const [isEditDialogOpen, setIsEditDialogOpen] = useState(false) const itemsPerPage = 10 // 状态显示映射 const getStatusDisplay = (status: string) => { const statusMap: Record = { 'published': '已发布', 'draft': '草稿', 'pending': '待审核', } return statusMap[status] || status } // 获取食物列表数据 const fetchFoods = async (page: number = 1, search: string = "") => { try { setLoading(true) const response = await getFoods({ page, pageSize: itemsPerPage, search: search || undefined, }) if (response.success && response.data) { setFoods(response.data.results || []) setTotal(response.data.count || 0) setTotalPages(Math.ceil((response.data.count || 0) / itemsPerPage)) } } catch (error) { console.error("获取食物列表失败:", error) toast({ title: "获取数据失败", description: error instanceof Error ? error.message : "无法获取食物列表", variant: "destructive", }) setFoods([]) } finally { setLoading(false) } } // 初始化数据 useEffect(() => { fetchFoods(currentPage, searchTerm) }, [currentPage]) // 搜索处理 const handleSearch = (value: string) => { setSearchTerm(value) setCurrentPage(1) fetchFoods(1, value) } // 处理添加食物成功后的刷新 const handleAddFood = async () => { // 食物已经在 AddFoodDialog 中创建成功,这里只需要刷新列表 fetchFoods(currentPage, searchTerm) } // 处理编辑食物成功后的刷新 const handleEditFood = async () => { // 食物已经在 AddFoodDialog 中更新成功,这里只需要刷新列表和关闭对话框 setSelectedFood(null) setIsEditDialogOpen(false) fetchFoods(currentPage, searchTerm) } // 处理删除食物 const handleDeleteFood = async (foodId: string) => { try { const response = await deleteFoodApi(foodId) if (response.success) { toast({ title: "删除成功", description: "食物已成功删除", variant: "destructive", }) // 重新获取当前页数据 fetchFoods(currentPage, searchTerm) } } catch (error) { console.error("删除食物失败:", error) toast({ title: "删除失败", description: error instanceof Error ? error.message : "删除食物失败", variant: "destructive", }) } } // 打开编辑对话框 const openEditDialog = (food: Food) => { setSelectedFood(food) setIsEditDialogOpen(true) } return (
handleSearch(e.target.value)} />
食物列表
管理洛天依的食物卡牌
{loading ? (
加载中...
) : ( ID 食物名称 类型 稀有度 发布日期 状态 激活数量 操作 {foods.map((food) => ( {food.id} {food.name} {food.food_type} {food.rarity} {food.releaseDate || "-"} {getStatusDisplay(food.status)} {food.activatedCount} {food.status !== "published" && food.status !== "已发布" && ( <> handleDeleteFood(food.id)} /> )} ))} {foods.length === 0 && !loading && ( {searchTerm ? "没有找到匹配的食物" : "暂无食物数据"} )}
)}
显示 {foods.length > 0 ? (currentPage - 1) * itemsPerPage + 1 : 0}- {Math.min(currentPage * itemsPerPage, total)} 共 {total} 个食物
{/* 编辑食物对话框 */} {selectedFood && isEditDialogOpen && ( )}
) }