"use client"; import Image from "next/image"; import Link from "next/link"; import { ArrowLeft, MapPin, MessageCircle, Truck } from "lucide-react"; import { type FormEvent, useState } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { formatMoney } from "@/lib/utils"; import { useCartStore } from "@/store/cart-store"; // ADR 0009, siguiente corte tras el carrito real: direccion + seleccion de // envio contra el Store API real (mismos endpoints ya verificados en vivo // para las shipping options). El pago (PayU custom) todavia no existe -- // el ultimo paso sigue siendo WhatsApp, ahora con el pedido completo // (direccion, envio, total real) en vez de solo la lista de productos. interface ShippingOption { id: string; name: string; amount: number; } type Step = "address" | "shipping" | "review"; async function postJson(url: string, body: unknown) { const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }); return response.json(); } export function CheckoutClient() { const { cartId, items, hasHydrated } = useCartStore(); const [step, setStep] = useState("address"); const [form, setForm] = useState({ firstName: "", lastName: "", address1: "", city: "", province: "", phone: "", email: "" }); const [shippingOptions, setShippingOptions] = useState([]); const [selectedOptionId, setSelectedOptionId] = useState(null); const [shippingTotal, setShippingTotal] = useState(0); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const itemsSubtotal = items.reduce((sum, item) => sum + (item.product.price ?? 0) * item.quantity, 0); const currency = items[0]?.product.currency; async function submitAddress(event: FormEvent) { event.preventDefault(); if (!cartId) return; setLoading(true); setError(null); try { const cart = await postJson("/api/cart/address", { cartId, ...form }); if (cart.error) throw new Error(cart.error); const response = await fetch(`/api/cart/shipping-options?cartId=${cartId}`); const data = await response.json(); const options: ShippingOption[] = data.options ?? []; setShippingOptions(options); setSelectedOptionId(options[0]?.id ?? null); setStep("shipping"); } catch (submitError) { setError((submitError as Error).message); } finally { setLoading(false); } } async function submitShipping() { if (!cartId || !selectedOptionId) return; setLoading(true); setError(null); try { const cart = await postJson("/api/cart/shipping-method", { cartId, optionId: selectedOptionId }); if (cart.error) throw new Error(cart.error); setShippingTotal(cart.shippingTotal ?? 0); setTotal(cart.total ?? itemsSubtotal); setStep("review"); } catch (submitError) { setError((submitError as Error).message); } finally { setLoading(false); } } function continueOnWhatsApp() { const lines = items.map((item) => `• ${item.quantity} x ${item.product.name}`).join("\n"); const message = `Hola Ari Shopping 👋\nQuiero confirmar mi pedido:\n\n${lines}\n\nSubtotal: ${formatMoney(itemsSubtotal, currency)}\nEnvío: ${formatMoney(shippingTotal, currency)}\nTotal: ${formatMoney(total, currency)}\n\nNombre: ${form.firstName} ${form.lastName}\nDirección: ${form.address1}, ${form.city}${form.province ? `, ${form.province}` : ""}\nTeléfono: ${form.phone}`; void navigator.clipboard?.writeText(message); window.open(process.env.NEXT_PUBLIC_WHATSAPP_URL ?? "https://wa.link/rvcqqc", "_blank", "noopener,noreferrer"); } if (!hasHydrated) return null; if (items.length === 0) { return (

Tu carrito está vacío.

); } return (
Seguir comprando

Confirmar pedido

{step === "address" && (
setForm({ ...form, firstName: event.target.value })} /> setForm({ ...form, lastName: event.target.value })} />
setForm({ ...form, address1: event.target.value })} />
setForm({ ...form, city: event.target.value })} /> setForm({ ...form, province: event.target.value })} />
setForm({ ...form, phone: event.target.value })} /> setForm({ ...form, email: event.target.value })} />
{error &&

{error}

}
)} {step === "shipping" && (

{form.address1}, {form.city}{form.province ? `, ${form.province}` : ""}

{shippingOptions.map((option) => ( ))} {shippingOptions.length === 0 &&

No hay opciones de envĂ­o disponibles para esta direcciĂłn.

}
{error &&

{error}

}
)} {step === "review" && (

Entrega

{form.firstName} {form.lastName}

{form.address1}, {form.city}{form.province ? `, ${form.province}` : ""}

{form.phone}

El pago en línea todavía no está disponible — confirmamos tu pedido por WhatsApp con estos datos.

)}

Tu pedido

{items.map((item) => (
{item.product.name}

{item.product.name}

Cantidad: {item.quantity}

{formatMoney((item.product.price ?? 0) * item.quantity, item.product.currency)}

))}
Subtotal{formatMoney(itemsSubtotal, currency)}
{step === "review" &&
EnvĂ­o{formatMoney(shippingTotal, currency)}
}
Total{formatMoney(step === "review" ? total : itemsSubtotal, currency)}
); }