{"componentChunkName":"component---src-templates-blog-post-js","path":"/minha-implementação-favorita-de-timer-no-javascript-puro/","result":{"data":{"markdownRemark":{"fields":{"slug":"/minha-implementação-favorita-de-timer-no-javascript-puro/"},"frontmatter":{"title":"Minha implementação favorita de Timer!","description":"Na minha opinião uma das melhores implementações de Timer utilizando JavaScript Vanilla!","date":"11 de agosto de 2021","thumbnail":"/assets/img/timeraa.png"},"html":"<h1>Introdução</h1>\n<p>Fala gurizada, beleza? Espero que sim!</p>\n<p>Recentemente (durante meus estudos em <a href=\"https://www.electronjs.org/\">Electron.js</a>) me deparei com a necessidade de implementar um Countdown Timer e acabei vendo a implementação dessa funcionalidade no <a href=\"https://www.youtube.com/maykbrito\">canal do Mayk Brito</a> no YouTube. Achei simplesmente animal a abordagem dele e é claro que eu não deixaria passar essa oportunidade de post, hehe.</p>\n<p>Bora lá?</p>\n<h1>Iniciando projeto</h1>\n<p>Para iniciar o nosso projeto, vamos primeiro criar uma pasta no seu diretório de preferência:</p>\n<p><img src=\"/assets/img/screenshot_1.png\" alt=\"Pasta criada e vazia\" title=\"folder\"></p>\n<p>Após isso, já no editor de código (VSCode), vamos criar nossos primeiros arquivos:</p>\n<ul>\n<li>index.html</li>\n<li>style.css</li>\n<li>App.js</li>\n</ul>\n<p><img src=\"/assets/img/firsts-files.png\" alt=\"Primeiros arquivos\" title=\"firsts files\"></p>\n<p>Como você pode perceber, criei uma pasta chamada <code class=\"language-text\">src/</code> onde colocarei todos os nossos arquivos <code class=\"language-text\">.js</code></p>\n<p>Meu intuito nesse post não é abordar <code class=\"language-text\">HTML</code> e <code class=\"language-text\">CSS</code>, então vou pular esta parte da implementação e mostrar apenas o código final:</p>\n<p><strong><code class=\"language-text\">index.html</code>:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token doctype\"><span class=\"token punctuation\">&lt;!</span><span class=\"token doctype-tag\">DOCTYPE</span> <span class=\"token name\">html</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span> <span class=\"token attr-name\">lang</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>pt-br<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">charset</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>UTF-8<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">http-equiv</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>X-UA-Compatible<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>IE=edge<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>meta</span> <span class=\"token attr-name\">name</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>viewport<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">content</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>width=device-width, initial-scale=1.0<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>title</span><span class=\"token punctuation\">></span></span>Simple Timer<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>title</span><span class=\"token punctuation\">></span></span>\n\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>preconnect<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>https://fonts.gstatic.com<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>https://fonts.googleapis.com/css2?family=Inter:wght@300;600&amp;display=swap<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>stylesheet<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>link</span> <span class=\"token attr-name\">rel</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>stylesheet<span class=\"token punctuation\">\"</span></span> <span class=\"token attr-name\">href</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>style.css<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">></span></span>\n  \n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p><strong><code class=\"language-text\">style.css</code>:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"css\"><pre class=\"language-css\"><code class=\"language-css\"><span class=\"token selector\">*</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">margin</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">padding</span><span class=\"token punctuation\">:</span> 0<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">box-sizing</span><span class=\"token punctuation\">:</span> border-box<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">:root</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-family</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"Inter\"</span><span class=\"token punctuation\">,</span> sans-serif<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 180%<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">body</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">min-height</span><span class=\"token punctuation\">:</span> 100vh<span class=\"token punctuation\">;</span>\n\n  <span class=\"token property\">display</span><span class=\"token punctuation\">:</span> flex<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">flex-direction</span><span class=\"token punctuation\">:</span> column<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">align-items</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n  <span class=\"token property\">justify-content</span><span class=\"token punctuation\">:</span> center<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token selector\">span</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token property\">font-size</span><span class=\"token punctuation\">:</span> 300%<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O que eu fiz foi simplesmente iniciar o nosso <code class=\"language-text\">index.html</code> com sua estrutura padrão, linkando o nosso arquivo css e a nossa fonte direto do Google Fonts, além de adicionar alguns estilos em nosso <code class=\"language-text\">style.css</code>.</p>\n<p>Tranquilo por enquanto, né?</p>\n<p>Eu vou utilizar a extensão Live Server do VSCode para visualizar em tempo real o nosso projeto no navegador. Caso você queira ver mais sobre essa e muitas outras extensões legais do VSCode, eu já fiz um <a href=\"https://www.gianlucca.dev/extens%C3%B5es-super-hiper-legais-para-vscode/\">post sobre este assunto</a>, é só clicar e conferir!</p>\n<p>Parte inicial feita! Bora para os nossos scripts?</p>\n<h1>Iniciando o App.js</h1>\n<p>Agora começa a brincadeira!</p>\n<p>Antes de partimos para o <code class=\"language-text\">Timer</code> em si, vamos iniciar o nosso <code class=\"language-text\">App.js</code>.</p>\n<p>O App.js será o nosso <a href=\"https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Modules\">Módulo JavaScript</a> principal.</p>\n<blockquote>\n<p>Modulo JavaScript? Que isso? 🤔</p>\n</blockquote>\n<p>Os Módulos em JavaScript são uma forma de compartilhar informações entre scripts, onde todo script que realizar a importação (<code class=\"language-text\">import</code>) de um módulo poderá utilizar suas funções ou informações que foram expostas (<code class=\"language-text\">export</code>). Assim evitamos carregar vários arquivos em nosso <code class=\"language-text\">HTML</code>! Super legal, né?</p>\n<p>Bora ver na prática então:</p>\n<p><strong><code class=\"language-text\">App.js</code>:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> App <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> App <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>E vamos importar este módulo no nosso <code class=\"language-text\">HTML</code>.</p>\n<p><strong><code class=\"language-text\">index.html</code>:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"html\"><pre class=\"language-html\"><code class=\"language-html\"><span class=\"token doctype\"><span class=\"token punctuation\">&lt;!</span><span class=\"token doctype-tag\">DOCTYPE</span> <span class=\"token name\">html</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>html</span> <span class=\"token attr-name\">lang</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>pt-br<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>head</span><span class=\"token punctuation\">></span></span>\n  ...\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>head</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>body</span><span class=\"token punctuation\">></span></span>\n  \n  <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>script</span> <span class=\"token attr-name\">type</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>module<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token script\"><span class=\"token language-javascript\">\n    <span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> App <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./src/App.js'</span><span class=\"token punctuation\">;</span>\n\n    App<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  </span></span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>script</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>body</span><span class=\"token punctuation\">></span></span>\n<span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>html</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>Perceba que: para que possamos utilizar os Módulos JavaScript, é preciso adicionar o atributo <code class=\"language-text\">type=&quot;module&quot;</code> na tag <code class=\"language-text\">&lt;script&gt;</code>, assim o <code class=\"language-text\">HTML</code> entende que se trata de um <code class=\"language-text\">Módulo JavaScript</code>.</p>\n<p>A sintaxe é bem tranquila!</p>\n<p>A instrução <code class=\"language-text\">import { App } from &#39;./src/App.js&#39;;</code> é responsável pela importação do arquivo.</p>\n<p>Já a chamada <code class=\"language-text\">App.init();</code> é responsável pela inicialização do nosso <code class=\"language-text\">App.js</code>, onde eu defini o método <code class=\"language-text\">init()</code>.</p>\n<p>Mas essa importação só é possível porque eu exportei o nosso módulo <code class=\"language-text\">App.js</code> com a instrução <code class=\"language-text\">export { App };</code>.</p>\n<p>Molezinha, né? Bora seguir!</p>\n<h1>Implementando o Timer</h1>\n<p>Agora que o conceito de módulos já foi entendido, vamos seguir para a implementação do nosso Timer.</p>\n<p>Vamos criar nosso arquivo <code class=\"language-text\">Timer.js</code> e importá-lo no nosso <code class=\"language-text\">App.js</code>.</p>\n<p><code class=\"language-text\">Timer.js</code><strong>:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> Timer <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> Timer <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong><code class=\"language-text\">App.js</code>:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> Timer <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'./Timer.js'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> App <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    Timer<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> App <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Arquivo importado e iniciado, vamos colocar alguma lógica em ação agora.</p>\n<p>Quando falamos em Timers em JS, geralmente falamos na função nativa <a href=\"https://developer.mozilla.org/pt-BR/docs/Web/API/WindowOrWorkerGlobalScope/setInterval\"><code class=\"language-text\">setInterval()</code></a> Com ele nós podemos executar uma <strong>determinada função</strong>, sempre repetindo em um <strong>determinado intervalo</strong>.</p>\n<p>E estas duas opções são exatamente os parâmetros que o <code class=\"language-text\">setInterval()</code> recebe.</p>\n<p>Para implementá-lo, vou primeiro criar um novo método no meu <code class=\"language-text\">Timer.js</code> para cuidar desta parte da aplicação e em seguida referencia-lo como a função que o <code class=\"language-text\">setInterval()</code> precisa. Além disso, vamos passar <code class=\"language-text\">1000</code> como o segundo parâmetro, pois a função espera receber um valor em milissegundos, que no nosso caso será um intervalo de <strong>1 segundo</strong>.</p>\n<p>E como mágica nós conseguimos abstrair a lógica do <code class=\"language-text\">init()</code> e deixá-la apenas no <code class=\"language-text\">countdown()</code>:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> Timer <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>countdown<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function\">countdown</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> Timer <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Para seguimos com a lógica do countdown(), precisamos antes definir algumas variáveis que serão uteis nesse método.</p>\n<p>Vamos definir então:</p>\n<ul>\n<li>\n<p><code class=\"language-text\">time: number * 60</code></p>\n<p>Esta variável será responsável pelo tempo fixo do nosso Timer (Exemplo: 25 minutos). Este valor fixo será multiplicado por 60 pois queremos ele em segundos.</p>\n</li>\n<li>\n<p><code class=\"language-text\">currentTime: 0</code></p>\n<p>Esta é a variável que será atualizada a cada ciclo do nosso <code class=\"language-text\">setInterval()</code>, sendo usada de referência para o próximo ciclo. Ele sempre iniciará com o valor de <code class=\"language-text\">time</code>, pois nosso contador é no formato decrescente.</p>\n</li>\n<li>\n<p><code class=\"language-text\">interval: null</code></p>\n<p>Esta variável vai armazenar o <code class=\"language-text\">setInterval()</code> em si, para que possamos finalizá-lo assim que o tempo do contador zerar, evitando tempos negativos no nosso Timer.</p>\n</li>\n</ul>\n<p>E a implementação ficou assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> Timer <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 25 minutos</span>\n  time<span class=\"token operator\">:</span> <span class=\"token number\">25</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span><span class=\"token punctuation\">,</span>\n  \n  currentTime<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n  interval<span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  \n  <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    Timer<span class=\"token punctuation\">.</span>currentTime <span class=\"token operator\">=</span> Timer<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">;</span>\n    Timer<span class=\"token punctuation\">.</span>interval <span class=\"token operator\">=</span> <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>countdown<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function\">countdown</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> Timer <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Com as variáveis definidas, nós podemos partir para a lógica do <code class=\"language-text\">countdown()</code>, subtraindo o valor de <code class=\"language-text\">Timer.currentTime</code> e implementando a tratativa para evitar valores negativos.</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> Timer <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 25 minutos</span>\n  time<span class=\"token operator\">:</span> <span class=\"token number\">25</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span><span class=\"token punctuation\">,</span>\n  \n  currentTime<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n  interval<span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  \n  <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    Timer<span class=\"token punctuation\">.</span>currentTime <span class=\"token operator\">=</span> Timer<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">;</span>\n    Timer<span class=\"token punctuation\">.</span>interval <span class=\"token operator\">=</span> <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>countdown<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function\">countdown</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    Timer<span class=\"token punctuation\">.</span>currentTime<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>currentTime <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">clearInterval</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>interval<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>currentTime<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> Timer <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>E dando uma olhada no nosso console do navegador, devemos ver isso:</p>\n<p><img src=\"/assets/img/timer.png\" alt=\"timer\" title=\"timer\"></p>\n<p>Perceba que para a tratativa de valores negativos, eu implementei uma validação e apliquei a função nativa <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/clearInterval\"><code class=\"language-text\">clearInterval()</code></a>, passando como parâmetro o nosso <code class=\"language-text\">Timer.interval.</code> Desta forma, quando o valor alcançar 0, nós finalizamos o <code class=\"language-text\">setInterval()</code>.</p>\n<p>Olha que sensacional, já temos um Countdown Timer funcionando!</p>\n<p>Claro que ainda não está formatado e nem renderizando na tela, mas já é um grande passo!</p>\n<p>E falando em formatação, bora implementar isso?</p>\n<p>A primeira coisa que eu vou fazer será criar as nossas funções para obter os <strong>Minutos</strong> e <strong>Segundos</strong> a partir destes milissegundos que nós já temos, e para isso vamos criar duas funções:</p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> Timer <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 25 minutos</span>\n  time<span class=\"token operator\">:</span> <span class=\"token number\">25</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span><span class=\"token punctuation\">,</span>\n  \n  currentTime<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n  interval<span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  \n  <span class=\"token function-variable function\">timeToMinutes</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>time <span class=\"token operator\">/</span> <span class=\"token number\">60</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function-variable function\">timeToSeconds</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> time <span class=\"token operator\">%</span> <span class=\"token number\">60</span><span class=\"token punctuation\">,</span>\n  \n  <span class=\"token function-variable function\">formatTime</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">String</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">padStart</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"0\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  \n  <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    Timer<span class=\"token punctuation\">.</span>currentTime <span class=\"token operator\">=</span> Timer<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">;</span>\n    Timer<span class=\"token punctuation\">.</span>interval <span class=\"token operator\">=</span> <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>countdown<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function\">countdown</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    Timer<span class=\"token punctuation\">.</span>currentTime<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>currentTime <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">clearInterval</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>interval<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>currentTime<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> Timer <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<blockquote>\n<p>Vish, complicou!</p>\n</blockquote>\n<p>Caaaalma, vamos por partes!</p>\n<p>O que eu fiz foi criar três funções que recebem o nosso <code class=\"language-text\">time</code> como parâmetro.</p>\n<p>A primeira função (<code class=\"language-text\">timeToMinutes</code>) faz um calculo para transformarmos o valor passado em milissegundos para minutos, dividindo-o por 60. E este calculo esta dentro de um <a href=\"https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Math/floor\"><code class=\"language-text\">Math.floor()</code></a> para que o resultado seja sempre arredondado para baixo. Assim temos o nosso valor formatado para minutos!</p>\n<p>A segunda função (<code class=\"language-text\">timeToSeconds</code>) é responsável pela formatação do nosso valor em segundos, e ela faz isso utilizando o resto da divisão do <code class=\"language-text\">time</code> por <code class=\"language-text\">60</code>, assim obtemos sempre o resto já formatado para segundos! Animal, né não!?</p>\n<p>A última formatação (<code class=\"language-text\">formatTime</code>) cria uma pequena regra para que números menores que 10, tenham um \"0\" adicionado em seu início. Esta regra já é bem conhecida mas a forma que implementamos aqui é de cair o queixo! <br>\nPara isso eu utilizei a função <a href=\"https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/String/padStart\"><code class=\"language-text\">padStart()</code></a> que basicamente recebe um parâmetro e valida se a string possui menos caracteres que este valor, caso sim, a string receberá no seu início uma outra string, ocupando-a até atingir o length especificado.</p>\n<p>Show de bola, todos os nossos valores agora estão formatados!</p>\n<h1>Renderizando o timer em nossa view</h1>\n<p>Por se tratar de outra funcionalidade, vamos criar um novo arquivo (<code class=\"language-text\">View.js</code>) e referenciá-lo no nosso <code class=\"language-text\">Timer.js</code>.</p>\n<p><strong><code class=\"language-text\">View.js</code>:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> View <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> View <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p><strong><code class=\"language-text\">Timer.js</code>:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> View <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./View.js\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> Timer <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// 25 minutos</span>\n  time<span class=\"token operator\">:</span> <span class=\"token number\">25</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span><span class=\"token punctuation\">,</span>\n  \n  currentTime<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n  interval<span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  \n  <span class=\"token function-variable function\">timeToMinutes</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>time <span class=\"token operator\">/</span> <span class=\"token number\">60</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function-variable function\">timeToSeconds</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> time <span class=\"token operator\">%</span> <span class=\"token number\">60</span><span class=\"token punctuation\">,</span>\n  \n  <span class=\"token function-variable function\">formatTime</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">String</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">padStart</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"0\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  \n  <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    Timer<span class=\"token punctuation\">.</span>currentTime <span class=\"token operator\">=</span> Timer<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">;</span>\n    Timer<span class=\"token punctuation\">.</span>interval <span class=\"token operator\">=</span> <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>countdown<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function\">countdown</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    Timer<span class=\"token punctuation\">.</span>currentTime<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>currentTime <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">clearInterval</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>interval<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>currentTime<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> Timer <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Show!</p>\n<p>Agora vamos renderizar dinamicamente os minutos e segundos dentro do nosso <code class=\"language-text\">HTML</code>.</p>\n<p><strong><code class=\"language-text\">View.js</code>:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">const</span> View <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token parameter\"><span class=\"token punctuation\">{</span>minutes<span class=\"token punctuation\">,</span> seconds<span class=\"token punctuation\">}</span></span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    document<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">.</span>innerHTML <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token template-punctuation string\">`</span><span class=\"token string\">\n    &lt;p>Simple Timer&lt;/p>\n    &lt;span></span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>minutes<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">:</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>seconds<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">&lt;/span>\n    </span><span class=\"token template-punctuation string\">`</span></span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> View <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Perfeito! Agora precisamos apenas referenciar essa renderização no nosso <code class=\"language-text\">Timer.js</code>. Para isso vou criar uma nova função chamada <code class=\"language-text\">updateView()</code>, que será responsável por essa funcionalidade. Além de referencia-la em nosso <code class=\"language-text\">countdown()</code>.</p>\n<p><strong><code class=\"language-text\">Timer.js</code>:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> View <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./View.js\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> Timer <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  time<span class=\"token operator\">:</span> <span class=\"token number\">25</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span><span class=\"token punctuation\">,</span>\n  currentTime<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n  interval<span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function-variable function\">timeToMinutes</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>time <span class=\"token operator\">/</span> <span class=\"token number\">60</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function-variable function\">timeToSeconds</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> time <span class=\"token operator\">%</span> <span class=\"token number\">60</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function-variable function\">formatTime</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">String</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">padStart</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"0\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    Timer<span class=\"token punctuation\">.</span>currentTime <span class=\"token operator\">=</span> Timer<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">;</span>\n    Timer<span class=\"token punctuation\">.</span>interval <span class=\"token operator\">=</span> <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>countdown<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function\">countdown</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    Timer<span class=\"token punctuation\">.</span>currentTime<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n\n    Timer<span class=\"token punctuation\">.</span><span class=\"token function\">updateView</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>currentTime <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">clearInterval</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>interval<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function\">updateView</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> Timer <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>E para finalizar com chave de ouro, vamos apenas passar os nosso valores formatados (utilizando nossas funções de formatação) para a <code class=\"language-text\">View.js</code>.</p>\n<p><strong><code class=\"language-text\">Timer.js</code>:</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> View <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">\"./View.js\"</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> Timer <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  time<span class=\"token operator\">:</span> <span class=\"token number\">25</span> <span class=\"token operator\">*</span> <span class=\"token number\">60</span><span class=\"token punctuation\">,</span>\n  currentTime<span class=\"token operator\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n  interval<span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function-variable function\">timeToMinutes</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">floor</span><span class=\"token punctuation\">(</span>time <span class=\"token operator\">/</span> <span class=\"token number\">60</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function-variable function\">timeToSeconds</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> time <span class=\"token operator\">%</span> <span class=\"token number\">60</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function-variable function\">formatTime</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">(</span><span class=\"token parameter\">time</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token function\">String</span><span class=\"token punctuation\">(</span>time<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">padStart</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"0\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    Timer<span class=\"token punctuation\">.</span>currentTime <span class=\"token operator\">=</span> Timer<span class=\"token punctuation\">.</span>time<span class=\"token punctuation\">;</span>\n    Timer<span class=\"token punctuation\">.</span>interval <span class=\"token operator\">=</span> <span class=\"token function\">setInterval</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>countdown<span class=\"token punctuation\">,</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function\">countdown</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    Timer<span class=\"token punctuation\">.</span>currentTime<span class=\"token operator\">--</span><span class=\"token punctuation\">;</span>\n\n    Timer<span class=\"token punctuation\">.</span><span class=\"token function\">updateView</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>currentTime <span class=\"token operator\">===</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token function\">clearInterval</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>interval<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token function\">updateView</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> minutes <span class=\"token operator\">=</span> Timer<span class=\"token punctuation\">.</span><span class=\"token function\">formatTime</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span><span class=\"token function\">timeToMinutes</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>currentTime<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> seconds <span class=\"token operator\">=</span> Timer<span class=\"token punctuation\">.</span><span class=\"token function\">formatTime</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span><span class=\"token function\">timeToSeconds</span><span class=\"token punctuation\">(</span>Timer<span class=\"token punctuation\">.</span>currentTime<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    View<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> minutes<span class=\"token punctuation\">,</span> seconds <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token punctuation\">{</span> Timer <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>E quando nós abrimos o navegador, saca só o resultado:</p>\n<p><img src=\"/assets/img/timeraa.png\" alt=\"timer funcionando\" title=\"timer working\"></p>\n<h1>Conclusão</h1>\n<p>Resultado incrível, né? Eu diria que a função <code class=\"language-text\">padStart()</code> para a formatação de números foi a cereja do bolo!</p>\n<p>Por hoje é só, espero que os assuntos abordados sejam úteis para você! Nos vemos no próximos post. </p>\n<p>Até!</p>","timeToRead":9}},"pageContext":{"slug":"/minha-implementação-favorita-de-timer-no-javascript-puro/","previousPost":{"frontmatter":{"title":"Clonar um site NÃO te torna um Desenvolvedor Front-end!"},"fields":{"slug":"/clonar-um-site-não-te-torna-um-desenvolvedor-front-end/"}},"nextPost":null}},"staticQueryHashes":["1246478059","1873617545","764694655"]}