Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Projeto] Minha resolução com dúvida

Acompanhando o vídeo, fiz algumas alterações e o código ficou assim, porém eu tenti fazer uma lógica para que o sistema entenda quando o usuário inserir um produto que já foi adicionado no carrinho, para que ele substitua este produto pelo nomvo informado, porém não deu certo.

let valorFinal = 0;
limpar();

//Botões
function adicionar(){
    let produto = document.getElementById('produto').value;
    let nomeProduto = produto.split('-')[0];
    let valorUnitario = produto.split('$')[1];
    let qntdProduto = document.getElementById('quantidade').value;
    let preco = qntdProduto * valorUnitario;
    
    let carrinho = document.getElementById('lista-produtos');
    carrinho.innerHTML = carrinho.innerHTML + `<section class="carrinho__produtos__produto"><span class="texto-azul">${qntdProduto}x</span> ${nomeProduto} <span class="texto-azul">R$${preco},00</span>`
 
    valorFinal = valorFinal + preco;
    let total = document.getElementById('valor-total');
    total.innerHTML = `<span class="texto-azul" id="valor-total">R$${valorFinal},00</span>`;
    document.getElementById('quantidade').value = '';
    checarRepeticao(nomeProduto, valorUnitario, qntdProduto);
}

function limpar(){
    valorFinal = 0;
    document.getElementById('lista-produtos').innerHTML = '';
    document.getElementById('valor-total').innerHTML = 'R$0,00';
    itens = [];
}

//Checagem de lógica
let itens = [
    {name:nomeProduto, value:valorUnitario, quantidade: qntdProduto}
];

function checarRepeticao(name, value, quantidade){
    let nomeProdutoGerado = itens.length
    
    if (produto != nomeProdutoGerado){
        itens.push(produto);
   } else {
        carrinho.innerHTML = `<section class="carrinho__produtos__produto"><span class="texto-azul">${quantidade}x</span> ${name} <span class="texto-azul">R$${value},00</span>`
   }
}
}

Alguem poderia me ajudar a solucionar esta parte?

2 respostas
solução!

Oi Gabriel!

Entendi sua dúvida e vou tentar te ajudar com isso. Parece que você quer garantir que, ao adicionar um produto que já existe no carrinho, ele seja substituído pelo novo valor e quantidade informados. Vou sugerir algumas alterações no seu código para que isso funcione corretamente.

Primeiro, precisamos ajustar a função checarRepeticao para verificar se o produto já está no carrinho e, se estiver, atualizar suas informações. Além disso, vamos corrigir alguns detalhes no seu código.

Aqui está uma versão revisada do seu código:

let valorFinal = 0;
let itens = [];

function limpar(){
    valorFinal = 0;
    document.getElementById('lista-produtos').innerHTML = '';
    document.getElementById('valor-total').innerHTML = 'R$0,00';
    itens = [];
}

function adicionar(){
    let produto = document.getElementById('produto').value;
    let nomeProduto = produto.split('-')[0].trim();
    let valorUnitario = parseFloat(produto.split('$')[1].trim());
    let qntdProduto = parseInt(document.getElementById('quantidade').value);
    let preco = qntdProduto * valorUnitario;

    checarRepeticao(nomeProduto, valorUnitario, qntdProduto, preco);

    valorFinal = itens.reduce((total, item) => total + item.preco, 0);
    let total = document.getElementById('valor-total');
    total.innerHTML = `<span class="texto-azul" id="valor-total">R$${valorFinal.toFixed(2)}</span>`;
    document.getElementById('quantidade').value = '';
    atualizarCarrinho();
}

function checarRepeticao(name, value, quantidade, preco){
    let itemExistente = itens.find(item => item.name === name);
    if (itemExistente) {
        itemExistente.quantidade = quantidade;
        itemExistente.preco = preco;
    } else {
        itens.push({name: name, value: value, quantidade: quantidade, preco: preco});
    }
}

function atualizarCarrinho(){
    let carrinho = document.getElementById('lista-produtos');
    carrinho.innerHTML = '';
    itens.forEach(item => {
        carrinho.innerHTML += `<section class="carrinho__produtos__produto"><span class="texto-azul">${item.quantidade}x</span> ${item.name} <span class="texto-azul">R$${item.preco.toFixed(2)}</span></section>`;
    });
}

Aqui estão as principais mudanças:

  1. Adicionei a função atualizarCarrinho para atualizar a lista de produtos no carrinho.
  2. Ajustei a função checarRepeticao para atualizar a quantidade e o preço do produto se ele já existir no carrinho.
  3. Usei reduce para recalcular o valor total do carrinho após cada adição ou atualização de produto.
  4. Corrigi a forma como você estava manipulando os valores e quantidades, garantindo que eles sejam tratados como números.

Obs: Nessa solução foi utilizado alguns recursos não ensinados no curso, como as funções reduce e find.

Espero ter ajudado e bons estudos!

De fato, precisou mudar quase toda a estrutura, mas deu certo rsrsrs

Creio que a complexidade que este processo do array se tornou seja o motivo dele nao ter sido aplicado ainda em uma aula que tem intuito de ensiar a lógica de programação. Muito obrigado pela atenção.