"use client"; import { useState } from "react"; import { FLOCK_UI } from "@/lib/flock/ui-labels"; import type { FlockDisplayLine } from "@/modules/flock/quote-storage"; import type { FlockCarrierOption, FlockCheckoutTier, FlockFlexibilityKey, FlockFlexibilityOption, FlockPricingOptionsType, } from "@/lib/flock/flock-checkout-selection"; import { flockFlexibilityKeyLabel } from "@/lib/flock/flock-checkout-selection"; import { ErrorBanner } from "@/components/ui/error-banner"; import { LoadingSpinner } from "@/components/ui/loading-spinner"; export type FlockLoggedInQuoteSidebarStep = "select" | "details"; export type FlockFlexibilityByTier = Partial< Record >; export type FlockCarriersByTier = Partial< Record >; export interface FlockLoggedInQuoteSidebarProps { lines: FlockDisplayLine[]; reference?: string | null; /** 首价同步的两侧灵活性价 */ flexibilityByTier?: FlockFlexibilityByTier; /** 首价同步的承运商列表(Standard LTL) */ carriersByTier?: FlockCarriersByTier; selectedTier: FlockCheckoutTier | null; selectedFlexibility?: FlockFlexibilityKey | null; selectedCarrier?: string | null; flexBusy?: boolean; flexMessage?: string | null; checkoutBusy?: boolean; checkoutMessage?: string | null; /** 已确认继续填写二级(或无 hold)后可结账 */ detailsUnlocked?: boolean; onSelectTier: (tier: FlockCheckoutTier) => void; onSelectFlexibility: (key: FlockFlexibilityKey) => void; onSelectCarrier: (carrierName: string) => void; onCheckout: () => void; onReset?: () => void; } function formatUsd(n: number): string { return n.toLocaleString("en-US", { style: "currency", currency: "USD", maximumFractionDigits: 0, }); } function formatUsdExact(n: number): string { return n.toLocaleString("en-US", { style: "currency", currency: "USD", minimumFractionDigits: 2, maximumFractionDigits: 2, }); } function FeatureRow({ ok, text, }: { ok: boolean; text: string; }) { return (
  • {ok ? "✓" : "×"} {text}
  • ); } function PricingOptionsModal({ tier, reference, optionsType, options, carrierOptions, selectedFlexibility, selectedCarrier, busy, message, onClose, onSelectFlexibility, onSelectCarrier, }: { tier: FlockCheckoutTier; reference?: string | null; optionsType: FlockPricingOptionsType; options: FlockFlexibilityOption[]; carrierOptions: FlockCarrierOption[]; selectedFlexibility?: FlockFlexibilityKey | null; selectedCarrier?: string | null; busy?: boolean; message?: string | null; onClose: () => void; onSelectFlexibility: (key: FlockFlexibilityKey) => void; onSelectCarrier: (carrierName: string) => void; }) { const tierName = tier === "flock_direct" ? FLOCK_UI.directName : FLOCK_UI.standardName; const isCarriers = optionsType === "carriers"; const empty = !busy && (isCarriers ? carrierOptions.length === 0 : options.length === 0); return (

    {reference ? `#${reference} ${FLOCK_UI.pricingOptionsHeading}` : FLOCK_UI.pricingOptionsHeading}

    {isCarriers ? FLOCK_UI.selectPreferredCarrier : FLOCK_UI.isPickupFlexible}

    {!isCarriers ? (
    {tierName}
    ) : null} {busy ? (
    {message || (isCarriers ? "正在加载承运商报价…" : "正在加载灵活性报价…")}
    ) : null} {empty ? (

    {message || (isCarriers ? "暂无承运商报价,请稍后重试" : "暂无该档灵活性报价,请稍后重试")}

    ) : null} {!busy && !isCarriers && options.length > 0 ? (
    {FLOCK_UI.flexColFlexibility} {FLOCK_UI.flexColPickup} {FLOCK_UI.flexColDeliver} {FLOCK_UI.flexColRate}
      {options.map((opt) => { const active = selectedFlexibility === opt.key; return (
    • ); })}
    ) : null} {!busy && isCarriers && carrierOptions.length > 0 ? (
    {FLOCK_UI.carrierColName} {FLOCK_UI.carrierColTransit} {FLOCK_UI.carrierColPickup} {FLOCK_UI.carrierColDeliver} {FLOCK_UI.carrierColRate} {FLOCK_UI.carrierSelect}
      {carrierOptions.map((opt) => { const active = selectedCarrier === opt.carrierName; return (
    • ); })}
    ) : null}
    ); } /** 右栏:对齐官网 — 双卡「查看报价选项」→ 弹窗选灵活价或承运商 */ export function FlockLoggedInQuoteSidebar({ lines, reference, flexibilityByTier = {}, carriersByTier = {}, selectedTier, selectedFlexibility = null, selectedCarrier = null, flexBusy = false, flexMessage = null, checkoutBusy = false, checkoutMessage = null, detailsUnlocked = false, onSelectTier, onSelectFlexibility, onSelectCarrier, onCheckout, onReset, }: FlockLoggedInQuoteSidebarProps) { const [pricingModalTier, setPricingModalTier] = useState(null); const direct = lines.find((l) => l.tier === "flock_direct"); const standard = lines.find((l) => l.tier === "standard"); const selectedFlexOptions = (selectedTier && flexibilityByTier[selectedTier]) || []; const selectedCarrierOptions = (selectedTier && carriersByTier[selectedTier]) || []; const selectedFlex = selectedFlexOptions.find( (o) => o.key === selectedFlexibility, ); const selectedCarrierOpt = selectedCarrierOptions.find( (o) => o.carrierName === selectedCarrier, ); const checkoutAmount = selectedFlex?.rateUsd ?? selectedCarrierOpt?.rateUsd ?? (selectedTier === "flock_direct" ? direct?.final_total_usd : selectedTier === "standard" ? standard?.final_total_usd : undefined); const hasSelection = Boolean(selectedFlexibility || selectedCarrier); const canCheckout = detailsUnlocked && !!selectedTier && hasSelection && !checkoutBusy; const openPricing = (tier: FlockCheckoutTier) => { onSelectTier(tier); setPricingModalTier(tier); }; const modalFlexOptions = pricingModalTier != null ? (flexibilityByTier[pricingModalTier] ?? []) : []; const modalCarrierOptions = pricingModalTier != null ? (carriersByTier[pricingModalTier] ?? []) : []; const modalOptionsType: FlockPricingOptionsType = modalCarrierOptions.length > 0 && modalFlexOptions.length === 0 ? "carriers" : "flexibility"; return ( ); }