"use client" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { EmptyState } from "@/components/ui/empty-state" import { StatusBadge } from "@/components/ui/status-badge" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { listChatSessions, listOrders } from "@/lib/api" import { statusLabels } from "@/lib/constants" import { isActiveOrder, isCompletedOrder, isDisputedOrder, isPendingDispatch, } from "@/lib/domain/order-filters" import { useMyShop } from "@/lib/hooks/use-my-shop" import type { OrderStatus, UserRole } from "@/lib/types" import { useAuthStore } from "@/store/auth" import { ClipboardList, Clock, MessageSquare, RefreshCw } from "lucide-react" import Link from "next/link" import { useEffect, useState } from "react" 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", } type TabFilter = "all" | "active" | "completed" | "disputed" const consumerTabs = [ { value: "all", label: "全部" }, { value: "active", label: "进行中" }, { value: "completed", label: "已完成" }, { value: "disputed", label: "争议" }, ] const playerTabs = [ { value: "all", label: "全部" }, { value: "pending", label: "待接单" }, { value: "active", label: "进行中" }, { value: "completed", label: "已完成" }, ] const ownerTabs = [ { value: "all", label: "全部" }, { value: "pending", label: "待派单" }, { value: "active", label: "进行中" }, { value: "completed", label: "已完成" }, { value: "disputed", label: "争议" }, ] function getOrderRole(role: UserRole): "consumer" | "player" | "owner" | undefined { if (role === "consumer" || role === "player" || role === "owner") { return role } return undefined } export default function OrderListPage() { const { currentRole, user } = useAuthStore() const { shop: ownerShop, loading: shopLoading, error: shopError, } = useMyShop(currentRole === "owner") if (currentRole === "owner" && shopLoading) { return (
) } if (currentRole === "owner" && shopError) { return (
) } return ( ) } function OrderListContent({ currentRole, userId, ownerShopId, }: { currentRole: UserRole userId?: string ownerShopId?: string }) { const orderRole = getOrderRole(currentRole) const [tab, setTab] = useState("all") const [orders, setOrders] = useState>>([]) const [sessions, setSessions] = useState>>([]) useEffect(() => { let cancelled = false if (!orderRole) { return () => { cancelled = true } } void (async () => { try { const items = await Promise.resolve(listOrders({ role: orderRole })) if (cancelled) return setOrders(items) } catch { if (cancelled) return setOrders([]) } })() return () => { cancelled = true } }, [orderRole]) useEffect(() => { let cancelled = false void (async () => { try { const items = await Promise.resolve(listChatSessions()) if (cancelled) return setSessions(items) } catch { if (cancelled) return setSessions([]) } })() return () => { cancelled = true } }, []) const tabs = currentRole === "consumer" ? consumerTabs : currentRole === "player" ? playerTabs : ownerTabs const roleFiltered = orders.filter((order) => { if (currentRole === "consumer") return userId ? order.consumerId === userId : false if (currentRole === "player") return userId ? order.playerId === userId : false return ownerShopId ? order.shopId === ownerShopId : false }) const filtered = roleFiltered.filter((order) => { if (tab === "pending") return isPendingDispatch(order.status) if (tab === "active") return isActiveOrder(order.status) if (tab === "completed") return isCompletedOrder(order.status, { includeCancelled: true }) if (tab === "disputed") return isDisputedOrder(order.status) return true }) return (

我的订单

{currentRole === "consumer" ? "客户视角" : currentRole === "player" ? "打手视角" : currentRole === "owner" ? "店主视角" : "管理员视角"}
{!orderRole ? ( ) : ( setTab(v as TabFilter | "pending")}> {tabs.map((item) => ( {item.label} ))} {filtered.length === 0 ? ( ) : ( filtered.map((order) => (
{order.service.title} {statusLabels[order.status]}

{order.service.title}

¥{order.totalPrice} {new Date(order.createdAt).toLocaleDateString("zh-CN")}
{(() => { if (order.status !== "in_progress" && order.status !== "pending_close") { return null } const session = sessions.find( (item) => item.type === "order" && item.orderId === order.id, ) if (!session) return null return ( ) })()} {order.status === "completed" && ( )}
)) )}
)}
) }