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

Os valores vindos do db.json estão trocados no HTML

Gostaria que alguém me ajudasse a solucionar o motivo dos valores estarem vindo invertidos.

Quando eu coloco "preço" aparece o ID, quando eu colono o "nome" aparece o "preço" e quando eu coloco o ID aparece undefined.

Coloquei um console.log dos "objetos" json e do preco para mostrar o que acontece.

Esse é o código da API:

async function listaProdutos() {
    const resposta = await fetch(`http://localhost:3000/produtos`)
    const respostaConvertida = await resposta.json();
    console.log(respostaConvertida)
        return respostaConvertida;
}

async function criaProduto(categoria, descricao, nome, preco, url) {
    const resposta = await fetch(`http://localhost:3000/produtos`, {
        method: 'POST',
        headers: {
            'Content-type' : 'application/json'
        },
        body: JSON.stringify({
            categoria: categoria,
            descricao: descricao,
            nome: nome,
            preco: preco,
            url: url
        })
    })
    const respostaConvertida = await resposta.json()
        return respostaConvertida;
}

async function deletaProduto(id) {
    const resposta = await fetch(`http://localhost:3000/produtos/${id}`, {
        method: 'DELETE'
    })
    const respostaConvertida = resposta.json();
        return respostaConvertida;
}

export const produtoService = {
    listaProdutos,
    criaProduto,
    deletaProduto
};

E esse é o código para mostrar no HTML:

import { produtoService } from "./fetch.js";

function mostraLinha(url, descricao, nome, preco, id) {
    console.log(preco)
    const mostraProduto = document.createElement('div');
    if (mostraProduto.classList) {
        mostraProduto.classList.add("item");
    } else {
        mostraProduto.className = "item";
    };
    const conteudo = `
            <a href="#" class="topicos__imagem__link">
                <img src="${url}" alt="${descricao}" class="topicos__imagem">
            </a>
            <p class="topicos__descricao">${nome}</p>
            <p class="topicos__valor">${preco}</p>
            <a href="#" class="topicos__link">Ver produto</a>
    `
    mostraProduto.innerHTML = conteudo;
    mostraProduto.dataset.id = id;
    return mostraProduto;
};

const starwars = document.querySelector('[data-starwars]');
const consoles = document.querySelector('[data-consoles]');
const diversos = document.querySelector('[data-diversos]');

const render = async () => {
        try {
            const listaProdutos = await produtoService.listaProdutos();

            listaProdutos.forEach(elemento => {
                if(elemento.categoria == 'Star Wars') {
                    starwars.appendChild(mostraLinha(elemento.url, elemento.nome, elemento.preco, elemento.id));
                } else if(elemento.categoria == 'Consoles') {
                    consoles.appendChild(mostraLinha(elemento.url, elemento.nome, elemento.preco, elemento.id));
                } else {
                    diversos.appendChild(mostraLinha(elemento.url, elemento.nome, elemento.preco, elemento.id));
                }
            });
        } catch(erro) {
            console.log(erro)
            window.location.href="./erro.html"
        }
}

render();

Esse é o Print de como está ficando: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta
solução!

Olá Alex, tudo bem contigo?

Primeiramente devo dizer que o projeto está ficando muito bonitinho, parabéns.

Agora sobre o problema com o código, parece que o problema está no código HTML em que você está chamando a função mostraLinha. Ao analisar o código fornecido, percebi que você está passando os argumentos na ordem errada.

A ordem correta dos argumentos que você precisa passar para a função mostraLinha é a seguinte:

mostraLinha(url, descricao, nome, preco, id)

No entanto, no seu código HTML, você está passando os argumentos na seguinte ordem:

mostraLinha(elemento.url, elemento.nome, elemento.preco, elemento.id)

Isso significa que o valor que você está passando como preço está sendo interpretado como o nome e vice-versa.

Para corrigir esse problema, você precisa ajustar a ordem dos argumentos na chamada da função mostraLinha. Aqui está como o código corrigido deve ser:

starwars.appendChild(mostraLinha(elemento.url, elemento.descricao, elemento.nome, elemento.preco, elemento.id));
consoles.appendChild(mostraLinha(elemento.url, elemento.descricao, elemento.nome, elemento.preco, elemento.id));
diversos.appendChild(mostraLinha(elemento.url, elemento.descricao, elemento.nome, elemento.preco, elemento.id));

Certifique-se de que você está passando os argumentos na ordem correta ao chamar a função mostraLinha, e isso deve resolver o problema dos valores invertidos.

Se você tiver mais alguma dúvida, sinta-se à vontade para perguntar. Estou aqui para ajudar.

Abraços e bons estudos.

Caso este post tenha lhe ajudado, por favor marque ele como solução! ✓