"use client" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { EmptyState } from "@/components/ui/empty-state" import { Progress } from "@/components/ui/progress" import { StatusBadge, type StatusBadgeProps } from "@/components/ui/status-badge" import { getShopIncomeStats, listOrders, listPlayers, listServices, listShops } from "@/lib/api" import { statusLabels } from "@/lib/constants" import type { Player, PlayerService, Shop } from "@/lib/types" import { useAuthStore } from "@/store/auth" import { CheckCircle, Clock, DollarSign, ListOrdered, Star, TrendingUp, Users } from "lucide-react" import Link from "next/link" import { useEffect, useState } from "react" const orderStatusVariants: Record = { pending_payment: "warning", pending_accept: "info", in_progress: "success", pending_close: "info", pending_review: "info", disputed: "destructive", completed: "success", cancelled: "neutral", } function getOrderRole(role: "consumer" | "player" | "owner" | "admin") { if (role === "consumer" || role === "player" || role === "owner") { return role } return undefined } export default function DashboardPage() { const { currentRole, user } = useAuthStore() const isOwner = currentRole === "owner" const orderRole = getOrderRole(currentRole) const [player, setPlayer] = useState(null) const [shop, setShop] = useState(null) const [services, setServices] = useState([]) const [orders, setOrders] = useState>>([]) const [monthlyIncome, setMonthlyIncome] = useState("0") const recentOrders = orders.slice(0, 3) useEffect(() => { let cancelled = false Promise.all([listPlayers(), listShops(), listServices()]) .then(([players, shops, services]) => { if (cancelled) return setPlayer(players.find((item) => item.user.id === user?.id) ?? null) setShop(shops.find((item) => item.owner.id === user?.id) ?? null) setServices(services) }) .catch(() => { if (cancelled) return setPlayer(null) setShop(null) setServices([]) }) return () => { cancelled = true } }, [user?.id]) useEffect(() => { let cancelled = false void (async () => { try { if (!orderRole) { setOrders([]) return } const orders = await Promise.resolve(listOrders({ role: orderRole })) if (cancelled) return setOrders(orders) } catch { if (cancelled) return setOrders([]) } })() return () => { cancelled = true } }, [orderRole]) useEffect(() => { if (!shop) { setMonthlyIncome("0") return } let cancelled = false getShopIncomeStats(shop.id) .then((stats) => { if (cancelled) return setMonthlyIncome(stats.monthlyIncome) }) .catch(() => { if (cancelled) return setMonthlyIncome("0") }) return () => { cancelled = true } }, [shop]) const totalOrders = isOwner ? (shop?.totalOrders ?? 0) : (player?.totalOrders ?? 0) const rating = isOwner ? (shop?.rating ?? 0) : (player?.rating ?? 0) const playerCount = shop?.playerCount ?? 0 const completionRate = player?.completionRate ?? 0 const serviceCount = player ? services.filter((service) => String(service.playerId) === String(player.id)).length : 0 return (

概览

总订单
{totalOrders}
评分
{rating}
{isOwner ? "签约打手" : "完成率"} {isOwner ? ( ) : ( )} {isOwner ? (
{playerCount}
) : (
{(completionRate * 100).toFixed(0)}%
)}
{isOwner ? "本月收入" : "服务数"} {isOwner ? ( ) : ( )}
{isOwner ? `¥${monthlyIncome}` : serviceCount}
最近订单 {recentOrders.length > 0 ? (
{recentOrders.map((order) => (

{order.service.title}

{order.service.title}

¥{order.totalPrice} {statusLabels[order.status]}
))}
) : ( )}
{!isOwner && ( 快捷操作 )}
) }