"use client"; import { useEffect, useMemo, useState } from "react"; import { CheckCircle, Database, ClockClockwise } from "@phosphor-icons/react"; import type { QuoteDetail, QuoteItem, RateOption, ServiceLevel, } from "@/lib/frontend/types"; import { formatUSD, formatPercent } from "@/lib/frontend/format"; import { Card } from "@/components/ui/card"; const LEVEL_LABEL: Record = { standard: "标准", guaranteed: "保证送达", }; const RATE_LABEL: Record = { lowest: "最低价", fastest: "最快", bestValue: "最优性价比", }; const RATE_ORDER: RateOption[] = ["lowest", "bestValue", "fastest"]; interface QuoteCardProps { quote: QuoteDetail; defaultLevel?: ServiceLevel; defaultRate?: RateOption; } function findTier( quotes: QuoteItem[], level: ServiceLevel, rate: RateOption, ): QuoteItem | undefined { return quotes.find( (q) => q.service_level === level && q.rate_option === rate, ); } function SourceBadge({ quote }: { quote: QuoteDetail }) { if (quote.source_type === "cache") { return ( 缓存命中 ); } if (quote.source_type === "stale") { return ( 非实时 ); } return ( 实时报价 ); } export function QuoteCard({ quote, defaultLevel = "standard", defaultRate = "lowest", }: QuoteCardProps) { const [level, setLevel] = useState(defaultLevel); const [rate, setRate] = useState(defaultRate); const quotes = quote.quotes ?? []; const item = findTier(quotes, level, rate) ?? quotes[0]; const availableRates = useMemo( () => RATE_ORDER.filter((rt) => quotes.some((q) => q.service_level === level && q.rate_option === rt), ), [quotes, level], ); useEffect(() => { if (availableRates.length > 0 && !availableRates.includes(rate)) { setRate(availableRates[0]!); } }, [availableRates, rate]); if (!item) { return (

暂无报价数据

); } return ( {!quote.is_realtime && ( 非实时报价,仅供参考 )}
{(["standard", "guaranteed"] as ServiceLevel[]).map((lv) => ( ))}
{availableRates.map((rt) => ( ))}

{item.carrier} · {item.transit_description}

{formatUSD(item.final_total)}

时效 {item.transit_days} 天

原价 {formatUSD(item.raw_total)}

价格明细

    {item.breakdown.map((b) => (
  • {b.item} {formatUSD(b.amount)}
  • ))}
  • 客户最终价(加价 {formatPercent(item.markup_percent)}) {formatUSD(item.final_total)}

单号 {quote.quote_id}

); }