"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 { getMyPlayer, getMyShop, getShopIncomeStats, listOrders } from "@/lib/api" import { statusLabels } from "@/lib/constants" import type { Player, 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 [orders, setOrders] = useState>>([]) const [monthlyIncome, setMonthlyIncome] = useState("0") const recentOrders = orders.slice(0, 3) useEffect(() => { if (!user?.id) { setPlayer(null) setShop(null) return } let cancelled = false Promise.all([getMyPlayer(), getMyShop()]) .then(([player, shop]) => { if (cancelled) return setPlayer(player ?? null) setShop(shop ?? null) }) .catch(() => { if (cancelled) return setPlayer(null) setShop(null) }) 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.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 && ( 快捷操作 )}
) }