"use client"; import { useImperativeHandle, forwardRef, useState, type ReactNode } from "react"; import { FLOCK_CHECKOUT_FIELD_HINTS, FLOCK_CHECKOUT_HOURS, FLOCK_CHECKOUT_ROLE_OPTIONS, emptyFlockCheckoutDetailsDraft, flockDetailsHasErrors, toFlockCheckoutApiDetails, validateFlockCheckoutDetailsDraft, type FlockCheckoutDetailsDraft, type FlockCheckoutLocationDraft, type FlockCheckoutRole, type FlockDetailsFieldErrors, } from "@/lib/flock/flock-checkout-details-rules"; import { ErrorBanner } from "@/components/ui/error-banner"; export type FlockLoggedInDetailsFormHandle = { validateAndGetDetails: () => ReturnType< typeof toFlockCheckoutApiDetails > | null; }; type Props = { disabled?: boolean; pickupZip?: string; deliveryZip?: string; /** 首价货件摘要(只读),对齐官网 Shipment details 货件行 */ shipmentSummary?: string; }; const inputCls = "w-full rounded-md border border-border bg-surface px-3 py-2 text-sm text-text-primary outline-none focus:border-primary disabled:opacity-60"; const inputErrCls = "w-full rounded-md border border-error bg-surface px-3 py-2 text-sm text-text-primary outline-none focus:border-error disabled:opacity-60"; function Field({ label, required, error, hint, children, }: { label: string; required?: boolean; error?: string; hint?: string; children: ReactNode; }) { return ( ); } function LocationAddressFields({ side, loc, errors, disabled, addressLocked, onPatch, }: { side: "pickup" | "delivery"; loc: FlockCheckoutLocationDraft; errors?: Partial>; disabled?: boolean; addressLocked: boolean; onPatch: (patch: Partial) => void; }) { const locked = Boolean(disabled || addressLocked); return ( <> onPatch({ address1: e.target.value })} /> onPatch({ address2: e.target.value })} /> onPatch({ city: e.target.value })} /> onPatch({ state: e.target.value })} /> onPatch({ zip: e.target.value })} /> ); } /** 二级结账详情:对齐官网 Pickup / Delivery / Shipment details */ export const FlockLoggedInDetailsForm = forwardRef< FlockLoggedInDetailsFormHandle, Props >(function FlockLoggedInDetailsForm( { disabled = false, pickupZip = "", deliveryZip = "", shipmentSummary = "", }, ref, ) { const [draft, setDraft] = useState(() => emptyFlockCheckoutDetailsDraft({ pickupZip, deliveryZip }), ); const [errors, setErrors] = useState({}); const [formError, setFormError] = useState(null); useImperativeHandle(ref, () => ({ validateAndGetDetails: () => { const next = validateFlockCheckoutDetailsDraft(draft); setErrors(next); if (flockDetailsHasErrors(next)) { setFormError("请先修正结账详情中的必填项与格式错误"); return null; } setFormError(null); return toFlockCheckoutApiDetails(draft); }, })); const setRole = (role: FlockCheckoutRole) => { setDraft((d) => ({ ...d, role })); setErrors((e) => ({ ...e, role: undefined })); }; const patchPickup = (patch: Partial) => { setDraft((d) => ({ ...d, pickup: { ...d.pickup, ...patch } })); }; const patchDelivery = (patch: Partial) => { setDraft((d) => ({ ...d, delivery: { ...d.delivery, ...patch } })); }; return (

结账详情

{FLOCK_CHECKOUT_FIELD_HINTS.review}

{formError ? {formError} : null}

您的角色

{FLOCK_CHECKOUT_ROLE_OPTIONS.map((opt) => ( ))}
{errors.role ? (

{errors.role}

) : null}

提货地点

{FLOCK_CHECKOUT_FIELD_HINTS.useBilling}

patchPickup({ company_name: e.target.value })} /> patchPickup({ contact_name: e.target.value })} /> patchPickup({ contact_phone: e.target.value })} placeholder="(626) 595-1180" /> patchPickup({ contact_email: e.target.value })} />

派送地点

{FLOCK_CHECKOUT_FIELD_HINTS.useBilling}

patchDelivery({ company_name: e.target.value }) } /> patchDelivery({ contact_name: e.target.value }) } /> patchDelivery({ contact_phone: e.target.value }) } placeholder="(415) 621-8840" /> patchDelivery({ contact_email: e.target.value }) } />

该地点是否允许周末派送?

{([true, false] as const).map((yes) => ( ))}

{FLOCK_CHECKOUT_FIELD_HINTS.weekend}

运输详情

{shipmentSummary ? (

货件摘要

{shipmentSummary}

{FLOCK_CHECKOUT_FIELD_HINTS.shipmentItems}

) : null}
setDraft((d) => ({ ...d, nmfc: e.target.value })) } placeholder="如 100240-01" /> setDraft((d) => ({ ...d, po_number: e.target.value })) } />