Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Sugestão] Outra forma de atualizar o valor total

Analisando o código mostrado na aula 4, atividade 4. Vi que tinha outra possibilidade de alterar o valor total dos produtos e a quantidade de produtos no carrinho.

Atribuindo o valor total acumulado no Reduce para uma única variável e alterando o state valorTotal através do setValorTotal.

  useEffect(() => {
    const valor = carrinho.reduce((acc, produto) => acc + produto.preco * produto.quantidade, 0)
    setValorTotal(valor);
  }, [carrinho])

No caso para mostrar a quantidade de produtos no carrinho, bastaria chamar o state carrinho através do useCarrinhoContext no componente BarraNavegacao e passar para o componente BotaoCarrinho através da prop quantidadeProdutos o valor carrinho.length.

  const { carrinho } = useCarrinhoContext();
...
<BotaoCarrinho
              className={`d-none d-md-block ${
                ehAPaginaCarrinho && "d-md-none"
              }`}
              quantidadeProdutos={carrinho.length}
/>
...

Achei mais simples a resolução dessa forma, teria algum problema no futuro ou seria uma possível forma de resolver ?

1 resposta
solução!

Olá, Gabriel! Muito interessante a sua abordagem para resolver o problema.

Realmente, a sua solução para atualizar o valor total dos produtos é bastante válida e simplifica o código. Ao fazer isso, você está utilizando o poder do useEffect para monitorar as mudanças no carrinho e, quando isso acontece, você recalcula o valor total. Isso é uma ótima prática e é exatamente para isso que o useEffect serve.

useEffect(() => {
  const valor = carrinho.reduce((acc, produto) => acc + produto.preco * produto.quantidade, 0)
  setValorTotal(valor);
}, [carrinho])

No que diz respeito à quantidade de produtos no carrinho, a sua solução também é bastante eficaz. Ao usar carrinho.length, você está contando o número de itens no carrinho, o que é uma maneira simples e eficaz de obter a quantidade de produtos.

const { carrinho } = useCarrinhoContext();
...
<BotaoCarrinho
  className={`d-none d-md-block ${
    ehAPaginaCarrinho && "d-md-none"
  }`}
  quantidadeProdutos={carrinho.length}
/>
...

No entanto, é importante lembrar que essa abordagem só funcionará corretamente se cada item no carrinho representar um único produto. Se o seu carrinho for projetado para conter múltiplas quantidades do mesmo produto como um único item (por exemplo, se você tiver um item no carrinho que representa "3 maçãs"), então carrinho.length não dará a quantidade total de produtos, mas sim a quantidade de tipos de produtos diferentes no carrinho.

No final das contas, ambas as abordagens são válidas e a escolha entre uma ou outra depende muito do contexto específico do seu projeto. É sempre bom lembrar que não há uma única "melhor" maneira de fazer as coisas quando se trata de programação. O que importa é que a solução funcione corretamente e faça sentido dentro do contexto do seu projeto.

Espero ter ajudado e bons estudos!