"use client" import { AlertTriangle, ArrowLeft, Clock, FileText, Upload, X } from "lucide-react" import Image from "next/image" import Link from "next/link" import { useRouter, useSearchParams } from "next/navigation" import { type ChangeEvent, use, useEffect, useRef, useState } from "react" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Label } from "@/components/ui/label" import { Separator } from "@/components/ui/separator" import { Textarea } from "@/components/ui/textarea" import { mockDisputes, mockOrders } from "@/lib/mock" const disputeStatusLabels: Record = { open: "已提交", reviewing: "审核中", resolved: "已解决", appealed: "申诉中", } export default function DisputePage({ params }: { params: Promise<{ id: string }> }) { const { id } = use(params) const router = useRouter() const searchParams = useSearchParams() const order = mockOrders.find((o) => o.id === id) const existingDispute = mockDisputes.find((d) => d.orderId === id) const [reason, setReason] = useState("") const [submitted, setSubmitted] = useState(false) const [files, setFiles] = useState([]) const fileInputRef = useRef(null) const filesRef = useRef([]) useEffect(() => { filesRef.current = files }, [files]) useEffect( () => () => { filesRef.current.forEach((url) => { URL.revokeObjectURL(url) }) }, [], ) const handleFileSelect = (event: ChangeEvent) => { const selectedFiles = event.target.files if (!selectedFiles?.length) return setFiles((prev) => { const remaining = 5 - prev.length if (remaining <= 0) return prev const nextUrls = Array.from(selectedFiles) .slice(0, remaining) .map((file) => URL.createObjectURL(file)) return [...prev, ...nextUrls] }) event.target.value = "" } const handleRemoveFile = (index: number) => { setFiles((prev) => { const removed = prev[index] if (removed) URL.revokeObjectURL(removed) return prev.filter((_, currentIndex) => currentIndex !== index) }) } const handleSubmit = () => { setSubmitted(true) router.replace(`/dispute/${id}?submitted=1`) } const showSubmitted = submitted || searchParams.get("submitted") === "1" if (!order) { return (
订单不存在
) } if (existingDispute) { return (
返回订单
争议详情 {disputeStatusLabels[existingDispute.status]}
发起人: {existingDispute.initiatorName}
提交时间: {new Date(existingDispute.createdAt).toLocaleString("zh-CN")}

{existingDispute.reason}

{existingDispute.evidence.length > 0 && (
{existingDispute.evidence.map((url) => (
证据截图
))}
)} {existingDispute.result && ( <>

{existingDispute.result === "full_refund" ? "全额退款" : existingDispute.result === "full_payment" ? "全额支付给打手" : "部分退款"}

)}
) } if (showSubmitted) { return (

争议已提交,请等待平台处理

平台将在 3 个工作日内审核你的争议申请。

返回订单详情
) } return (
返回订单 发起争议

{order.service.title} · {order.playerName}