diff --git a/src/app/api/cartApi.js b/src/app/api/cartApi.js index 2ddffcb..7ebb7c3 100644 --- a/src/app/api/cartApi.js +++ b/src/app/api/cartApi.js @@ -5,45 +5,23 @@ export const cartApi = baseApi.injectEndpoints({ getCart: builder.query({ query: () => `/carts`, providesTags: ["cartItems"], - pollingInterval: 5000, - refetchOnMountOrArgChange: true, + pollingInterval: 0, + refetchOnMountOrArgChange: 30, refetchOnFocus: false, - refetchOnReconnect: true, + refetchOnReconnect: false, transformResponse: (response) => { - if ( - typeof response === "string" && - (response.trim().startsWith(" response.data || null, }), - placeOrder: builder.mutation({ - query: (orderDetails) => { - orderDetails.shipping_method = 'standart'; - orderDetails.delivery_time = '13:00 - 18:00'; - orderDetails.region = 'ag'; - orderDetails.payment_type_id = 3; + placeOrder: builder.mutation({ + query: (orderDetails) => { + orderDetails.shipping_method = 'standart'; + orderDetails.delivery_time = '13:00 - 18:00'; + orderDetails.region = 'ag'; + // orderDetails.payment_type_id = 3; + + const formData = new URLSearchParams(); + + Object.keys(orderDetails).forEach(key => { + if (key === 'product_ids' && Array.isArray(orderDetails[key])) { + + orderDetails[key].forEach(id => { + formData.append('product_ids[]', id); + }); + } else { + formData.append(key, orderDetails[key]); + } + }); + return { url: "/orders", method: "POST", - body: new URLSearchParams(orderDetails), + body: formData, headers: { "Accept": "application/json", "Content-Type": "application/x-www-form-urlencoded", diff --git a/src/components/Checkout/index.jsx b/src/components/Checkout/index.jsx index 4993dfe..ed472e9 100644 --- a/src/components/Checkout/index.jsx +++ b/src/components/Checkout/index.jsx @@ -24,7 +24,7 @@ const useDeviceType = () => { return deviceType; }; -const Checkout = ({ cartItems, onBackToCart, onPlaceOrder }) => { +const Checkout = ({ cartItems, shippingPrice, productIds, onBackToCart, onPlaceOrder }) => { const { t } = useTranslation(); const [formData, setFormData] = useState({ customer_name: "", @@ -154,55 +154,57 @@ const Checkout = ({ cartItems, onBackToCart, onPlaceOrder }) => { delivery_time: defaultTimeSlot.hour, delivery_at: defaultTimeSlot.date, region: formData.region || "", - notes: formData.notes || "" + notes: formData.notes || "", + // Add shipping price and product IDs + shipping_price: shippingPrice, + product_ids: productIds // Array of product IDs [1, 3, 4, etc.] }; }; - // Make handlePlaceOrder available to the parent through a ref or expose it + // Create the place order function + const handlePlaceOrder = async () => { + const orderDetails = getOrderData(); + if (!orderDetails) return false; + + try { + const response = await placeOrder(orderDetails).unwrap(); + + console.log("Order placed successfully:", response); + window.location.href = "/orders"; + return true; + } catch (error) { + console.error("Failed to place order:", error); + + if ( + error.data && + typeof error.data === "string" && + error.data.includes("") + ) { + console.error( + "Server returned HTML instead of a proper API response" + ); + alert( + "There was a problem with the server. Please try again later or contact support." + ); + } else { + alert( + "Failed to place order. Please check your information and try again." + ); + } + return false; + } + }; + + // Expose the function to parent component via callback useEffect(() => { if (onPlaceOrder) { - onPlaceOrder.current = async () => { - const orderDetails = getOrderData(); - if (!orderDetails) return false; - - try { - const response = await placeOrder(orderDetails); - - if (response.data && !response.error) { - console.log("Order placed successfully:", response.data); - window.location.href = "/orders"; - return true; - } else { - throw new Error(response.error || "Unknown error occurred"); - } - } catch (error) { - console.error("Failed to place order:", error); - - if ( - error.data && - typeof error.data === "string" && - error.data.includes("") - ) { - console.error( - "Server returned HTML instead of a proper API response" - ); - alert( - "There was a problem with the server. Please try again later or contact support." - ); - } else { - alert( - "Failed to place order. Please check your information and try again." - ); - } - return false; - } - }; + onPlaceOrder(handlePlaceOrder); } - }, [formData, placeOrder, onPlaceOrder]); + }, [formData, shippingPrice, productIds]); return (
{truncatedDesc}
{t("common.Are_you_sure_you_want_to_empty_the_cart")}