From 977d19ed5c7a4a2b13418dfc211f4fb4f12c5cda Mon Sep 17 00:00:00 2001 From: zetaloop Date: Fri, 20 Feb 2026 22:45:38 +0800 Subject: [PATCH] feat: add executable actions to order flow --- app/(order)/order/[id]/page.tsx | 59 +++------------- app/(order)/order/new/page.tsx | 27 ++++++- app/(order)/orders/page.tsx | 8 ++- components/order-actions.tsx | 121 ++++++++++++++++++++++++++++++++ 4 files changed, 158 insertions(+), 57 deletions(-) create mode 100644 components/order-actions.tsx diff --git a/app/(order)/order/[id]/page.tsx b/app/(order)/order/[id]/page.tsx index dcfdf5a..a4453f4 100644 --- a/app/(order)/order/[id]/page.tsx +++ b/app/(order)/order/[id]/page.tsx @@ -1,17 +1,8 @@ -import { - AlertTriangle, - ArrowLeft, - CheckCircle, - Clock, - MessageSquare, - RefreshCw, - Star, - XCircle, -} from "lucide-react" +import { ArrowLeft, CheckCircle, Clock, Star } from "lucide-react" import Link from "next/link" import { notFound } from "next/navigation" +import OrderActions from "@/components/order-actions" import { Badge } from "@/components/ui/badge" -import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Separator } from "@/components/ui/separator" import { statusLabels } from "@/lib/constants" @@ -195,46 +186,12 @@ export default async function OrderDetailPage({ params }: { params: Promise<{ id )} -
- {order.status === "pending_accept" && ( - - )} - {(order.status === "in_progress" || order.status === "pending_close") && chatSession && ( - - )} - {order.status === "pending_review" && ( - - )} - {["in_progress", "pending_close"].includes(order.status) && ( - - )} - {order.status === "completed" && ( - - )} -
+ ) } diff --git a/app/(order)/order/new/page.tsx b/app/(order)/order/new/page.tsx index 9534859..a452b48 100644 --- a/app/(order)/order/new/page.tsx +++ b/app/(order)/order/new/page.tsx @@ -2,7 +2,7 @@ import { ArrowLeft, CheckCircle, CreditCard, ShieldCheck } from "lucide-react" import Link from "next/link" -import { useSearchParams } from "next/navigation" +import { useRouter, useSearchParams } from "next/navigation" import { useState } from "react" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { Button } from "@/components/ui/button" @@ -11,10 +11,16 @@ import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Separator } from "@/components/ui/separator" import { Textarea } from "@/components/ui/textarea" -import { mockPlayers, mockServices, walletBalance } from "@/lib/mock-data" +import { mockOrders, mockPlayers, mockServices, walletBalance } from "@/lib/mock-data" import { useRequireAuth } from "@/lib/use-require-auth" +function showFeedback(message: string) { + if (typeof window === "undefined") return + window.alert(message) +} + export default function NewOrderPage() { + const router = useRouter() const searchParams = useSearchParams() const { requireAuth } = useRequireAuth() const serviceId = searchParams.get("serviceId") @@ -35,6 +41,8 @@ export default function NewOrderPage() { } const totalPrice = service.price * quantity + const redirectOrderId = + mockOrders.find((order) => order.service.id === service.id)?.id ?? mockOrders[0]?.id if (submitted) { return ( @@ -170,7 +178,20 @@ export default function NewOrderPage() { className="w-full" size="lg" disabled={walletBalance < totalPrice} - onClick={() => requireAuth(() => setSubmitted(true))} + onClick={() => + requireAuth(async () => { + await new Promise((resolve) => setTimeout(resolve, 500)) + setSubmitted(true) + showFeedback("下单成功") + if (redirectOrderId) { + setTimeout(() => { + router.push(`/order/${redirectOrderId}`) + }, 800) + return + } + router.push("/orders") + }) + } > 确认支付 ¥{totalPrice} diff --git a/app/(order)/orders/page.tsx b/app/(order)/orders/page.tsx index c7749ec..668ce9f 100644 --- a/app/(order)/orders/page.tsx +++ b/app/(order)/orders/page.tsx @@ -145,9 +145,11 @@ export default function OrderListPage() { ) })()} {order.status === "completed" && ( - )} + + + )} + + {(status === "in_progress" || status === "pending_close") && chatSessionId && ( + + )} + + {status === "in_progress" && ( + <> + + + + )} + + {status === "pending_close" && ( + <> + + + + )} + + {status === "pending_review" && ( + + )} + + {status === "completed" && ( + + )} + + ) +}