Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

2
respostas

[Sugestão] Melhorando o código do amigo secreto

//Primeiro criei um id para os botões Adicionar e Sortear.
//Depois criei uma nova classe para os botões, mudando a cor, para identificar que estão desativados.
//Com isso, fiz o resgate desses botões, para criar essas funções de ativar e dasativar.
//A função de desativar acontece após sortear, e a função ativar acontece após reiniciar.
//Também padronizei os botões adicionar e sortear de uma forma e o reiniciar de outra.

let botaoAdicionar = document.getElementById('btnAdicionar');
let botaoSortear = document.getElementById('btnSortear');

function desativandoBotoes() {
botaoAdicionar.classList.remove('primary');
botaoAdicionar.classList.add('desativado');
botaoAdicionar.disabled = true;
botaoSortear.classList.remove('primary');
botaoSortear.classList.add('desativado');
botaoSortear.disabled = true;
}

function ativandoBotoes() {
botaoAdicionar.classList.remove('desativado');
botaoAdicionar.classList.add('primary');
botaoAdicionar.disabled = false;
botaoSortear.classList.remove('desativado');
botaoSortear.classList.add('primary');
botaoSortear.disabled = false;
}

2 respostas

Os 3 botões ficaram desse jeito no htmal

//button onclick="adicionar()" id="btnAdicionar" type="button" class="button primary">Adicionar</button
//button onclick="sortear()" id="btnSortear" type="button" class="button primary">Sortear</button
//button onclick="reiniciar()" type="button" class="button secondary">Reiniciar</button

E para a nova classe para os botões, apenas copiei e colei a classe de cima e mudei o nome e as cores.

.desativado {
background-color: #4e4e4e;
color: #ffffff;
}

Olá, Lucas. Como vai?

Parabéns pela excelente iniciativa e pela implementação! Essa é uma melhoria de Experiência do Usuário (UX) fantástica para o projeto do Amigo Secreto.

No desenvolvimento de software, controlar o estado dos botões (ativado/desativado) é uma boa prática fundamental. Isso impede bugs clássicos, como o usuário continuar adicionando nomes ou tentando sortear novamente após o jogo já ter sido finalizado, o que quebraria a lógica do programa.

Gostaria de destacar os pontos fortes da sua solução e trazer uma sugestão de refatoração para deixar seu código em JavaScript ainda mais limpo e elegante:

Pontos Fortes da sua Solução

  • Uso da propriedade .disabled = true/false: Isso é excelente porque vai além da parte visual. Ao mudar a propriedade nativa do HTML, você garante que, mesmo se o usuário clicar no botão, o navegador ignorará a ação e não chamará as funções adicionar() ou sortear().
  • Manipulação de Classes com classList: O uso de .remove() e .add() é a forma correta e moderna de gerenciar estilos dinâmicos no JavaScript.

Uma sugestão de melhoria: Evitando repetição de código (Princípio DRY)
Repare que dentro das funções desativandoBotoes() e ativandoBotoes(), você precisou repetir as mesmas linhas de código para o botaoAdicionar e para o botaoSortear. Na programação, sempre que fazemos algo muito parecido várias vezes, podemos simplificar criando uma função genérica ou agrupando os elementos.

Uma forma elegante de fazer isso em JavaScript é criar uma única função que recebe o botão e o estado desejado como parâmetro. Veja como suas duas funções poderiam virar uma só:

function alternarEstadoBotoes(deveDesativar) {
    let botoes = [botaoAdicionar, botaoSortear];

    botoes.forEach(botao => {
        botao.disabled = deveDesativar;
        if (deveDesativar) {
            botao.classList.remove('primary');
            botao.classList.add('desativado');
        } else {
            botao.classList.remove('desativado');
            botao.classList.add('primary');
        }
    });
}

Para usar no seu código, bastaria chamá-la passando true (para desativar) ou false (para ativar):

  • Após sortear: alternarEstadoBotoes(true);
  • Ao reiniciar: alternarEstadoBotoes(false);

Com isso, seu código fica mais curto, fácil de dar manutenção e muito profissional!

Continue compartilhando suas ideias de melhorias com a comunidade do fórum.

Espero que possa ter lhe ajudado!