|[email protected]

Criar uma aplicação em React para praticar ou testar novas features do framework é algo comum entre Devs. Nesse sentido vamos explorar as funções de timer do Javascript usando alguns hooks como useState, useRef, useEffect e useMemo. Sobretudo aprendendo os fundamentos além de saber como utilizar áudio no React.

Mentoria React - Criando um Pomodoro Timer
Mentoria React - Criando um Pomodoro Timer

A técnica Pomodoro é um método de gerenciamento de tempo desenvolvido por Francesco Cirillo no final dos anos 1980. Em resumo a técnica consiste na utilização de um cronômetro para dividir o trabalho em períodos de 25 minutos, separados por breves intervalos.

Assim nossa missão ao desenvolver essa aplicação é disponibilizar para o usuário um contador regressivo de tempo onde ele possa escolher o valor do timer e ao finalizar escute um som que anuncie o final do período de foco no trabalho.

Instalando e configurando

O que preciso ter instalado no meu computador?

  • Node
  • NPM

Primeiramente você precisar ter instalado o Node e NPM. Você pode rodar no seu terminal os comandos node -v e npm -v para verificar se estão instalados e suas versões.

Caso sua versão do NPM seja inferior a 5.2.0 você precisará atualizar para usar o NPX, rode o comando:

npm install -g npm

Com o Node e NPM instalados vamos instalar nossa aplicação utilizando o create-react-app. Abra seu terminal, navegue até a pasta onde deseja instalar o projeto e execute o comando:

npx create-react-app diversifica-pomodoro

O processo pode levar alguns minutos. Após instalado vamos entrar na pasta da aplicação:

cd diversifica-pomodoro

Abra a pasta no editor de código, aqui vamos utilizar o Visual Studio Code. Você pode utilizar um editor diferente sem problemas. Na maioria dos sistemas operacionais para abrir a pasta onde você está no terminal no VS Code você pode executar o comando:

$ code .

O ponto se refere a pasta atual e o VS Code abrirá ela com todos os arquivos instalados pelo create-react-app. Muitos arquivos não utilizaremos, vamos excluir: App.css, App.test.js, index.css, logo.svg, reportWebVitals.js e setupTests.js. Todos os arquivos marcados com a seta vermelha deverão ser excluídos pois não iremos utilizar:

Exclua esses arquivos.
Exclua esses arquivos.

Agora vamos criar uma pasta chamada components conforme imagem abaixo e dentro dela nosso arquivo pomodoro.js que será o componente com a estrutura do timer. Logo depois crie também uma pasta css e dentro dela um arquivo style.css onde colocaremos nosso CSS. Dessa maneira a estrutura ficará como abaixo, os itens em verde são os que criamos:

Novos arquivos e pastas em verde.
Novos arquivos e pastas em verde.

Criando estrutura inicial

O primeiro arquivo que iremos alterar será o index.js, vamos excluir itens não utilizados e importar nosso CSS, o arquivo ficará assim:

index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import './css/style.css';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

No arquivo App.js vamos importar o componente Pomodoro e instanciá-lo. O arquivo App.js ficará com esse código:

import React from 'react'
import Pomodoro from './components/pomodoro';

function App() {sete s
  return (
    <div className="App">
      <Pomodoro />
    </div>
  );
}

export default App;

Agora que instalamos e criamos a estrutura inicial do nosso projeto iremos criar o layout da aplicação. Crie uma pasta chamada components dentro de src/ e um arquivo dentro dela chamado pomodoro.js, o caminho será esse: src/components/pomodoro.js, copie o código abaixo e cole dentro do arquivo:

pomodoro.js (versão 0.1)

import React from 'react'

function Pomodoro() {
  return (
    <div>
      <div className='container'>
        <h1>Pomodoro Timer</h1>
        <div className="top">
          <p>Vou focar durante </p>
          <input 
            type="number"
            maxLength="60"
          />
          <p>minutos</p>
        </div>
        <div className='timerPomo'>25:00</div>
        <div className='flexButtons'>
          <button>Iniciar</button>
          <button>Resetar</button>
        </div>
      </div>
      <div className="shape-divider shape-divider-bottom">
        <svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 2000 245" preserveAspectRatio="xMinYMin">
          <path fill="#FFF" opacity="0.5" d="M2028.47,246.15v-39.09C1945.6,199.68,1869.96,195.8,1803,194c-71.99-1.93-137.53-4.37-225,1 c-88.04,5.4-120.19,13.36-233,19c-55.14,2.76-102.19,5-165,3c-37.5-1.2-102.55-4.6-200-19c-89.42-13.21-145.61-26.73-276-57 C520.19,98.33,428.29,76.99,402,72C243.75,41.93,118.41,28.67,37,22c-26.77-2.19-49.49-3.73-66.33-4.77v229.03h2057.82 C2028.48,246.22,2028.47,246.19,2028.47,246.15z"></path>
          <path fill="#FFF" d="M1816,212c-58.78-4.11-116.63-8.07-195-9c-43.43-0.51-105.81-1.13-187,4c-33.73,2.13-29.27,2.64-127,10 c-86.52,6.52-110.13,7.64-137,8c-11.31,0.15-53.81,0.58-110-3c-54.49-3.47-108.08-9.83-185-23c-69.21-11.85-114.89-21.96-202-41 c-262.93-57.46-291.75-62.62-318-67C229.24,70,155.97,65.58,121,64C60.05,61.24,8.67,62.27-28.77,63.95v187.41H2028V232 C1943.49,221.98,1871.42,215.88,1816,212z"></path>
        </svg>
      </div>
    </div>
  )
}

export default Pomodoro

Agora vamos criar o arquivo de estilos. Dentro da pasta src/ crie uma pasta chamada css/ e um arquivo dentro de css chamado style.css. O caminho do arquivo será esse src/css/style.css, copie o código abaixo e cole dentro do arquivo style.css:

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
  margin: 0;
  padding: 0;
  border: 0;
  font-size: 100%;
  font: inherit;
  vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section {
  display: block;
}
body {
  line-height: 1;
}
ol, ul {
  list-style: none;
}
blockquote, q {
  quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
  content: '';
  content: none;
}
table {
  border-collapse: collapse;
  border-spacing: 0;
}

body {
  background-color: #eff1f3;
  color: #434343;
  font-family: 'Poppins', sans-serif;
}
.container {
  display: block;
  width: 400px;
  margin: -220px auto 0;
  background-color: #854bea2b;
  border-radius: 10px;
  padding: 20px 40px 40px;
  top: 40%;
  position: absolute;
  left: 50%;
  margin-left: -240px;
}
h1 {
  text-transform: uppercase;
  text-align: center;
  font-size: 2.3em;
  font-family: 'Poppins', sans-serif;
  font-weight: 500;
  margin: 30px 0 40px 0;
}
button {
  cursor: pointer;
  background: #854bea!important;
  color: #fff;
  font-size: 16px;
  width: 100%;
  display: block;
  margin: 0 auto;
  border: 0;
  border-radius: 5px;
  height: 50px;
  box-shadow: 0 0.375rem 0 #673ab7;
}
.timerPomo {
  font-size: 120px;
  text-align: center;
  padding: 0;
  margin: 40px 0 40px;
}
.flexButtons {
  display: flex;
  column-gap: 8px;
}
.buttonActive {
  transform: translateY(0.375rem);
  box-shadow: none;
}
button:active {
  transform: translateY(0.375rem);
  box-shadow: none;
}
.mt45 {
  margin-top: 45px;
}
input {
  margin: -7px 0 0 0;
  height: 28px;
  max-width: 45px;
  background: transparent;
  border: none;
  border-bottom: 1px solid #4e4c4c;
  text-align: center;
  font-size: 16px;
}
.top {
  display: flex;
  column-gap: 11px;
}
textarea:focus, input:focus{
  outline: none;
}
.shape-divider {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
}

Para rodar a aplicação, abra o terminal, dentro da pasta do projeto e rode o seguinte comando:

$ npm start

Agora acessando http://localhost:3000 você deve ver nossa aplicação criando forma como na imagem abaixo:

Primeira estrutura com CSS.
Primeira estrutura com CSS.

Seguimos para a próxima etapa de como criar uma aplicação em React onde iremos criar as funções do timer e dar vida a aplicação. Próxima parte:

-

Parte 2 - Tutorial React Pomodoro - Funções e Componente

-

DiversificaDev - Oferecendo mentoria gratuita para iniciantes em tecnologia e programação para estimular a diversidade na área além de soluções digitais como criação de sites, gestão mídias sociais, estratégias de marketing e otimização de sites SEO.



Nenhum comentário

Comentar

Clique no Captcha para enviar

Inscreva-se na nossa Newsletter