"use client"; import { Alert, Button, Card, Separator, Spinner } from "@heroui/react"; import { useEffect, useRef } from "react"; import { useShippingRate } from "@/lib/checkout"; import type { CheckoutAddress, CheckoutValidationResult, CheckoutSelectedShippingRate, CheckoutShippingRateResult, } from "@/lib/checkout/types"; import { formatPrice } from "@repo/utils"; import { CheckoutLineItems } from "../content/CheckoutLineItems"; type OrderReviewStepProps = { addressId: string; addresses: CheckoutAddress[]; cartResult: CheckoutValidationResult; sessionId: string | undefined; onProceed: ( shipmentObjectId: string, shippingRate: CheckoutSelectedShippingRate, ) => void; onBack: () => void; }; function formatShippingAmount(amount: number, currency: string): string { return new Intl.NumberFormat("en-GB", { style: "currency", currency: currency || "GBP", minimumFractionDigits: 2, }).format(amount); } export function OrderReviewStep({ addressId, addresses, cartResult, sessionId, onProceed, onBack, }: OrderReviewStepProps) { const { result, isLoading, error, retry } = useShippingRate( addressId, sessionId, ); const prevSubtotalRef = useRef(cartResult.subtotal); useEffect(() => { if ( result && !isLoading && cartResult.subtotal !== result.cartSubtotal ) { prevSubtotalRef.current = cartResult.subtotal; retry(); } }, [cartResult.subtotal, result, isLoading, retry]); const selectedAddress = addresses.find((a) => a.id === addressId); const itemCount = cartResult.items.reduce((sum, i) => sum + i.quantity, 0); const canProceed = !!result && !isLoading && !error; const handleContinue = () => { if (!result) return; onProceed(result.shipmentObjectId, result.selectedRate); }; const loadingMessageId = "shipping-rate-loading"; const errorMessageId = "shipping-rate-error"; return (
Calculating best shipping rate…
{selectedRate.serviceName} {selectedRate.durationTerms && ( · {selectedRate.durationTerms} )}
{selectedRate.estimatedDays > 0 && (Est. {selectedRate.estimatedDays} business{" "} {selectedRate.estimatedDays === 1 ? "day" : "days"}
)}{address.fullName}
{address.addressLine1}
{address.additionalInformation &&{address.additionalInformation}
}{address.city}
{address.postalCode}