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

[Projeto] Consolidando conhecimento

Alterei o código e utilizei a geração de um id com base na data atual, em contraparte tive que fazer a comparação de existencia do item com base no nome, já que os ids no momento da criação nunca são iguais aos já salvos. Agradeço muito se existir alguma forma de melhorar esse codigo, ou qualquer outra dica!

const lista = document.getElementById("lista");
const itemList = loadLocalStorage() || [];

itemList.forEach((element) => {
  const item = buildItem(element);
  lista.append(item);
});

const formulario = document.getElementById("novoItem");

formulario.addEventListener("submit", (evento) => {
  evento.preventDefault();

  const id = generateId();
  const nomeInput = evento.target.elements["nome"];
  const quantidadeInput = evento.target.elements["quantidade"];

  const itemExists = itemList.find(
    (element) => element.nome === nomeInput.value
  );
  if (itemExists) {
    // Atualiza apenas a quantidade do item existente
    itemExists.quantidade = quantidadeInput.value;
    updateItem(itemExists); // Atualiza a exibição do item na página
    updateLocalStorage(); // Atualiza o Local Storage
  } else {
    saveOnLocalStorage(id, nomeInput.value, quantidadeInput.value);
    lista.appendChild(
      buildItem({
        id: id,
        nome: nomeInput.value,
        quantidade: quantidadeInput.value,
      })
    );
  }

  nomeInput.value = "";
  quantidadeInput.value = "";
});

function buildItem(item) {
  const card = document.createElement("li");
  card.classList.add("item");
  card.innerHTML = `<strong>${item.quantidade}</strong>${item.nome}`;
  card.dataset.id = item.id;
  return card;
}

function saveOnLocalStorage(id, nome, quantidade) {
  const itemIndex = itemList.findIndex((element) => element.nome === nome);
  if (itemIndex !== -1) {
    // Item já existe, realiza o update
    itemList[itemIndex].quantidade = quantidade;
  } else {
    // Item não existe, adiciona um novo item
    const newItem = {
      id: id,
      nome: nome,
      quantidade: quantidade,
    };
    itemList.push(newItem);
  }
  localStorage.setItem("itens", JSON.stringify(itemList));
}

function loadLocalStorage() {
  const itensListLocalStorage = JSON.parse(localStorage.getItem("itens")) || [];
  return itensListLocalStorage;
}

function updateItem(item) {
  const card = document.querySelector(`[data-id="${item.id}"]`);
  if (card) {
    card.innerHTML = `<strong>${item.quantidade}</strong>${item.nome}`;
  }
}

function updateLocalStorage(){
  localStorage.setItem("itens", JSON.stringify(itemList))
}

function generateId() {
  return Date.now().toString(); // Gera um ID único baseado no timestamp atual
}
1 resposta
solução!

Olá Vitor! Parabéns por estar consolidando seus conhecimentos em JavaScript na Web! Sobre o código que você postou, acredito que a forma como você está comparando os itens com base no nome pode gerar problemas caso existam itens com nomes iguais. Uma alternativa seria utilizar um ID único para cada item, como você já está fazendo, e comparar os itens com base nesse ID. Dessa forma, não haverá problemas caso existam itens com nomes iguais.

Outra sugestão seria separar a lógica de atualização do Local Storage da lógica de atualização da página. Atualmente, essas duas lógicas estão misturadas no código. Você poderia criar uma função específica para atualizar o Local Storage e outra para atualizar a página. Isso tornaria o código mais organizado e mais fácil de manter.

Espero ter ajudado com essas dicas! Bons estudos!