import { createContext, useState } from "react"; import { useCookies } from "react-cookie"; export const CartContext = createContext({ items: [], getProductQuantity: () => { }, getProductRemaining: () => { }, addOneToCart: () => { }, removeOneFromCart: () => { }, deleteFromCart: () => { }, getTotalCost: () => { }, addToCart: () => { } }); export function CartProvider({ children }) { const [cartCookie, setCartCookie] = useCookies(['cart']) const [cartProducts, setCartProducts] = useState([]); function addToCart(product, qty) { setCartProducts([...cartProducts, { ...product, quantity: parseFloat(qty), remaining: parseFloat(product.quantity) }]); } function getProductQuantity(id) { const quantity = cartProducts.find(product => product.id === id)?.quantity; if (quantity === undefined) { return 0; } return quantity; }; function getProductRemaining(id) { const remaining = cartProducts.find(product => product.id === id)?.remaining; if (remaining === undefined) { return 0; } return remaining; }; function addOneToCart(id) { const currentQty = getProductQuantity(id); const remaining = getProductRemaining(id); if (remaining > currentQty) { setCartProducts( cartProducts.map( product => product.id === id ? { ...product, quantity: parseFloat(product.quantity) + 1 } : product ) ); } }; function removeOneFromCart(id) { const currentQty = getProductQuantity(id); if (currentQty === 1) deleteFromCart(id); else setCartProducts( cartProducts.map( product => product.id === id ? { ...product, quantity: parseFloat(product.quantity) - 1 } : product ) ); }; function deleteFromCart(id) { setCartProducts( cartProducts => cartProducts.filter((currentProduct) => currentProduct.id !== id) ); }; function getTotalCost() { let totalCost = 0; cartProducts.map((cartItem) => { totalCost += (parseFloat(cartItem.status == 3 || cartItem.status == 4 ? cartItem.promoPrice : cartItem.price) * parseFloat(cartItem.quantity)); }); return totalCost; }; const contextValue = { items: cartProducts, getProductQuantity, getProductRemaining, addOneToCart, removeOneFromCart, deleteFromCart, getTotalCost, addToCart }; return ( {children} ); } export default CartProvider;