import { useEffect, useState } from "react" import { useRouter } from "next/router" import { medusaClient } from "../lib/medusa-client" import { getStoredCartId, clearStoredCartId } from "../lib/storefront" const initialForm = { email: "", first_name: "", last_name: "", address_1: "", postal_code: "", city: "", country_code: "fr", } export default function CheckoutPage() { const router = useRouter() const [form, setForm] = useState(initialForm) const [status, setStatus] = useState("") const [isLoading, setIsLoading] = useState(false) const [cartId, setCartId] = useState(null) useEffect(() => { const storedCartId = getStoredCartId() setCartId(storedCartId) }, []) const handleChange = (event) => { const { name, value } = event.target setForm((prev) => ({ ...prev, [name]: value })) } const handleSubmit = async (event) => { event.preventDefault() setStatus("") setIsLoading(true) if (!cartId) { setStatus("Votre panier est vide.") setIsLoading(false) return } try { await medusaClient.carts.update(cartId, { email: form.email, shipping_address: { first_name: form.first_name, last_name: form.last_name, address_1: form.address_1, postal_code: form.postal_code, city: form.city, country_code: form.country_code, }, }) const { shipping_options: shippingOptions } = await medusaClient.shippingOptions.listCartOptions(cartId) if (!shippingOptions?.length) { throw new Error("Aucune option de livraison disponible.") } await medusaClient.carts.addShippingMethod(cartId, { option_id: shippingOptions[0].id, }) const { cart: cartWithPayments } = await medusaClient.carts.createPaymentSessions( cartId ) const manualSession = cartWithPayments?.payment_sessions?.find( (session) => session.provider_id === "manual" ) const providerId = manualSession?.provider_id || cartWithPayments?.payment_sessions?.[0]?.provider_id if (!providerId) { throw new Error("Aucun moyen de paiement disponible.") } await medusaClient.carts.setPaymentSession(cartId, { provider_id: providerId }) const { type, data } = await medusaClient.carts.complete(cartId) if (type === "order" && data?.id) { clearStoredCartId() router.push(`/order-confirmation?order_id=${data.id}`) return } setStatus("Commande validée, mais sans numéro de commande.") } catch (error) { setStatus("Impossible de finaliser la commande.") } finally { setIsLoading(false) } } return (

Finaliser la commande

{status &&

{status}

}
) }