1
resposta

[Dúvida] Utilizei outra forma para passar a quantidade e o valor total.

Ao invés de utilizar outros estados, calculei diretamente do estado carrinho, teria alguma diferença em relação a performance?

import { useContext } from "react"
import { CarrinhoContext } from "../Context/CarrinhoContext"

export const useCarrinhoContext = () => {
    const { carrinho, setCarrinho } = useContext(CarrinhoContext);

    function mudarQuantidade (id, quantidade) {
        return carrinho.map(itemDoCarrinho => {
            if (itemDoCarrinho.id === id) itemDoCarrinho.quantidade += quantidade;
            return itemDoCarrinho;
        })
    }

    function adicionarProduto(novoProduto) {
        const temOProduto = carrinho.some(
            (itemDoCarrinho) =>  itemDoCarrinho.id === novoProduto.id
        )

        if (!temOProduto) {
            novoProduto.quantidade = 1;
            return setCarrinho((carrinhoAnterior) => [
                ...carrinhoAnterior, novoProduto
            ])
        }
        const carrinhoAtualizado = mudarQuantidade(novoProduto.id, 1);
        setCarrinho([...carrinhoAtualizado])
    }

    function removerProduto(id) {
        const produto = carrinho.find((itemDoCarrinho) => itemDoCarrinho.id === id);
        const ehOUltimo = produto.quantidade === 1;
        if (ehOUltimo) {
            return setCarrinho((carrinhoAnterior) =>
                carrinhoAnterior.filter((itemDoCarrinho) => itemDoCarrinho.id !== id)
            );
        }
        const carrinhoAtualizado = mudarQuantidade(id, -1);

        setCarrinho([...carrinhoAtualizado]);
    }

    function removerProdutoCarrinho(id) {
        const carrinhoFiltrado = carrinho.filter(itemDoCarrinho => itemDoCarrinho.id !== id);
        setCarrinho(carrinhoFiltrado);
    }

    function valorTotalCarrinho () {
        return carrinho.reduce((total, itemDoCarrinho) => total + (itemDoCarrinho.preco * itemDoCarrinho.quantidade), 0);
    }

    function quantidadeProdutos() {
        return carrinho.reduce((total, itemDoCarrinho) => total + itemDoCarrinho.quantidade, 0);
    }

    return {
        carrinho,
        setCarrinho,
        adicionarProduto,
        removerProduto,
        removerProdutoCarrinho,
        valorTotalCarrinho,
        quantidadeProdutos
    }

}
1 resposta

Olá, Filipe. Tudo bem?

Sua abordagem de calcular diretamente a quantidade e o valor total a partir do estado carrinho é totalmente válida e pode até simplificar seu código em alguns aspectos.

Muito obrigada por compartilhar com a gente.

Um abraço e bons estudos.