Oi pessoal! Já tinha feito antes sem precisar criar dois estados novos no carrinhoContext. Como já tem a quantidade e o valor de cada produto no estado carrinho, fiz o reduce no próprio estado carrinho. O que acham dessa abordagem? Por que é necessário criar os dois novos estados "quantidade" e "valorTotal"?
Eu fiz assim:
CarrinhoContext.jsx:
import { createContext, useState } from "react";
export const CarrinhoContext = createContext();
CarrinhoContext.displayName = "Carrinho";
export const CarrinhoProvider = ({ children }) => {
const [carrinho, setCarrinho] = useState([]);
return (
<CarrinhoContext.Provider value={{ carrinho, setCarrinho, quantidade, setQuantidade, valorTotal, setValorTotal }}>
{children}
</CarrinhoContext.Provider>
);
};
useCarrinhoContext.js:
import { useContext } from "react"
import { CarrinhoContext } from "@/context/CarrinhoContext.jsx";
export const useCarrinhoContext = () => {
const { carrinho, setCarrinho } = useContext(CarrinhoContext);
function adicionarProduto(novoProduto) {
const produtoExisteNoCarrinho = carrinho.some(itemDoCarrinho => itemDoCarrinho.id === novoProduto.id);
if (!produtoExisteNoCarrinho) {
novoProduto.quantidade = 1;
setCarrinho((carrinhoAnterior) => [...carrinhoAnterior, novoProduto]);
return;
};
setCarrinho((carrinhoAnterior) =>
carrinhoAnterior.map((itemDoCarrinho) => {
if (itemDoCarrinho.id === novoProduto.id) {
return { ...itemDoCarrinho, quantidade: itemDoCarrinho.quantidade + 1 }
};
return itemDoCarrinho;
}));
};
function removerProduto(id) {
const produto = carrinho.find(itemDoCarrinho => itemDoCarrinho.id === id);
const ehOUltimo = produto.quantidade === 1;
if (ehOUltimo) {
setCarrinho((carrinhoAnterior) =>
carrinhoAnterior.filter(itemDoCarrinho => itemDoCarrinho.id !== produto.id));
return;
};
setCarrinho((carrinhoAnterior) =>
carrinhoAnterior.map((itemDoCarrinho) => {
if (itemDoCarrinho.id === id) {
return { ...itemDoCarrinho, quantidade: itemDoCarrinho.quantidade - 1 };
};
return itemDoCarrinho;
})
);
};
function removerProdutoCarrinho(id) {
setCarrinho((carrinhoAnterior => {
return carrinhoAnterior.filter(produto => produto.id !== id);
}));
};
const valorTotalCarrinho = carrinho.reduce((total, produto) => {
return total + (produto.preco * produto.quantidade);
}, 0);
return {
adicionarProduto,
removerProduto,
removerProdutoCarrinho,
valorTotalCarrinho
};
};
Obrigado pela atenção!