/pomodoro

Aplicação online que te permite utilizar a técnica de pomodoro!

Primary LanguageTypeScriptMIT LicenseMIT

Project Logo

React JavaScript Figma

🚀 Aplicação que te permite desfrutar do pomodoro! 💥

Project Design 1 Project Design 2 Project Design 3 Project Design 4

Índice

🔖 Sobre

A Técnica Pomodoro é um método de gerenciamento de tempo desenvolvido por Francesco Cirillo no final dos anos 1980.

A técnica usa um cronômetro para dividir o trabalho em intervalos, tradicionalmente de 25 minutos de duração, separados por intervalos curtos - 5 minutos.

Nesta aplicação, além de cronometrar as suas sessões de trabalho/descanso, pode-se personalizar quanto tempo haverá em tais sessões.

🖼️ Layout

O layout desta aplicação está disponível no Figma.

💻 Demo

Essa aplicação foi hospedada pelo Netlify e pode ser encontrada aqui: Pomodoro.

🚀 Tecnologias

Essa aplicação se utiliza das seguintes tecnologias:

📖 O que aprendi

  • Memoização

Para evitar redefinições dos callbacks a cada re-renderização do componente, foi utilizado o useCallback que retornará um callback memoizado, ou seja, mantém um valor salvo para otimizar performance.

Além disso, passando um array de dependências, pode-se redefinir os callbacks condicionalmente, isto é, caso um dos valores passados no arary mude o callback irá ser redefinido.

const handleStart = useCallback(() => {
  startTimer({
    minute: workingTime,
    second: 0,
  })
}, [workingTime, startTimer])

Neste método, o handleStart só irá ser redefinido caso workingTime ou startTimer mudem de valor.

  • Limpeza de efeitos

Graças ao useEffect, é possível executar efeitos colaterais após cada renderização concluída do componente. No entanto, diversas vezes efeitos criam recursos que precisam ser desfeitos ou limpos antes que o componente deixe a tela, como fechar uma Stream ou limpar a memória utilizada por uma variável.

Para fazer isso, basta retornar uma função de limpeza no useEffect, onde esta irá ser executada antes que o componente seja removido da interface.

useEffect(() => {
  let timeout: NodeJS.Timeout

  if (timerState === TimerState.IN_PROGRESS) {
    timeout = setTimeout(handleTime, INTERVAL_TIME)
  }

  return () => clearTimeout(timeout)
}, [time, timerState])

O código acima é um efeito que cria um timeout a cada segundo para modificar o tempo do cronômetro. Caso time ou timerState mudem, o efeito irá ser executado novamente, porém antes disso o clearTimeout(timeout) é executado na função de limpeza para remover o timeout anterior.

Dessa forma não há o risco de haver timeouts duplicados.

  • Referência de elementos

Com o useRef, foi possível capturar a referência de elementos HTML.

const alertRef = useRef<HTMLDivElement>(null)
//...
return (
  <div className="alert-container" ref={alertRef}>
  {/* ... */}
  </div>
)

Dessa forma, pode-se acessar o DOM deste elemento usando alertRef.current.

function animateShowAlert() {
  if (!alertRef) return
  if (!alertRef.current) return

  alertRef.current.classList.add('active-alert')
}

✨ O que falta

  • Reproduzir som a cada fim de sessão
  • Componente para visualizar alertas
  • Componente para barra de progresso circular
  • Componente para campo de entrada do tipo Slider

♻️ Como contribuir

  • Crie um fork desse repositório,
  • Crie uma branch com o nome da sua feature: git checkout -b my-feature
  • Faça um commit das suas alterações: git commit -m 'feat: My new feature'
  • Faça um push da sua branch: git push origin my-feature

📝 Licença

Esse projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.


Feito com ❤️ por Igor Almeida!!