"use client" import { useState, useEffect } from "react" import { DashboardHeader } from "@/components/dashboard-header" import { DashboardShell } from "@/components/dashboard-shell" import { Button } from "@/components/ui/button" import { Card, CardContent } from "@/components/ui/card" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { Input } from "@/components/ui/input" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Badge } from "@/components/ui/badge" import { Progress } from "@/components/ui/progress" import { Award, Search, MoreHorizontal, Edit, Trash2, Trophy, Filter, ArrowUpDown, Zap, Heart, Coins, Gift, Shirt, BadgeCheck, } from "lucide-react" import { toast } from "@/components/ui/use-toast" import { AddAchievementDialog } from "@/components/achievements/add-achievement-dialog" import { AchievementDetailDialog } from "@/components/achievements/achievement-detail-dialog" import { DeleteConfirmationDialog } from "@/components/delete-confirmation-dialog" import type { Achievement } from "@/lib/api/types" export default function AchievementsPage() { const [achievements, setAchievements] = useState([]) const [loading, setLoading] = useState(true) const [searchQuery, setSearchQuery] = useState("") const [activeTab, setActiveTab] = useState("all") useEffect(() => { fetchAchievements() }, []) const fetchAchievements = async () => { setLoading(true) try { // 模拟API调用 await new Promise((resolve) => setTimeout(resolve, 1000)) // 这里应该是实际的API调用 // const response = await fetch('/api/achievements') // const data = await response.json() // 使用模拟数据 const mockData = [ { id: "1", name: "初次见面", description: "第一次与洛天依对话", icon: "message-circle", category: "互动", requirement: "与洛天依进行第一次对话", rewardType: "经验值", rewardAmount: 100, rewardIcon: "zap", isHidden: false, unlockRate: 98.5, createdAt: "2023-01-01", updatedAt: "2023-01-01", }, { id: "2", name: "亲密无间", description: "与洛天依好感度达到80", icon: "heart", category: "好感度", requirement: "将洛天依的好感度提升至80", rewardType: "虚拟币", rewardAmount: 500, rewardIcon: "coins", isHidden: false, unlockRate: 45.2, createdAt: "2023-01-02", updatedAt: "2023-01-02", }, { id: "3", name: "形影不离", description: "与洛天依好感度达到100", icon: "heart-handshake", category: "好感度", requirement: "将洛天依的好感度提升至100", rewardType: "称号", rewardAmount: 1, rewardIcon: "badge", isHidden: false, unlockRate: 12.8, createdAt: "2023-01-03", updatedAt: "2023-01-03", }, { id: "4", name: "热情如火", description: "与洛天依单日互动达到50次", icon: "flame", category: "互动", requirement: "在一天内与洛天依互动50次", rewardType: "好感度", rewardAmount: 20, rewardIcon: "heart", isHidden: false, unlockRate: 23.7, createdAt: "2023-01-04", updatedAt: "2023-01-04", }, { id: "5", name: "坚持不懈", description: "连续7天与洛天依互动", icon: "calendar-check", category: "互动", requirement: "连续7天每天至少与洛天依互动1次", rewardType: "道具", rewardAmount: 1, rewardIcon: "gift", isHidden: false, unlockRate: 34.1, createdAt: "2023-01-05", updatedAt: "2023-01-05", }, { id: "6", name: "时尚达人", description: "收集10套服装", icon: "shirt", category: "收集", requirement: "收集10套不同的服装", rewardType: "服装", rewardAmount: 1, rewardIcon: "shirt", isHidden: false, unlockRate: 56.3, createdAt: "2023-01-06", updatedAt: "2023-01-06", }, { id: "7", name: "音乐鉴赏家", description: "收听20首不同的歌曲", icon: "music", category: "收集", requirement: "收听20首不同的歌曲", rewardType: "虚拟币", rewardAmount: 300, rewardIcon: "coins", isHidden: false, unlockRate: 42.9, createdAt: "2023-01-07", updatedAt: "2023-01-07", }, { id: "8", name: "舞动青春", description: "观看10支不同的舞蹈", icon: "footprints", category: "收集", requirement: "观看10支不同的舞蹈表演", rewardType: "经验值", rewardAmount: 200, rewardIcon: "zap", isHidden: false, unlockRate: 38.5, createdAt: "2023-01-08", updatedAt: "2023-01-08", }, { id: "9", name: "美食家", description: "收集15种不同的食物", icon: "utensils", category: "收集", requirement: "收集15种不同的食物", rewardType: "道具", rewardAmount: 1, rewardIcon: "gift", isHidden: false, unlockRate: 27.4, createdAt: "2023-01-09", updatedAt: "2023-01-09", }, { id: "10", name: "隐藏的秘密", description: "发现洛天依的秘密", icon: "sparkles", category: "隐藏", requirement: "???", rewardType: "称号", rewardAmount: 1, rewardIcon: "badge", isHidden: true, unlockRate: 5.2, createdAt: "2023-01-10", updatedAt: "2023-01-10", }, ] setAchievements(mockData) } catch (error) { console.error("获取成就列表失败:", error) toast({ title: "获取失败", description: "获取成就列表时发生错误", variant: "destructive", }) } finally { setLoading(false) } } const handleDeleteAchievement = async (id: string) => { try { // 模拟API调用 await new Promise((resolve) => setTimeout(resolve, 1000)) // 更新本地状态 setAchievements((prev) => prev.filter((achievement) => achievement.id !== id)) toast({ title: "删除成功", description: "成就已成功删除", }) } catch (error) { toast({ title: "删除失败", description: "删除成就时发生错误", variant: "destructive", }) } } const getCategoryColor = (category: string) => { switch (category) { case "互动": return "bg-blue-500" case "好感度": return "bg-pink-500" case "收集": return "bg-purple-500" case "探索": return "bg-green-500" case "特殊": return "bg-amber-500" case "隐藏": return "bg-gray-500" default: return "bg-gray-500" } } const getRewardIcon = (rewardType: string) => { switch (rewardType) { case "经验值": return case "好感度": return case "虚拟币": return case "道具": return case "服装": return case "称号": return default: return } } // 过滤成就 const filteredAchievements = achievements.filter((achievement) => { // 搜索过滤 const matchesSearch = searchQuery === "" || achievement.name.toLowerCase().includes(searchQuery.toLowerCase()) || achievement.description.toLowerCase().includes(searchQuery.toLowerCase()) // 标签过滤 const matchesTab = activeTab === "all" || (activeTab === "hidden" && achievement.isHidden) || achievement.category === activeTab return matchesSearch && matchesTab }) return (
setSearchQuery(e.target.value)} />
setActiveTab("all")}>全部成就 setActiveTab("互动")}>互动成就 setActiveTab("好感度")}>好感度成就 setActiveTab("收集")}>收集成就 setActiveTab("探索")}>探索成就 setActiveTab("特殊")}>特殊成就 setActiveTab("hidden")}>隐藏成就 按名称排序 按解锁率排序 按创建日期排序
全部 互动 好感度 收集 探索 特殊 隐藏
{loading ? ( // 加载状态 Array(6) .fill(null) .map((_, i) => (
)) ) : filteredAchievements.length > 0 ? ( filteredAchievements.map((achievement) => (

{achievement.name}

{achievement.category} {achievement.isHidden && 隐藏}
编辑 handleDeleteAchievement(achievement.id)} trigger={
删除
} />

{achievement.description}

解锁率 {achievement.unlockRate}%
奖励:
{getRewardIcon(achievement.rewardType)} {achievement.rewardAmount} {achievement.rewardType}
{}} />
)) ) : (

未找到成就

没有符合当前筛选条件的成就

)}
) }