"use client" import { useState, useEffect, useCallback } 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, Archive } from "lucide-react" import { AddHomeDecorDialog } from "@/components/home-decor/add-home-decor-dialog" import type { HomeDecor as ComponentHomeDecor } from "@/components/home-decor/home-decor-detail-dialog" import { DeleteConfirmationDialog } from "@/components/delete-confirmation-dialog" import { PublishConfirmationDialog } from "@/components/publish-confirmation-dialog" import { useToast } from "@/components/ui/use-toast" import { isSuperUser } from "@/lib/api/auth" import { getHomeDecors, deleteHomeDecor, publishHomeDecor, archiveHomeDecor } from "@/lib/api/home-decor" import type { HomeDecor } from "@/lib/api/types" import Link from "next/link" // 格式化日期时间 function formatDate(dateStr: string): string { if (!dateStr) return "" try { return new Date(dateStr).toLocaleDateString("zh-CN", { year: "numeric", month: "2-digit", day: "2-digit", }) } catch { return dateStr } } // 将 API HomeDecor 转换为组件显示用的 HomeDecor function toDisplayDecor(decor: HomeDecor): ComponentHomeDecor { return { id: decor.id, name: decor.name, type: decor.category || "", rarity: decor.rarity || "", description: decor.description || "", releaseDate: formatDate(decor.publishedAt || decor.createdAt || ""), status: decor.status || "未发布", activatedCount: decor.activeCardsCount || 0, image: decor.imageUrl || "/placeholder.svg?height=300&width=300", } } export default function HomeDecorPage() { const { toast } = useToast() const [decors, setDecors] = useState([]) const [searchTerm, setSearchTerm] = useState("") const [currentPage, setCurrentPage] = useState(1) const [totalItems, setTotalItems] = useState(0) const [selectedDecor, setSelectedDecor] = useState(null) const [isEditDialogOpen, setIsEditDialogOpen] = useState(false) const [loading, setLoading] = useState(true) const itemsPerPage = 10 // 从后端获取家居装饰列表 const fetchDecors = useCallback(async () => { try { setLoading(true) const response = await getHomeDecors({ page: currentPage, pageSize: itemsPerPage, search: searchTerm || undefined, }) setDecors(response.items.map(toDisplayDecor)) setTotalItems(response.total) } catch (error) { console.error("获取家居装饰列表失败:", error) toast({ title: "获取失败", description: "无法获取家居装饰列表,请稍后重试", variant: "destructive", }) } finally { setLoading(false) } }, [currentPage, searchTerm, toast]) useEffect(() => { fetchDecors() }, [fetchDecors]) const totalPages = Math.ceil(totalItems / itemsPerPage) // 处理添加家居装饰 const handleAddDecor = (newDecor: ComponentHomeDecor) => { fetchDecors() toast({ title: "添加成功", description: `家居装饰 ${newDecor.name} 已成功添加`, }) } // 处理编辑家居装饰 const handleEditDecor = (updatedDecor: ComponentHomeDecor) => { fetchDecors() setSelectedDecor(null) setIsEditDialogOpen(false) toast({ title: "更新成功", description: `家居装饰 ${updatedDecor.name} 已成功更新`, }) } // 处理删除家居装饰 const handleDeleteDecor = async (decorId: string) => { try { await deleteHomeDecor(decorId) await fetchDecors() toast({ title: "删除成功", description: "家居装饰已成功删除", variant: "destructive", }) } catch (error) { console.error("删除家居装饰失败:", error) toast({ title: "删除失败", description: "无法删除家居装饰,请稍后重试", variant: "destructive", }) } } // 发布家居装饰 const handlePublishDecor = async (decorId: string, decorName: string) => { try { await publishHomeDecor(decorId) await fetchDecors() toast({ title: "发布成功", description: `家居装饰 "${decorName}" 已成功发布`, }) } catch (error) { console.error("发布家居装饰失败:", error) toast({ title: "发布失败", description: "无法发布家居装饰,请稍后重试", variant: "destructive", }) } } // 归档家居装饰 const handleArchiveDecor = async (decorId: string, decorName: string) => { try { await archiveHomeDecor(decorId) await fetchDecors() toast({ title: "归档成功", description: `家居装饰 "${decorName}" 已归档`, }) } catch (error) { console.error("归档家居装饰失败:", error) toast({ title: "归档失败", description: "无法归档家居装饰,请稍后重试", variant: "destructive", }) } } // 打开编辑对话框 const openEditDialog = (decor: ComponentHomeDecor) => { setSelectedDecor(decor) setIsEditDialogOpen(true) } return (
{ setSearchTerm(e.target.value) setCurrentPage(1) }} />
家居装饰列表
管理洛天依的家居装饰卡牌
{loading ? (
加载中...
) : ( ID 装饰名称 类型 稀有度 发布日期 状态 激活数量 操作 {decors.map((decor) => ( {decor.id} {decor.name} {decor.type} {decor.rarity} {decor.releaseDate || "-"} {decor.status} {decor.activatedCount} {/* 草稿状态:显示发布按钮 */} {decor.status === "草稿" && ( handlePublishDecor(decor.id, decor.name)} /> )} {/* 已发布状态:显示归档按钮 */} {decor.status === "已发布" && ( )} {(decor.status !== "已发布" || isSuperUser()) && ( <> handleDeleteDecor(decor.id)} /> )} ))} {decors.length === 0 && ( 没有找到匹配的家居装饰 )}
)}
显示 {decors.length > 0 ? (currentPage - 1) * itemsPerPage + 1 : 0}- {Math.min(currentPage * itemsPerPage, totalItems)} 共 {totalItems} 个家居装饰
{/* 编辑家居装饰对话框 - 当选中家居装饰时显示 */} {selectedDecor && isEditDialogOpen && ( )}
) }