"use client" import OrderActions from "@/components/order-actions" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { EmptyState } from "@/components/ui/empty-state" import { Separator } from "@/components/ui/separator" import { StatusBadge } from "@/components/ui/status-badge" import { getOrderById, getPlayerById, getUserById, listReviewsByOrder } from "@/lib/api" import { statusLabels } from "@/lib/constants" import type { OrderStatus, Player, User } from "@/lib/types" import { useAuthStore } from "@/store/auth" import { ArrowLeft, CheckCircle, Clock, Star } from "lucide-react" import Link from "next/link" import { use, useEffect, useState } from "react" const normalStatusSteps: OrderStatus[] = [ "pending_payment", "pending_accept", "in_progress", "pending_close", "pending_review", "completed", ] const disputedStatusSteps: OrderStatus[] = [ "pending_payment", "pending_accept", "in_progress", "pending_close", "disputed", ] const cancelledStatusSteps: OrderStatus[] = ["pending_payment", "pending_accept", "cancelled"] type OrderStatusBadgeVariant = "success" | "warning" | "info" | "neutral" | "destructive" const statusVariants: Record = { pending_payment: "warning", pending_accept: "info", in_progress: "success", pending_close: "info", pending_review: "info", disputed: "destructive", completed: "success", cancelled: "neutral", } export default function OrderDetailPage({ params }: { params: Promise<{ id: string }> }) { const { id } = use(params) const currentUserId = useAuthStore((state) => state.user?.id) const [reviews, setReviews] = useState>>([]) const [chatTarget, setChatTarget] = useState(null) const [player, setPlayer] = useState(null) const [order, setOrder] = useState> | undefined>( undefined, ) const [loading, setLoading] = useState(true) useEffect(() => { let cancelled = false void (async () => { try { setLoading(true) const order = await Promise.resolve(getOrderById(id)) if (cancelled) return setOrder(order) setLoading(false) } catch { if (cancelled) return setOrder(undefined) setLoading(false) } })() return () => { cancelled = true } }, [id]) useEffect(() => { let cancelled = false void (async () => { if (!order || !currentUserId) { setPlayer(null) setChatTarget(null) return } try { setPlayer(null) setChatTarget(null) const player = await getPlayerById(String(order.playerId)) if (!cancelled) setPlayer(player ?? null) if (String(order.consumerId) === currentUserId) { if (!cancelled) setChatTarget(player?.user ?? null) return } if (player?.user.id === currentUserId) { const consumer = await getUserById(String(order.consumerId)) if (!cancelled) setChatTarget(consumer ?? null) } } catch { if (!cancelled) setPlayer(null) if (!cancelled) setChatTarget(null) } })() return () => { cancelled = true } }, [currentUserId, order]) useEffect(() => { let cancelled = false void (async () => { try { const reviews = await Promise.resolve(listReviewsByOrder(id)) if (cancelled) return setReviews(reviews) } catch { if (cancelled) return setReviews([]) } })() return () => { cancelled = true } }, [id]) if (loading) { return (
) } if (!order) { return (
) } const statusSteps = order.status === "disputed" ? disputedStatusSteps : order.status === "cancelled" ? cancelledStatusSteps : normalStatusSteps const currentStepIndex = statusSteps.indexOf(order.status) const isPlayerParticipant = player?.user.id === currentUserId return (
返回订单列表

订单详情

{statusLabels[order.status]}
{statusSteps.map((step, i) => { const isActive = i <= currentStepIndex const isCurrent = i === currentStepIndex return (
{isActive ? : i + 1}
{statusLabels[step]}
) })}
服务信息
服务 {order.service.title}
游戏 {order.service.gameName}
单价 ¥{order.service.price}/{order.service.unit}
打手 {order.service.title}
总价 ¥{order.totalPrice}
{order.note && (
备注: {order.note}
)}
时间线
下单时间: {new Date(order.createdAt).toLocaleString("zh-CN")}
{order.acceptedAt && (
接单时间: {new Date(order.acceptedAt).toLocaleString("zh-CN")}
)} {order.completedAt && (
完成时间: {new Date(order.completedAt).toLocaleString("zh-CN")}
)}
{reviews.length > 0 && ( 评价 {reviews.map((review) => (
{review.fromUserName}
{[1, 2, 3, 4, 5].map((star) => ( ))}
{review.sealed ? (

评价已提交,待揭晓

) : ( review.content && (

{review.content}

) )}

{new Date(review.createdAt).toLocaleDateString("zh-CN")}

))}
)} setOrder(next)} initialStatus={order.status} chatTargetId={chatTarget?.id} isPlayerParticipant={isPlayerParticipant} serviceId={order.service.id} />
) }