3
respostas

[Sugestão] Como eu fiz

Professor, fiz de uma forma diferente, porém, no meu está dando o seguinte erro: SyntaxError: "undefined" is not valid JSON at JSON.parse ()

const botaoAdicionar = document.querySelector(".app__button--add-task")
const formulario = document.querySelector(".app__form-add-task")
const textArea = document.querySelector(".app__form-textarea")
const listaDeTarefas = document.querySelector(".app__section-task-list")
let tarefas = JSON.parse(localStorage.getItem("tarefas")) || []
const botaoCancelar = document.querySelector(".app__form-footer__button--cancel")
const paragrafoDescricaoTarefa = document.querySelector(".app__section-active-task-description")
const btnLimparTarefasConcluidas = document.getElementById("btn-remover-concluidas")
const btnLimparTodasTarefas = document.getElementById("btn-remover-todas")
let tarefaSelecionada = null
let liTarefaSelecionada = null

function atualizarTarefa(){
    localStorage.setItem("tarefas", JSON.stringify(tarefas))
}

function criarTarefa(tarefa){
    const li = document.createElement("li")
    li.classList.add("app__section-task-list-item")
    const svg = document.createElement("svg")
    svg.innerHTML = `<svg class="app__section-task-icon-status" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
    <circle cx="12" cy="12" r="12" fill="#FFF"></circle>
    <path d="M9 16.1719L19.5938 5.57812L21 6.98438L9 18.9844L3.42188 13.4062L4.82812 12L9 16.1719Z" fill="#01080E"></path>
    </svg>`
    const p = document.createElement("p")
    p.classList.add("app__section-task-list-item-description")
    p.textContent = tarefa.descricao
    const botao = document.createElement("button")
    botao.classList.add("app_button-edit")
    const img = document.createElement("img")
    img.setAttribute("src","imagens/edit.png")

    botao.onclick = () =>{
        const novoValor = prompt("Digite o novo valor")
        if(novoValor){
            p.textContent = novoValor
            tarefa.descricao = novoValor
            atualizarTarefa()
        }
    }
    li.append(svg)
    li.append(p)
    botao.append(img)
    li.append(botao)

    if(tarefa.completa){
        li.classList.add("app__section-task-list-item-complete")
        botao.setAttribute("disabled", "disabled")
    }else{
        li.onclick = () =>{
            paragrafoDescricaoTarefa.textContent = tarefa.descricao
            
            document.querySelectorAll(".app__section-task-list-item-active").forEach(element =>{
                element.classList.remove("app__section-task-list-item-active")
            })
    
            if(tarefaSelecionada == tarefa){
                paragrafoDescricaoTarefa.textContent = ""
                tarefaSelecionada = null
                liTarefaSelecionada = null
                return
            }
            tarefaSelecionada = tarefa
            liTarefaSelecionada = li
            li.classList.add("app__section-task-list-item-active")
            
        }
    }

    return li
}
botaoCancelar.addEventListener("click", () =>{
    textArea.value = ""
    formulario.classList.add("hidden")
})
botaoAdicionar.addEventListener("click", () =>{
    formulario.classList.toggle("hidden")
})
formulario.addEventListener("submit", (evento) =>{
    evento.preventDefault()
    const tarefa = {
        descricao: textArea.value
    }
    tarefas.push(tarefa)
    atualizarTarefa()
    const elemento = criarTarefa(tarefa)
    listaDeTarefas.append(elemento)

    textArea.value = ""
    formulario.classList.add("hidden")
})
tarefas.forEach(element => {
    const elemento = criarTarefa(element)
    listaDeTarefas.append(elemento)
});
document.addEventListener("focoFinalizado", () =>{
    if(tarefaSelecionada && liTarefaSelecionada){
        liTarefaSelecionada.classList.remove("app__section-task-list-item-active")
        liTarefaSelecionada.classList.add("app__section-task-list-item-complete")
        liTarefaSelecionada.querySelector("button").setAttribute("disabled", "disabled")
        tarefaSelecionada.completa = true
        atualizarTarefa()
    }
})

btnLimparTarefasConcluidas.addEventListener("click", () =>{
    let apagarTarefas = document.querySelectorAll(".app__section-task-list-item-complete")
    apagarTarefas.forEach(elemento =>{
        elemento.remove()
    })
    tarefas = tarefas.filter(element => !element.completa)
    atualizarTarefa()
})
btnLimparTodasTarefas.addEventListener("click", () =>{
    let apagarTarefas = document.querySelectorAll(".app__section-task-list-item")
    tarefas = apagarTarefas.forEach(element =>{
        element.remove()
    })
    atualizarTarefa()
    
})
3 respostas

Olá, Eduardo!

Entendi que você está enfrentando um erro de SyntaxError: "undefined" is not valid JSON ao tentar manipular o localStorage. Esse erro ocorre quando você tenta fazer o JSON.parse de um valor que não é um JSON válido, e no seu caso, parece que o valor retornado do localStorage está sendo undefined.

Para resolver isso, você pode adicionar uma verificação antes de fazer o JSON.parse para garantir que o valor retornado do localStorage não seja undefined.

Se você puder compartilhar seu código completo no GitHub, assim fica melhor pra entender o contexto como um todo.

Um abraço e bons estudos.

Ok, está no GitHub: https://github.com/7eduardocf/fokus-localStorage

Oi, Eduardo! Obrigada por compartilhar o código.

Dei uma olhada no seu código e percebi que ao deletar todos os itens da lista o que restava não era um array vazio e sim um objeto indefinido.

Existem algumas maneiras de tratar esse erro, uma delas é a seguinte:

function atualizarTarefa(){
    if(tarefas === undefined || tarefas === null) {
        tarefas = [];
    }
    
    localStorage.setItem("tarefas", JSON.stringify(tarefas))
}

Essa pequena alteração na função atualizarTarefa garante que, se ao chamar essa função o objeto tarefas for indefinido ou nulo, ele será tratado como um array vazio prevenindo assim o erro quando JSON tentar aplicar o parse.

Espero ter ajudado.

Um abraço e bons estudos.