"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 { StatusBadge, type StatusBadgeProps } from "@/components/ui/status-badge" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table" import { listOrders } from "@/lib/api" import { statusLabels } from "@/lib/constants" import { isActiveOrder, isCompletedOrder, isDisputedOrder } from "@/lib/domain/order-filters" import { toApiError } from "@/lib/errors" import { useMyShop } from "@/lib/hooks/use-my-shop" import { notifyInfo } from "@/lib/toast" import { AlertCircle, CheckCircle, Clock, ListOrdered } from "lucide-react" import Link from "next/link" import { useEffect, useMemo, 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", } export default function ShopOrdersPage() { const { shop, loading, error } = useMyShop() const [orders, setOrders] = useState>>([]) const [ordersLoading, setOrdersLoading] = useState(true) useEffect(() => { if (!shop) return let cancelled = false listOrders({ role: "owner" }) .then((items) => { if (cancelled) return setOrders(items) }) .catch((error) => { if (cancelled) return notifyInfo(toApiError(error).msg) }) .finally(() => { if (cancelled) return setOrdersLoading(false) }) return () => { cancelled = true } }, [shop]) const shopOrders = useMemo( () => (shop ? orders.filter((order) => order.shopId === shop.id) : []), [orders, shop], ) if (loading) { return (
) } if (error) { return (
) } if (!shop) { return (
) } const totalOrders = shopOrders.length const activeOrders = shopOrders.filter((o) => isActiveOrder(o.status)).length const completedOrders = shopOrders.filter((o) => isCompletedOrder(o.status)).length const disputedOrders = shopOrders.filter((o) => isDisputedOrder(o.status)).length return (

订单总览

总订单
{totalOrders}
进行中
{activeOrders}
已完成
{completedOrders}
争议订单
{disputedOrders}
订单列表 服务名称 客户 打手 状态 金额 创建时间 操作 {ordersLoading ? ( ) : shopOrders.length === 0 ? ( ) : ( shopOrders.map((order) => ( {order.service.title} {order.consumerId} {order.playerId} {statusLabels[order.status]} ¥{order.totalPrice} {new Date(order.createdAt).toLocaleDateString()} )) )}
) }