Solucionado (ver solução)

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!

Solucionado
(ver solução)
2
respostas

Versão final do Projeto Fokus

Implementei duas melhorias para o projeto:

  • Ao trocar de contexto (foco para descanso curto, por exemplo), o timer é resetado.
function alterarContexto(contexto) {
  zerar(); // Implementação adicionada
  mostrarTempo();
  buttons.forEach(function (contexto) {
    contexto.classList.remove("active");
  });

  html.setAttribute("data-contexto", contexto);
  img.setAttribute("src", `img/${contexto}.png`);

  switch (contexto) {
    case "foco":
      titulo.innerHTML = `Otimize sua produtividade, <br /> <strong class="app__title-strong">mergulhe no que importa.</strong>`;
      break;
    case "descanso-curto":
      titulo.innerHTML = `Que tal dar uma respirada? <strong class="app__title-strong">Faça uma pausa curta!</strong>`;
      break;
    case "descanso-longo":
      titulo.innerHTML = `Hora de voltar à superfície. <strong class="app__title-strong">Faça uma pausa longa.</strong>`;
      break;
    default:
      break;
  }
}
  • Ao pausar o timer, a música também é pausada; caso o usuário pressione play novamente, a música volta a tocar.
function iniciarOuPausar() {
  if (intervaloID) {
    musicaPause.play();
    musica.pause();
    zerar();
    return;
  } else {
    if (musicaFocoInput.checked) {
      musica.play();
    }
    musicaPlay.play();
    intervaloID = setInterval(contagemRegressiva, 1000);
    iniciarOuPausarButton.textContent = "Pausar";
    imgPlayOuPause.setAttribute("src", "img/pause.png");
  }
}

Página do GitHub com todos os arquivos do projeto: https://github.com/diegofc2002/projeto-fokus.

Página no Vercel com a aplicação: https://projeto-fokus-omega-five.vercel.app/.

Fique à vontade para sugerir melhorias e/ou dicas de implementação para o código.

2 respostas
solução!

Olá, Diego. Como vai?

Parabéns pela iniciativa de ir além do que foi proposto no curso e implementar essas melhorias no projeto Fokus! Adicionar o reset do timer ao mudar de contexto e ajustar o comportamento da música ao pausar o cronômetro deixam a experiência do usuário muito mais fluida e intuitiva.

Analisando o seu código, notei que você aplicou muito bem a manipulação do DOM e a lógica de condições. Para agregar ainda mais valor ao seu aprendizado, separei duas sugestões de melhorias e boas práticas que podem deixar o seu código mais limpo e otimizado.


1. Ajuste no escopo do forEach (Nomes de variáveis)

Na sua função alterarContexto, você utilizou a palavra contexto como argumento da função e também como o parâmetro do forEach:

function alterarContexto(contexto) {
  // ...
  buttons.forEach(function (contexto) {
    contexto.classList.remove("active");
  });
  // ...
}

Embora o JavaScript entenda isso (ocorre um efeito chamado shadowing, onde a variável interna esconde a externa), pode gerar confusão na leitura do código, pois contexto na função principal é uma String (ex: "foco"), mas dentro do forEach representa o elemento do botão HTML.

Sugestão: Mude o nome do parâmetro do forEach para algo como botao ou btn:

buttons.forEach(function (botao) {
  botao.classList.remove("active");
});

2. Otimizando as Strings com Arrow Functions e Template Literals

Para deixar a sua função alterarContexto mais moderna e legível, você pode substituir a função anônima tradicional por uma Arrow Function.

Além disso, no seu switch, os textos do título mudam apenas na parte final. Se você quiser reduzir a repetição da estrutura HTML (Otimize sua produtividade...), poderia isolar apenas as frases variáveis, mas manter a estrutura atual com um código mais enxuto já ajuda bastante. Veja como ficaria com a Arrow Function:

buttons.forEach(botao => botao.classList.remove("active"));

3. Melhoria no controle de áudio

Na função iniciarOuPausar, você acertou em cheio na lógica de pausar a música principal junto com o cronômetro. Uma boa prática para o futuro, caso decida expandir o projeto, é criar uma função dedicada apenas para gerenciar o estado dos áudios (uma função controlarMusica, por exemplo). Isso evita que a função de controle do tempo faça muitas coisas diferentes ao mesmo tempo (o que chamamos de princípio de responsabilidade única).

Seu projeto no GitHub e o deploy na Vercel ficaram excelentes e demonstram muito capricho! Continue praticando essa visão crítica de encontrar pontos de melhoria nos sistemas.

Espero que possa ter lhe ajudado!

Olá, Evandro. Espero que esteja bem!

Muito obrigado pela ajuda e, principalmente, pelas sugestões de melhoria. Em breve pretendo implementá-las no projeto Fokus. Todas fizeram bastante sentido para mim e parecem ser extremamente relevantes para deixar o código ainda mais organizado.

Porém, confesso que não entendi muito bem a seguinte parte da sua segunda sugestão sobre Template Literals:

  • "Além disso, no seu switch, os textos do título mudam apenas na parte final. Se você quiser reduzir a repetição da estrutura HTML (Otimize sua produtividade...), poderia isolar apenas as frases variáveis, mas manter a estrutura atual com um código mais enxuto já ajuda bastante."

Copiei esse trecho e perguntei ao Claude como ficaria o código com essa mudança, para tentar entender melhor a ideia. Aqui está o que ele me mostrou:

"Nos três cases, a estrutura do HTML se repete — sempre tem um texto normal seguido de um <strong>. O que muda entre eles é apenas o conteúdo das frases. A ideia seria separar as frases em variáveis e montar o HTML uma única vez."


// Código sugerido pelo Claude

let textoPrincipal = "";
let textoStrong = "";

switch (contexto) {
  case "foco":
    textoPrincipal = "Otimize sua produtividade,";
    textoStrong = "mergulhe no que importa.";
    break;
  case "descanso-curto":
    textoPrincipal = "Que tal dar uma respirada?";
    textoStrong = "Faça uma pausa curta!";
    break;
  case "descanso-longo":
    textoPrincipal = "Hora de voltar à superfície.";
    textoStrong = "Faça uma pausa longa.";
    break;
}

titulo.innerHTML = `${textoPrincipal} <br /> <strong class="app__title-strong">${textoStrong}</strong>`;

Seria essa a sugestão que você quis dizer? Caso seja, agora consegui compreender perfeitamente como o código ficaria.

Desde já, agradeço.
Tenha um excelente dia!