"use client"; import { use, useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useQuery } from "@tanstack/react-query"; import { Button, Chip, Modal, Spinner } from "@heroui/react"; import { ArrowLeft, ArrowRotateRight, TrashBin } from "@gravity-ui/icons"; import { APIError, api } from "@/lib/api"; import { useSession } from "@/lib/auth-client"; import dayjs from "@/lib/dayjs"; function formatDuration(start: string, stop: string | null): string { if (!stop) return "进行中"; const min = dayjs(stop).diff(dayjs(start), "minute"); if (min < 60) return `${min} 分钟`; const h = Math.floor(min / 60); const m = min % 60; return `${h}h ${m}m`; } function formatDateTime(iso: string | null | undefined): string { if (!iso) return "—"; return dayjs(iso).format("YYYY/M/D HH:mm:ss"); } function formatEnergy(wh: number | null | undefined): string { if (wh == null) return "—"; return `${(wh / 1000).toFixed(3)} kWh`; } function formatAmount(fen: number | null | undefined): string { if (fen == null) return "—"; return `¥${(fen / 100).toFixed(2)}`; } export default function TransactionDetailPage({ params }: { params: Promise<{ id: string }> }) { const { id } = use(params); const router = useRouter(); const txId = Number(id); const isValidId = Number.isInteger(txId) && txId > 0; const [stopping, setStopping] = useState(false); const [deleting, setDeleting] = useState(false); const { data: sessionData } = useSession(); const isAdmin = sessionData?.user?.role === "admin"; const { data: tx, isPending, isFetching, isError, error, refetch, } = useQuery({ queryKey: ["transaction", txId], queryFn: () => api.transactions.get(txId), enabled: isValidId, refetchInterval: 3_000, retry: false, }); const handleStop = async () => { if (!tx) return; setStopping(true); try { await api.transactions.stop(tx.id); await refetch(); } finally { setStopping(false); } }; const handleDelete = async () => { if (!tx) return; setDeleting(true); try { await api.transactions.delete(tx.id); router.push("/dashboard/transactions"); } finally { setDeleting(false); } }; if (!isValidId) { return (
无效的交易编号。
{notFound ? "交易记录不存在。" : "加载交易记录失败。"}
开始于 {formatDateTime(tx.startTimestamp)} · {tx.stopTimestamp ? "时长 " : ""} {formatDuration(tx.startTimestamp, tx.stopTimestamp)}
将远程中止充电交易{" "} #{tx.id}。
将永久删除交易 #{tx.id}。
充电量
{formatEnergy(energyWh)}
{isEstimatedEnergy && ( 预估 )}总费用
{formatAmount(amountFen)}
{isEstimatedAmount && ( 预估 )}状态
{tx.stopTimestamp ? "已完成" : "进行中"}
停止原因
{tx.stopReason ?? "—"}
交易信息
计量与费用