I created a cart Array in my Context
const [cart, setCart] = useState([]);
I want to implement an addToCart Button
, on Each Button Click, Add the clicked product to cart, and change the button from Add to cart
to Remove from cart
on that particular Product, not all products.
const addProduct = (product) => {
setCart([
...cart,
{
id: product.id,
drinkName: product.drinkName,
price: product.price,
url: product.url,
},
]);
};
Shop Page
const { products, storeQuery, addProduct } = useProduct();
// Products are coming from Firebase
const addToCart = (product) => {
const newProduct = {
id: product.id,
drinkName: product.drinkName,
price: product.price,
url: product.url,
};
product = newProduct;
console.log("cart Added");
addProduct(newProduct);
console.log(newProduct.id, "Clicked");
};
<SimpleGrid
columns={{ base: 2, md: 4 }}
spacing={{ base: 3, md: 4 }}
>
{products?.map((docsSnapshot) => {
const product = docsSnapshot.data();
return (
<ProductList
key={docsSnapshot.id}
docsSnapshot={docsSnapshot}
product={product}
addProductToCart={(product) => addToCart(product)}
/>
);
})}
</SimpleGrid>
ProductList page
<Button
isFullWidth
onClick={() => addProductToCart(product, docsSnapshot?.id)}
colorScheme="success"
size={"xs"}
>
Add to cart
</Button>
id: undefined, Why is that happening?
CodePudding user response:
I don't guarantee that each product document has an id
field from Firestore.
Refactor code as :
{products?.map((docsSnapshot) => {
const doc = docsSnapshot.data();
const product = {...doc,id:docsSnapshot.id}
return (
<ProductList
key={docsSnapshot.id}
docsSnapshot={docsSnapshot}
product={product}
addProductToCart={(product) => addToCart(product)}
/>
);
})}
To change Add to cart
to Remove to cart
label try.
products?.map((docsSnapshot) => {
const doc = docsSnapshot.data();
const product = { ...doc, id: docsSnapshot.id };
// Find product either added to cart.
const inCart = Boolean(cart.find((el) => el.id === product.id));
return (
<ProductList
key={docsSnapshot.id}
docsSnapshot={docsSnapshot}
product={product}
addProductToCart={(product) => addToCart(product)}
// Add extra props for to indicate if product added to cart
isInCart={inCart}
/>
);
});
Later inside Product page, refactor as below:
<Button
isFullWidth
onClick={() => addProductToCart(product, docsSnapshot?.id)}
colorScheme="success"
size={"xs"}
>
{props.isInCart ? "Remove" : "Add"} to cart
</Button>;
CodePudding user response:
Calculate cart total.
const total = cart.map(product=>product.price).reduce(previousValue, currentValue) => previousValue currentValue,
0)
console.log({total})