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

Gostaria de saber se tem como deixar o codigo mais generico

Fiz um codigo para atualizar o fundo e o robo conforme a escolha da cor do robo, e gostaria de saber se tem algum jeito de deixar o codigo mais generico, pois acho que está com muitas repetições

const controleRobo = document.querySelectorAll("[data-controlador-robo]")

const cores = ["Azul", "Amarelo", "Branco", "Preto", "Rosa", "Vermelho"];
let contador = 0;

controleRobo.forEach( (elemento) => {
    elemento.addEventListener("click", (evento) => {
        atualizaRobo(evento.target.dataset.controladorRobo, evento.target.parentNode)
        atualizaCorRobo(evento.target.parentNode)
    })
})


function atualizaCorRobo (controle) {
    const operacaoRobo = controle.querySelector("[data-contador-robo]")

    if (operacaoRobo.value == "Amarelo") {
       document.querySelector("#imgRobo").setAttribute('src', 'img/robotron_amarelo.png');
       document.body.style.background = '#a5922f'
    } else if (operacaoRobo.value == "Branco") {
        document.querySelector("#imgRobo").setAttribute('src', 'img/robotron_branco.png');
        document.body.style.background = '#8F8F8F'
    } else if (operacaoRobo.value == "Preto") {
        document.querySelector("#imgRobo").setAttribute('src', 'img/robotron_preto.png');
        document.body.style.background = '#363839'
    } else if (operacaoRobo.value == "Rosa") {
        document.querySelector("#imgRobo").setAttribute('src', 'img/robotron_rosa.png');
        document.body.style.background = '#D458A4'
    } else if (operacaoRobo.value == "Vermelho") {
        document.querySelector("#imgRobo").setAttribute('src', 'img/robotron_vermelho.png');
        document.body.style.background = '#FF5757'
    } else {    
        document.querySelector("#imgRobo").setAttribute('src', 'img/robotron.png');
        document.body.style.background = '#37387e'
    }
}

function atualizaRobo(operacao, controle) {
    const operacaoRobo = controle.querySelector("[data-contador-robo]")

    if (operacao == "+") {
        if (contador < cores.length - 1) {
            contador++
            operacaoRobo.value = cores[contador]
        } else {
            contador = 0
            operacaoRobo.value = cores[contador]
        }
    } else {
        if (contador > 0) {
            contador--
            operacaoRobo.value = cores[contador]
        } else {
            contador = 5
            operacaoRobo.value = cores[contador]
        }
    }
}
2 respostas
solução!

Com certeza tem! Fiz algumas refatorações no seu código para deixá-lo mais genérico.

O que fiz foi criar um objeto de configuração para seu programa, neste objeto cada cor tem uma configuração específica. Deste modo é possível parametrizar todo o resto do código com base nesse objeto.

Após isso tirei algumas variáveis que não seriam mais necessárias e criei outras para faciliar o entendimento do que alterei.

O código final segue abaixo:

const controleRobo = document.querySelectorAll("[data-controlador-robo]");

const operacaoConfig = {
    "Azul": {
        corDeFundo: '#37387e',
        caminhoDaImagemDoRobo: 'img/robotron.png',
    },
    "Amarelo": {
        corDeFundo: '#a5922f',
        caminhoDaImagemDoRobo: 'img/robotron_amarelo.png',
    },
    "Branco": {
        corDeFundo: '#8F8F8F',
        caminhoDaImagemDoRobo: 'img/robotron_branco.png',
    },
    "Preto": {
        corDeFundo: '#363839',
        caminhoDaImagemDoRobo: 'img/robotron_preto.png',
    },
    "Rosa": {
        corDeFundo: '#D458A4',
        caminhoDaImagemDoRobo: 'img/robotron_rosa.png',
    },
    "Vermelho": {
        corDeFundo: '#FF5757',
        caminhoDaImagemDoRobo: 'img/robotron_vermelho.png',
    }
};

controleRobo.forEach(elemento => {
    elemento.addEventListener("click", (evento) => {
        atualizaRobo(evento.target.dataset.controladorRobo, evento.target.parentNode);
        atualizaCorRobo(evento.target.parentNode);
    });
});

function atualizaRobo(operacao, controle) {
    const operacaoRobo = controle.querySelector("[data-contador-robo]");
    const cores = Object.keys(operacaoConfig);

    const corAtual = operacaoRobo.value;
    const indiceCorAtual = cores.indexOf(corAtual);

    const incremento = operacao === "+" ? 1 : -1;
    const indiceProximaCor = (indiceCorAtual + incremento + cores.length) % cores.length;

    operacaoRobo.value = cores[indiceProximaCor];
}

function atualizaCorRobo(controle) {
    const operacaoRobo = controle.querySelector("[data-contador-robo]");
    const corAtual = operacaoRobo.value;
    const config = operacaoConfig[corAtual] || operacaoConfig['Azul'];

    document.querySelector("#imgRobo").setAttribute('src', config.caminhoDaImagemDoRobo);
    document.body.style.background = config.corDeFundo;
}

Agora você pode adicionar novas cores ao objeto sem precisar alterar nada no restante do código!

Perfeito!! Eu entendi quase tudo, só essa parte que eu queria saber se teria como explicar

Como venho do java, queria entender o que seria esse IndexOf, e como funciona essa operacaoConfig, ela seria uma lista? se ela for uma lista, e na parte de indiceProximaCor eu to adicionando 1, uma hora vou chegar no indice final certo? Depois disso como sei que vou voltar para o inicio da lista? Por causa do resto de divisão pelo cores.length?

function atualizaRobo(operacao, controle) {
    const operacaoRobo = controle.querySelector("[data-contador-robo]");
    const cores = Object.keys(operacaoConfig);

    const corAtual = operacaoRobo.value;
    const indiceCorAtual = cores.indexOf(corAtual);

    const incremento = operacao === "+" ? 1 : -1;
    const indiceProximaCor = (indiceCorAtual + incremento + cores.length) % cores.length;

    operacaoRobo.value = cores[indiceProximaCor];
}

Obrigado por me ajudar!!