<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Iago Angelim Costa Cavalcante</title>
    <description>The latest articles on DEV Community by Iago Angelim Costa Cavalcante (@iagocavalcante).</description>
    <link>https://dev.to/iagocavalcante</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F138251%2F5ce5fdc1-0c55-4233-a77b-9aa813d95bb0.jpeg</url>
      <title>DEV Community: Iago Angelim Costa Cavalcante</title>
      <link>https://dev.to/iagocavalcante</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iagocavalcante"/>
    <language>en</language>
    <item>
      <title>Criando componente de share com React/NextJS</title>
      <dc:creator>Iago Angelim Costa Cavalcante</dc:creator>
      <pubDate>Fri, 08 Sep 2023 14:08:20 +0000</pubDate>
      <link>https://dev.to/iagocavalcante/criando-componente-de-share-com-reactnextjs-3jdf</link>
      <guid>https://dev.to/iagocavalcante/criando-componente-de-share-com-reactnextjs-3jdf</guid>
      <description>&lt;h2&gt;
  
  
  O problema
&lt;/h2&gt;

&lt;p&gt;Em um projeto em que eu me time estamos trabalhando enfrentamos o desafio de criar um componente para dar a possibilidade do usuário compartilhar algo que ele recebeu pelo email nas principais redes sociais (whatsapp, twitter, facebook e email) além da possibilidade de copiar o link exibido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solução
&lt;/h2&gt;

&lt;p&gt;Para resolver este problema, começamos a pensar em como poderíamos pegar algo enviado por emai, abrir a página web daquele email e ativar o compartilhamento. A solução seria no link compartilhar que é recebido por email, adicionar uma &lt;code&gt;query string&lt;/code&gt; indicando que será aberto o modal contendo os links de compartilhamento nas respectivas redes.&lt;/p&gt;

&lt;p&gt;O link acima é representado no email pela seguinte tag&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://linkqualquer.com/nome/id?share=true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Compartilhe! -&amp;gt;
&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso estamos aptos a clicar no link e ser redirecionado para nossa página web que irá receber o parâmetro e realizar alguma ação. &lt;/p&gt;

&lt;p&gt;Para verificar os parametros de rota, iremos utilizar hook roteador do &lt;code&gt;NextJS&lt;/code&gt; que iremos importar da seguinte forma na nossa página:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useRouter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/router&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E no componente iremos utilizar a variável &lt;code&gt;query&lt;/code&gt; que o &lt;code&gt;useRouter()&lt;/code&gt; disponibiliza para nós. Para executar a verificação no momento que entramos na página, iremos utilizar o &lt;code&gt;useEffect&lt;/code&gt; e nosso componente ficará da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;share&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Temos a verificação inicial se tem o parametro &lt;code&gt;share&lt;/code&gt; na &lt;em&gt;query string&lt;/em&gt; e com isso podemos implementar a lógica de exibição do modal e definir os dados que serão compartilhados. Mas vamos deixar essa primeira parte guardadinha e começar a trabalhar no nosso componente de share que será um modal. &lt;/p&gt;

&lt;h4&gt;
  
  
  ** Obs: No projeto estamos utilizando o &lt;em&gt;framework de UI chamado Tailwind&lt;/em&gt; **
&lt;/h4&gt;

&lt;p&gt;Nosso componente irá receber apenas 3 propriedades, sendo elas a &lt;code&gt;url&lt;/code&gt; do conteúdo que vamos compartilhar, o &lt;code&gt;status&lt;/code&gt; que será responsável por mostrar ou não o modal e a &lt;code&gt;action&lt;/code&gt; que define quando o modal será fechado.&lt;/p&gt;

&lt;p&gt;Dentro do componente teremos duas funções onde uma será responável por tratar a ação dos botões de compartilhamento &lt;code&gt;handleSharing()&lt;/code&gt; e a outra será responsável por copiar o link e jogar dentro do clipboard (mesma ação do &lt;em&gt;ctrl&lt;/em&gt; + &lt;em&gt;c&lt;/em&gt;) chamada de &lt;code&gt;handleCopy&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Com nosso componente criado, vamos voltar a página onde tem o conteúdo a ser compartilhada e onde fazemos a verificação da &lt;em&gt;query string&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Lá iremos implementar a importação do componente e quando que ele será exebido, nossa página ficará da seguinte forma: &lt;/p&gt;

&lt;p&gt;Agora temos a lógica completa de exibição do modal ácima. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Inicialmente pode ser algo assustador para quem ta começando a desenvolver e ter que pensar em resolver esse problema, mas é mais simples do que parece, só precisamos relembrar de alguns conceitos e unificar nessa solução.&lt;/p&gt;

&lt;p&gt;Poderíamos refatorar essa solução para algo um pouco melhor, porém nosso objetivo aqui era ser o mais didático possível.&lt;/p&gt;

&lt;p&gt;Agradeço a leitura de todos(as).&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Como resolver corretamente cache node_modules em discos externos</title>
      <dc:creator>Iago Angelim Costa Cavalcante</dc:creator>
      <pubDate>Fri, 08 Sep 2023 14:07:35 +0000</pubDate>
      <link>https://dev.to/iagocavalcante/como-resolver-corretamente-cache-nodemodules-em-discos-externos-3a9h</link>
      <guid>https://dev.to/iagocavalcante/como-resolver-corretamente-cache-nodemodules-em-discos-externos-3a9h</guid>
      <description>&lt;h2&gt;
  
  
  Problema
&lt;/h2&gt;

&lt;p&gt;Recentemente adquiri um &lt;code&gt;ssd externo&lt;/code&gt;para armazenar alguns vídeos que eu estou produzindo e também deixar os projetos que estou trabalhando nesse Volume externo.&lt;/p&gt;

&lt;p&gt;Primeiro passo foi mover tudo &lt;strong&gt;sem a &lt;code&gt;node_modules&lt;/code&gt;&lt;/strong&gt; com o comando do unix &lt;code&gt;mv&lt;/code&gt; e após concluído criei um link simbólico para o meu novo workspace.&lt;/p&gt;

&lt;p&gt;Ao instalar as dependências em projetos node, percebi que as dependências estavam ocupando &lt;code&gt;GB&lt;/code&gt; de armazenamento e isso me gerou um questionamento, logo percebi que isso ocorria por não compartilhar o cache com o disco que fica no meu computador onde se encontra o &lt;code&gt;node&lt;/code&gt;e &lt;code&gt;npm&lt;/code&gt; instalados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solução
&lt;/h2&gt;

&lt;p&gt;A resolução foi aparentemente simples, com o comando &lt;code&gt;npm config ls -l&lt;/code&gt; listei todas as configurações default do node, e descobri onde o &lt;code&gt;cache&lt;/code&gt; fica localizado e com isso o &lt;code&gt;npm/yarn&lt;/code&gt; conseguirá compartilhar as dependências que já foram instaladas previamente. &lt;/p&gt;

&lt;p&gt;Com isso basta instalar as dependências do projeto com o comando &lt;code&gt;yarn install --cache /Users/iagocavalcante/.npm&lt;/code&gt; ou &lt;code&gt;npm i --cache /Users/iagocavalcante/.npm&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extra
&lt;/h2&gt;

&lt;p&gt;Enfrentei problemas com &lt;code&gt;node-sass&lt;/code&gt; e &lt;code&gt;node-gyp&lt;/code&gt; no M1 e a versão atual do xcode pra compilar as coisas e com isso descobri que para rodar e buildar essas dependências era necessário executar o install da seguinte forma &lt;code&gt;CXXFLAGS="--std=c++17" yarn install --cache /Users/iagocavalcante/.npm&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Com isso resolvi documentar as resoluções para esses problemas, caso mais pessoas precisem resolver esse problema.&lt;/p&gt;

&lt;p&gt;Obrigado a todos &amp;lt;3. &lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Phoenix Internationalization</title>
      <dc:creator>Iago Angelim Costa Cavalcante</dc:creator>
      <pubDate>Fri, 08 Sep 2023 14:04:29 +0000</pubDate>
      <link>https://dev.to/iagocavalcante/phoenix-internationalization-25ec</link>
      <guid>https://dev.to/iagocavalcante/phoenix-internationalization-25ec</guid>
      <description>&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;You need to internationalize your website. You decide to use gettext and your system uses LiveView. Everything you find seems too complicated or doesn't easily meet your needs without a lot of configuration.&lt;/p&gt;

&lt;p&gt;How can we use LiveSession to take care of our application's i18n?&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;With LiveView 0.18 we can have functional components and easily trigger an event from our functional component and intercept them in a general way using LiveSession.&lt;/p&gt;

&lt;p&gt;This was the simplest approach I could think of to share and modify the language of the page we are accessing.&lt;/p&gt;

&lt;p&gt;With a global assign, we can access the current locale and modify the language of the page using the with_locale from gettext.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attempt
&lt;/h2&gt;

&lt;p&gt;First, we need to define a second language for our i18n tool (gettext). To do this, simply go to your project directory through the terminal and run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;mix gettext.merge priv/gettext --locale pt_BR
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The chosen language was &lt;code&gt;pt_BR&lt;/code&gt;, but it can be any available language you want to use.&lt;/p&gt;

&lt;p&gt;With our new language set, we will now create our live session that will take care of setting our default language in the assigns for all live views and will have the method to handle language switching in the system.&lt;/p&gt;

&lt;p&gt;Inside our &lt;code&gt;_web&lt;/code&gt; folder, we will create a module called locale.ex, and it will have the following structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;PhoenixI18nWeb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Locale&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="no"&gt;Phoenix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;LiveView&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;Phoenix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Component&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;on_mount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:default&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;

    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:cont&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="n"&gt;socket&lt;/span&gt;
     &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:locale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;attach_hook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:set_locale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:handle_event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;handle_event&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;handle_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"toggle_locale"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;%{&lt;/span&gt;&lt;span class="s2"&gt;"locale"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"pt_BR"&lt;/span&gt;
    &lt;span class="n"&gt;perform_assigns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;handle_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"toggle_locale"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;%{&lt;/span&gt;&lt;span class="s2"&gt;"locale"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"pt_BR"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"en"&lt;/span&gt;
    &lt;span class="n"&gt;perform_assigns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;handle_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:cont&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;perform_assigns&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="no"&gt;Gettext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;put_locale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;IagocavalcanteWeb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Gettext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:halt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt; &lt;span class="o"&gt;|&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;locale:&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the on_mount function, we are setting the default locale to English and we have a hook that will be responsible for handling the language change event. We call it toggle_locale.&lt;/p&gt;

&lt;p&gt;With this done, we are ready to create our component that will call the hook that was added to the mount. It will have the following structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defmodule&lt;/span&gt; &lt;span class="no"&gt;PhoenixI18nWeb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;ToggleLocale&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;Phoenix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;Component&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;toggle_locale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assigns&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="sx"&gt;~H""&lt;/span&gt;&lt;span class="s2"&gt;"
    &amp;lt;button
      phx-click="&lt;/span&gt;&lt;span class="n"&gt;toggle_locale&lt;/span&gt;&lt;span class="s2"&gt;"
      phx-value-locale={@locale}
      type="&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="s2"&gt;"
      aria-label="&lt;/span&gt;&lt;span class="no"&gt;Toggle&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt;&lt;span class="s2"&gt;"
      class="&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="n"&gt;rounded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt; &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;white&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt; &lt;span class="n"&gt;px&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;shadow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lg&lt;/span&gt; &lt;span class="n"&gt;shadow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;zinc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="n"&gt;ring&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;ring&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;zinc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;900&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="n"&gt;backdrop&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;blur&lt;/span&gt; &lt;span class="n"&gt;transition&lt;/span&gt; &lt;span class="ss"&gt;dark:&lt;/span&gt;&lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;zinc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt; &lt;span class="ss"&gt;dark:&lt;/span&gt;&lt;span class="n"&gt;ring&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;white&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="ss"&gt;dark:hover:&lt;/span&gt;&lt;span class="n"&gt;ring&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;white&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="s2"&gt;"
    &amp;gt;
      &amp;lt;img
        src={"&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="c1"&gt;#{@locale}.png"}&lt;/span&gt;
        &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"h-6 w-6 fill-zinc-700 stroke-zinc-500 transition dark:fill-teal-400/10 dark:stroke-teal-500"&lt;/span&gt;
      &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="s2"&gt;"""
  end
end
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this, now we just need to update our live view and add wherever we want to use Gettext with the chosen language the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="no"&gt;Gettext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with_locale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;@locale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;gettext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Peace of mind from prototype to production."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;%&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, let's add our live session to the routes that we need to take care of for i18N:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;live_session&lt;/span&gt; &lt;span class="ss"&gt;:locale&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;on_mount:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="no"&gt;PhoenixI18nWeb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="no"&gt;RestoreLocale&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;live&lt;/span&gt; &lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;HomeLive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:home&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>elixir</category>
      <category>phoenix</category>
    </item>
    <item>
      <title>React Native — Comunicação com módulos nativos (iOS)</title>
      <dc:creator>Iago Angelim Costa Cavalcante</dc:creator>
      <pubDate>Tue, 29 Dec 2020 16:23:10 +0000</pubDate>
      <link>https://dev.to/iagocavalcante/react-native-comunicacao-com-modulos-nativos-ios-4cm2</link>
      <guid>https://dev.to/iagocavalcante/react-native-comunicacao-com-modulos-nativos-ios-4cm2</guid>
      <description>&lt;h3&gt;
  
  
  React Native — Comunicação com módulos nativos (iOS)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9n8_fWgg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2A2LfbgI6v4FhPGIs9Pnmndg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9n8_fWgg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2A2LfbgI6v4FhPGIs9Pnmndg.png" alt="" width="800" height="529"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Logo react native com uma mulher em cima&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Módulos nativos
&lt;/h3&gt;

&lt;p&gt;O post de hoje começa com uma pergunta, por que criar módulos nativos usando o react native ?&lt;/p&gt;

&lt;p&gt;Se você trabalha com desenvolvimento mobile, em algum momento você irá esbarrar com alguma &lt;em&gt;lib&lt;/em&gt;, algum &lt;em&gt;sdk&lt;/em&gt; que só possui versões pra Android ou iOS e você tem o aplicativo já em andamento com React Native.&lt;/p&gt;

&lt;p&gt;Dado esse cenário, surge a necessidade de entender, estudar e aprender a criar a comunicação usando React Native, isso é possível e com isso a gente é capaz de extrapolar o comum e passar a desenvolver aplicativos mais poderosos ou até contribuir criando um pacote que não existia para abstrair o &lt;em&gt;SDK/Lib nativas&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Para criar os módulos nativos temos duas opções, criar um pacote &lt;em&gt;NPM/Yarn&lt;/em&gt; ou criar o módulo nativo dentro do nosso projeto de aplicativo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Caso de uso
&lt;/h3&gt;

&lt;p&gt;Nosso caso de uso será o &lt;em&gt;SDK&lt;/em&gt; do &lt;em&gt;Zoom.us&lt;/em&gt; onde vamos modificar um &lt;a href="https://github.com/nagarro-dv/react-native-zoom-us-bridge"&gt;pacote existente para react native&lt;/a&gt;. Com isso vamos criar novos métodos para suprir nossa necessidade. São métodos que existem no &lt;em&gt;SDK&lt;/em&gt;, porém não existe no pacote que utilizamos para testar. Logo nosso time percebeu a necessidade de modificar o pacote pra atender nossas necessidades.&lt;/p&gt;

&lt;p&gt;Primeiro passo foi estudar o código do pacote e estudar a &lt;a href="https://reactnative.dev/docs"&gt;documentação oficial do React Native&lt;/a&gt; especificamente na parte de criação de módulos nativos, inclusive está sendo discutido uma nova arquitetura, chamada &lt;a href="https://github.com/react-native-community/discussions-and-proposals/issues/40"&gt;&lt;em&gt;TurboModules.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Temos no código-fonte do pacote o seguinte trecho:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bANH0W8M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/913/0%2A4S40h3EAJ-o5XAq-" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bANH0W8M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/913/0%2A4S40h3EAJ-o5XAq-" alt="" width="800" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Onde na linha um importamos o &lt;em&gt;NativeModules&lt;/em&gt; do &lt;em&gt;react-native&lt;/em&gt; e é a partir dele que temos acesso aos módulos nativos do iOS e Android, no nosso caso nesse primeiro artigo vamos focar no iOS. O alvo das nossas alterações será o &lt;em&gt;RNZoomUsBridge&lt;/em&gt; através dele vamos ter acesso as funções do &lt;em&gt;SDK.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nosso alvo aqui é usar um &lt;em&gt;SDK&lt;/em&gt; já existente e usufruir dele, com isso nosso pacote só será a ponte entre o &lt;em&gt;React Native&lt;/em&gt; e o &lt;em&gt;SDK&lt;/em&gt;, pra isso precisamos configurar um arquivo que irá dizer onde está o SDK, que no caso do iOS é a configuração do&lt;/p&gt;

&lt;p&gt;&lt;em&gt;FRAMEWORK_SEARCH_PATHS.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O nome do arquivo que fica na raiz do pacote tem o mesmo nome do pacote e tem a extensão &lt;em&gt;.podspec.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LNpjfopZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AaKIBvkNLk5zg5uTc" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LNpjfopZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AaKIBvkNLk5zg5uTc" alt="" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos ver na imagem acima, na linha vinte e cinco que configuramos o local do &lt;em&gt;ZoomSDK&lt;/em&gt; que vai ser instalado no projeto (aplicativo) e não no nosso pacote.&lt;/p&gt;

&lt;p&gt;No pacote existem arquivos .h e .m, eles são arquivos responsáveis pela definição do módulo (.h) e o pela implementação do módulo (.m). O que interessa pro nosso caso de uso são o RNZoomUsBridge.h, RNZoomUsBridge.m, RNZoomUsManager.h e RNZoomUsManager.m.&lt;/p&gt;

&lt;p&gt;Quando abrimos o primeiro arquivo temos o seguinte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SYBAkGCo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/812/0%2ARojUspDgEMYHFGeT" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SYBAkGCo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/812/0%2ARojUspDgEMYHFGeT" alt="" width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ele define que a interface RNZoomUsBridge vai ser um objeto RCTBridgeModule, que é importado diretamente do React.&lt;/p&gt;

&lt;p&gt;Com isso podemos ir para implementação dessa interface que fica no arquivo RNZoomUsBridge.m:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5HoOc_HG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/778/0%2Ay1SKqetGXRyb3xmz" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5HoOc_HG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/778/0%2Ay1SKqetGXRyb3xmz" alt="" width="778" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No início do módulo temos as importações de outros módulos e ao ir mais para baixo desse módulo temos a implementação usando a assinatura do módulo do react native para ser entendido como um método no Javascript, o que chamamos de ponte.&lt;/p&gt;

&lt;p&gt;O React usa o método abaixo para chamar, executar o módulo nativo, com isso temos uma implementação usando Promise, mas poderia ser outro tipo de implementação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WGtzxYSR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/737/0%2AWFn3-S5JcPRCN5m_" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WGtzxYSR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/737/0%2AWFn3-S5JcPRCN5m_" alt="" width="737" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na linha cento e trinta e três dizemos o nome do método e o tipo de retorno, que no nosso caso é uma Promise, que pode dar certo ou errado. Se der certo a execução do método nativo não vamos retornar nada e se der errado mostramos uma mensagem de erro.&lt;/p&gt;

&lt;p&gt;Podemos ver na linha cento e quarenta e um que chamamos o Manager e ele é responsável por executar nosso método hideMeeting.&lt;/p&gt;

&lt;p&gt;Agora vamos olhar como está definido e implementado esse método no Manager.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XIYvQv4V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1018/0%2AxbwB4kKhAAEY32Du" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XIYvQv4V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1018/0%2AxbwB4kKhAAEY32Du" alt="" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como vimos anteriormente, os arquivos .h são definições das interfaces. Nela vamos definir quais métodos temos que implementar e utilizar.&lt;/p&gt;

&lt;p&gt;Na nossa implementação do manager temos o seguinte:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Fzyub6ha--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/548/0%2A5Z_JSeJ6KvwfJ6qO" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fzyub6ha--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/548/0%2A5Z_JSeJ6KvwfJ6qO" alt="" width="548" height="156"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos ver que aqui importamos o &lt;em&gt;MobileRTC&lt;/em&gt;, esse arquivo é importado diretamente do &lt;em&gt;SDK&lt;/em&gt; do &lt;em&gt;Zoom.us&lt;/em&gt; e com ele temos acesso a vários &lt;em&gt;métodos&lt;/em&gt;, &lt;em&gt;interface&lt;/em&gt;, &lt;em&gt;enums&lt;/em&gt; e tudo mais.&lt;/p&gt;

&lt;p&gt;O que precisávamos pro nosso caso de uso era executar a ação de minimizar a tela de reunião do Zoom.us para executar outra ação. Lendo o código fonte do &lt;em&gt;SDK&lt;/em&gt; chegamos ao método &lt;em&gt;showMinimizeMeetingFromZoomUIMeeting&lt;/em&gt; e para implementar isso escrevemos o seguinte trecho:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nnRy8mf---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/680/0%2AysyNovq5GYoEpV0K" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nnRy8mf---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/680/0%2AysyNovq5GYoEpV0K" alt="" width="680" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse método definimos ele como assíncrono e definimos quando ele irá parar a execução (definir como completa) usando &lt;a href="https://developer.apple.com/documentation/foundation/operation/1408085-completionblock"&gt;completionBlock.&lt;/a&gt; Foi instanciado o objeto &lt;em&gt;ms&lt;/em&gt; que é referente ao &lt;em&gt;meetingService&lt;/em&gt; que é a reunião em execução e nele executamos a ação para minimizar a janela com &lt;strong&gt;[ms showMinimizeMeetingFromZoomUIMeeting]&lt;/strong&gt; e para facilitar a leitura, deixamos alguns logs para identificar se tudo está ocorrendo como o esperado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Com isso vimos como usufruir de módulos nativos usando &lt;em&gt;objective-C&lt;/em&gt; e &lt;em&gt;SDK&lt;/em&gt; nativo. Claro que isso exige um mínimo de conhecimento das linguagens nativas de cada plataforma e pode parecer assustador no início. Esse foi um caso real que foi necessário ser feito para atingir os objetivos da nossa aplicação e a lib modificada pode ser encontrada nesse &lt;a href="https://github.com/iagocavalcante/react-native-zoom-us-bridge"&gt;repositório&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para quem vem da web ou já tem familiaridade com React Native, vale a pena entender como a ponte (bridge) funciona e como a gente pode desenvolver apps melhores usufruindo desse poder.&lt;/p&gt;

&lt;p&gt;Por hoje é só, até mais pessoal.&lt;/p&gt;




</description>
      <category>javascript</category>
      <category>reactnative</category>
      <category>development</category>
      <category>nativeapp</category>
    </item>
    <item>
      <title>Programação Funcional com Javascript — Composição</title>
      <dc:creator>Iago Angelim Costa Cavalcante</dc:creator>
      <pubDate>Sat, 12 Jan 2019 15:25:52 +0000</pubDate>
      <link>https://dev.to/iagocavalcante/programacao-funcional-com-javascript-composicao-19i6</link>
      <guid>https://dev.to/iagocavalcante/programacao-funcional-com-javascript-composicao-19i6</guid>
      <description>&lt;h3&gt;
  
  
  Programação Funcional com Javascript — Composição
&lt;/h3&gt;

&lt;p&gt;Vamos falar neste artigo sobre composição, o que é, como resolver um determinado problema com isso e qual problema ela pode vir a resolver.&lt;/p&gt;

&lt;h3&gt;
  
  
  Composição
&lt;/h3&gt;

&lt;p&gt;É quando podemos reunir várias funções em uma única, onde a mesma recebe um número variado de funções por parâmetro, e dentro dela é usado o resultado de uma como entrada da outra. Vamos exemplificar com código, que talvez fique mais claro o entedimento.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Problema
&lt;/h3&gt;

&lt;p&gt;Vamos imaginar que estamos sentados em nossa mesinha, ai o gerente chega com a gente e fala que precisa que façamos um novo módulo front-end para o sistema MarombaWebApp, e que nesse módulo, nosso amiguinho do back-end vai devolver uma lista de usuários onde nela possui alguns dados, sendo um deles a quantidade de parcelas faltantes e outro o valor de cada parcela, e que na nossa tela precisamos mostrar a lista de todos os usuários e o total que falta eles pagarem. Precisamos desse controle e o prazo é pra daqui a uma hora.&lt;/p&gt;

&lt;p&gt;Dado esse problema e o prazo, apertado, precisamos entregar aquilo funcionando logo, nós nem pensamos na qualidade, só pensamos que estamos já atrasados pra entregar. Com a descrição do problema, a solução já veio na mente, uma lista é comum de receber e pensamos logo em iterar essa lista e somar o montante. Logo, logo nosso problema está resolvido e ficaria dessa forma:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Onde temos uma lista fictícia, uma variável global para receber o nosso total e um laço de repetição onde vamos pegar o valor total de cada usuário. Aparentemente não temos problema algum não é mesmo, mas vamos supor que precisamos dessa mesma lógica em outro módulo do sistema, dado uma lista, eu precise da somatória do total, o que vamos fazer ?! Isso mesmo que você pensou, &lt;em&gt;ctrl + c&lt;/em&gt; e &lt;em&gt;ctrl + v&lt;/em&gt;. Começando assim a repetição de código em todo os nosso sistema, olha que lindeza.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Solução
&lt;/h3&gt;

&lt;p&gt;Como vocês já devem ter imaginado, pra solucionar esse nosso pequeno problema, vamos utilizar a técnica de composição e com isso aplicaremos algo conhecido pela maioria dos Dev’s, o princípio da responsabilidade única, o famoso &lt;a href="https://www.youtube.com/watch?v=TMuno5RZNeE"&gt;&lt;strong&gt;S do SOLID&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nosso primeiro passo, vai ser separar as responsabilidades, onde teremos uma função para realizar o cálculo do valor total por usuário (linha 9) e outra função onde será realizado a somatória total do valor faltante de todos os usuários (linha 12):&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Temos o mesmo resultado da nossa solução onde está tudo junto e misturado, só que dessa vez, cada coisa está no seu devido lugar, fazendo só o que precisa fazer.&lt;/p&gt;

&lt;p&gt;Porém podemos dar uma melhorada e separar a soma que é feita dentro da função somatorioTotal e criar uma outra função de soma de forma que ela se tornará genérica o suficiente pra ser usada em qualquer outro lugar.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;No Javascript não existe funções que aceitem composição de forma nativa, por esse motivo, iremos implementar as funções de &lt;em&gt;map&lt;/em&gt; e &lt;em&gt;reduce&lt;/em&gt; de forma onde aceitem a composição.&lt;/p&gt;

&lt;p&gt;Elas terão a seguinte estrutura:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;A função &lt;em&gt;map&lt;/em&gt; recebe apenas uma função por parâmetro e retorna uma nova função que exige um parâmetro apenas e o parâmetro é o dado que será processado.&lt;/p&gt;

&lt;p&gt;E temos na terceira linha a reatribuição da função reduce, onde nela temos dois parâmetrod, sendo o primeiro a função que será usada para realizar o processamento dos dados e a segunda é o valor inicial. Com isso temos algo padronizado onde a saída de uma função é a entrada da próxima.&lt;/p&gt;

&lt;p&gt;Assim podemos organizar de forma mais eficiente o nosso código e torná-lo mais legível, as coisas vão se encaixando e fazendo sentido e fica claro o fluxo dos dados.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Essa série de programação funcional com javascript foi feita de forma rápida e direta. Esse post, exclusivamente, tive que estudar bastante e ler muitos outros sobre o assunto. Se você quer se aprofundar, recomendo ler os artigos e vídeo de referência.&lt;/p&gt;

&lt;p&gt;Aqui vão as principais referências:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.codeminer42.com/refatorando-para-javascript-funcional-composi%C3%A7%C3%A3o-de-fun%C3%A7%C3%B5es-parte-2-ff8cbe53122b"&gt;Refatorando para javascript funcional&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://cangaceirojavascript.com.br/compondo-funcoes-javascript/"&gt;Compondo funções javascript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=VGB9HbL1GHk"&gt;Let’s code with function composition — Fun Fun Function&lt;/a&gt;&lt;/p&gt;

</description>
      <category>desenvolvimentoweb</category>
      <category>javascript</category>
      <category>composição</category>
      <category>programaçãofuncional</category>
    </item>
    <item>
      <title>REST API com Node.js: Back-end e Front-end</title>
      <dc:creator>Iago Angelim Costa Cavalcante</dc:creator>
      <pubDate>Wed, 14 Nov 2018 12:56:38 +0000</pubDate>
      <link>https://dev.to/iagocavalcante/rest-api-com-nodejs-back-end-e-front-end-1j4o</link>
      <guid>https://dev.to/iagocavalcante/rest-api-com-nodejs-back-end-e-front-end-1j4o</guid>
      <description>&lt;p&gt;Para começar esse tutorial vamos primeiro entender o que seriam &lt;strong&gt;API’s&lt;/strong&gt; e qual a vantagem de usar essa abordagem em cima de um sistema único onde temos tudo integrado.&lt;/p&gt;

&lt;p&gt;Podemos pensar em &lt;strong&gt;API’s&lt;/strong&gt; como uma ponte que liga duas ilhas, mas no caso de software, uma &lt;strong&gt;API&lt;/strong&gt; pode ser usada por diversas áreas de negócio não sendo necessário ao consumidor conhecer detalhes de sua implementação. Elas são &lt;strong&gt;interfaces de integração&lt;/strong&gt; que facilitam na troca de informações entre &lt;strong&gt;&lt;em&gt;n&lt;/em&gt;&lt;/strong&gt; aplicações, podendo assim termos até mesmo várias caras para uma única aplicação, tendo uma versão móvel, outra desktop e um web.&lt;/p&gt;

&lt;p&gt;Uma &lt;strong&gt;API&lt;/strong&gt; pode ser acessada através de um endereço &lt;a href="http://minha.com.br/api/alunos"&gt;minhaapi.com.br/api/v1/alunos&lt;/a&gt;, onde ao acessarmos esse endereço teremos o seguinte retorno:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Com isso temos uma representação de fácil entendimento de como seria uma &lt;strong&gt;API&lt;/strong&gt; que retornaria uma lista de alunos e poderia ser usado em qualquer sistema que queira essa informação.&lt;/p&gt;

&lt;p&gt;Dito isso podemos avançar ao próximo conceito, que seria o &lt;strong&gt;REST&lt;/strong&gt;. Podemos entender &lt;strong&gt;REST&lt;/strong&gt; ( &lt;strong&gt;&lt;em&gt;Representational State Transfer&lt;/em&gt;&lt;/strong&gt; ) como a padronização da arquitetura web, uma abstração do &lt;strong&gt;protocolo HTTP&lt;/strong&gt; , &lt;strong&gt;URL&lt;/strong&gt; e os &lt;strong&gt;verbos HTTP&lt;/strong&gt;. Para ter uma &lt;strong&gt;API REST&lt;/strong&gt; com um significado semântico onde olhamos certa &lt;strong&gt;URL&lt;/strong&gt; e o verbo que é usado para a consumir, podemos entender quase de imediato qual comportamento esperar.&lt;/p&gt;

&lt;p&gt;Temos 4 verbos principais e mais utilizados para realização de requisições, sendo eles: &lt;strong&gt;GET&lt;/strong&gt; , &lt;strong&gt;POST&lt;/strong&gt; , &lt;strong&gt;PUT&lt;/strong&gt; ,  &lt;strong&gt;DELETE&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;vamos ver como ficaria nossa &lt;strong&gt;API&lt;/strong&gt; utlizando o  &lt;strong&gt;REST&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt; &lt;a href="http://minha.com.br/api/alunos"&gt;minhaapi.com.br/api/v1/aluno&lt;/a&gt;s (onde iremos recuperar uma lista de alunos)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;POST&lt;/strong&gt; &lt;a href="http://minha.com.br/api/alunos"&gt;minhaapi.com.br/api/v1/aluno&lt;/a&gt;s — data {nome: Aluno5, idade: 16}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DELETE&lt;/strong&gt; &lt;a href="http://minha.com.br/api/alunos"&gt;minhaapi.com.br/api/v1/aluno&lt;/a&gt;s/1 (aqui passamos o id 1 do aluno cadastrado e então ele será excluído)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PUT&lt;/strong&gt; &lt;a href="http://minha.com.br/api/alunos"&gt;minhaapi.com.br/api/v1/aluno&lt;/a&gt;s/1 — data {nome: Nome Novo, idade: 20} (já aqui passamos o id do aluno e mais as informações a serem atualizadas)&lt;/p&gt;

&lt;p&gt;Agora que entendemos um pouco do padrão &lt;strong&gt;REST&lt;/strong&gt; e como nos ajuda semanticamente a construir uma &lt;strong&gt;API&lt;/strong&gt; melhor usando os verbos &lt;strong&gt;HTTP&lt;/strong&gt; corretos para cada requisição, para refinar melhor as coisas, precisamos conhecer o status code, e o que é isso ?!&lt;/p&gt;

&lt;p&gt;Toda requisição realizada para um servidor, sempre é retornado o status code na resposta, ele é o indicador do que foi que ocorreu com aquela requisição, se deu certo, se &lt;strong&gt;API&lt;/strong&gt; falhou, se o servidor falhou ou se um determinado endereço existe. Recomendo o artigo da &lt;strong&gt;caelum&lt;/strong&gt; para melhor entendimento sobre os &lt;a href="http://blog.caelum.com.br/rest-principios-e-boas-praticas/"&gt;&lt;strong&gt;padrões e principios REST&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Entendemos por alto o que é uma &lt;strong&gt;API REST&lt;/strong&gt; com os parágrafos anteriores.&lt;/p&gt;

&lt;p&gt;Agora vamos colocar isso em prática, vamos construir uma &lt;strong&gt;API&lt;/strong&gt; em node, usando express e para tornar o artigo mais didático, estarei seguindo uma arquitetura simples. Vamos supor que sua máquina já está configurada com &lt;a href="https://nodejs.org/en/download/"&gt;&lt;strong&gt;node&lt;/strong&gt;&lt;/a&gt; e npm.&lt;/p&gt;

&lt;p&gt;Nosso primeiro passo é criar um diretório para o projeto de &lt;strong&gt;API&lt;/strong&gt; , vou chamar esse diretório de &lt;strong&gt;alunos-api&lt;/strong&gt; , feito isso vamos abrir o terminal (qualquer um) e navegar até nossa pasta recém criada.&lt;/p&gt;

&lt;p&gt;Estando na pasta vamos digitar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm init -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Com esse comando estaremos criando um &lt;strong&gt;package.json&lt;/strong&gt; que vai ser a base de configuração da nossa aplicação e teremos o seguinte resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1ElOb7N3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/576/1%2A1VFzzDd06FSGFy4iwOvQoA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1ElOb7N3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/576/1%2A1VFzzDd06FSGFy4iwOvQoA.png" alt="" width="576" height="290"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;iniciando projeto com npm init&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Agora que temos nosso &lt;strong&gt;package.json&lt;/strong&gt; configurado, podemos instalar algumas dependências, a primeira delas é o &lt;a href="https://www.npmjs.com/package/express"&gt;&lt;strong&gt;express&lt;/strong&gt;&lt;/a&gt;, para instalar, basta ir no terminal na pasta do projeto e digitar&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install express
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1cAcjwY7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/670/1%2Alw9LGKNG-zYbWxi5UZ40hQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1cAcjwY7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/670/1%2Alw9LGKNG-zYbWxi5UZ40hQ.png" alt="" width="670" height="176"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;express install&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Para evitar dores de cabeça enquanto desenvolvemos e ter as alterações rodando ao modificarmos e salvarmos algum arquivo do projeto, podemos usar um pacote chamado &lt;a href="https://www.npmjs.com/package/nodemon"&gt;&lt;strong&gt;nodemon&lt;/strong&gt;&lt;/a&gt;, para instalar vamos usar o &lt;em&gt;npm install&lt;/em&gt;, só que como esse pacote só será usado para o desenvolvimento, vamos usar a flag&lt;/p&gt;

&lt;p&gt;— &lt;em&gt;save-dev&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install — save-dev nodemon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora que já temos esse dois pacotes essenciais, podemos configurar o script para rodar nossa aplicação em desenvolvimento, antes vamos abrir o projeto em um editor de texto preferido, no meu caso (&lt;a href="https://code.visualstudio.com/"&gt;&lt;strong&gt;visual studio code&lt;/strong&gt;&lt;/a&gt;). Agora vamos editar nosso &lt;strong&gt;package.json&lt;/strong&gt; na propriedade de &lt;em&gt;scripts&lt;/em&gt; vamos inserir uma outra propriedade chamada &lt;em&gt;dev&lt;/em&gt;, ficando asssim:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;“scripts”: {

    “dev”: “nodemon src/app.js”,

    “test”: “echo \”Error: no test specified\” &amp;amp;&amp;amp; exit 1"

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RwneFcV7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/712/1%2ADhWGA_c3zyJb7WfizDLtIg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RwneFcV7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/712/1%2ADhWGA_c3zyJb7WfizDLtIg.png" alt="" width="712" height="458"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;package.json com scripts modificado&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Esse script é chamado toda vez que executarmos o comando no terminal dentro da pasta do projeto.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Assim acionando o &lt;strong&gt;nodemon&lt;/strong&gt; que chama o &lt;em&gt;app.js&lt;/em&gt; que ficará dentro da pasta  &lt;strong&gt;src&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Como boa prática, vamos manter nossa base de código em uma pasta chamada &lt;strong&gt;src&lt;/strong&gt; que fica na raiz do nosso projeto e dentro dela vamos criar nosso arquivo &lt;em&gt;app.js.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Agora que temos a estrutura inicial da aplicação, vamos começar a escrever algumas coisas no nosso &lt;em&gt;app.js&lt;/em&gt; e entender melhor como express funciona.&lt;/p&gt;

&lt;p&gt;Para utilizar qualquer pacote em nossa aplicação node, temos que importar o pacote desejado, podemos observar isso na primeira linha.&lt;/p&gt;

&lt;p&gt;Na segunda linha estamos instanciando o express para podermos utilizar suas funções.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Na terceira linha temos a instancia do express utilizando um metodo get que aponta para determinada rota, onde ele recebe dois parametros, sendo o primeiro a rota que nesse caso a é / e o segundo parametro um callback onde esse callback possui dois parametros (req, res), sendo o req utilizado para obter informacoes e sao mandadas para esse url e res, utilizado para enviar uma resposta para quem está requisitando, o comportamento seria o seguinte:&lt;/p&gt;

&lt;p&gt;1 — Cliente solicitou alguma coisa no endereço &lt;em&gt;&lt;a href="http://localhost:3000/"&gt;http://localhost:3000/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;2 — O servidor retorna no caso do nosso exemplo um &lt;em&gt;html&lt;/em&gt; com texto “Hello World”&lt;/p&gt;

&lt;p&gt;E a nossa última linha de código é onde iremo iniciar de fato o servidor onde passamos como parâmetro a porta que será executada, quando rodarmos o npm run dev e após iniciar, podemos ir até o nosso navegador e acessar a url &lt;em&gt;localhost:3000/&lt;/em&gt; e obteremos a resposta &lt;em&gt;hello worl&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Agora temos uma noção de como devolver uma página &lt;em&gt;html&lt;/em&gt; com alguma informação, usando a mesma função anterior, podemos devolver, um arquivo &lt;em&gt;html&lt;/em&gt; ou um &lt;em&gt;json&lt;/em&gt; no caso de uma &lt;strong&gt;API&lt;/strong&gt;. Vamos criar um &lt;em&gt;array de objetos&lt;/em&gt; javascript contendo as informações que queremos devolver para quem está solicitando.&lt;/p&gt;

&lt;p&gt;Nosso &lt;em&gt;app.js&lt;/em&gt; ficará dessa forma&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Agora ao acessarmos a &lt;strong&gt;URL&lt;/strong&gt; da nossa &lt;strong&gt;API&lt;/strong&gt; vamos obter o seguinte retorno:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--osjx0Z1B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AB3XvFr-MxoLOS98QxGTDCg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--osjx0Z1B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AB3XvFr-MxoLOS98QxGTDCg.png" alt="" width="800" height="393"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;resposta da requisição. um array de objetos&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Temos uma &lt;strong&gt;API&lt;/strong&gt; funcionando simulando uma consulta ao banco de dados onde é retornada uma lista de alunos, agora é possível consumirmos isso de um navegador, do &lt;a href="https://www.getpostman.com/apps"&gt;&lt;strong&gt;postman&lt;/strong&gt;&lt;/a&gt;, de uma aplicação web, de um aplicativo.&lt;/p&gt;

&lt;p&gt;Vamos só melhorar a URL da nossa aplicação, para ficar mais semântico.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Prontinho, nossa &lt;strong&gt;API&lt;/strong&gt; está finalizada, agora podemos consumir diretamente da nossa aplicação web.&lt;/p&gt;

&lt;p&gt;Para começar a construção de nossa aplicação consumidora, vamos criar uma pasta chamada &lt;em&gt;alunos-front&lt;/em&gt; dentro da pasta &lt;em&gt;alunos-api&lt;/em&gt; logo em seguida abriremos a pasta criada no editor de texto preferido, já com editor aberto vamos criar um arquivo &lt;em&gt;index.html&lt;/em&gt; com uma estrutura &lt;strong&gt;HTML5.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U7xnE1AW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AYB6mHo1kEsTwVUQ3iZp_8g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U7xnE1AW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AYB6mHo1kEsTwVUQ3iZp_8g.png" alt="" width="800" height="266"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;esqueleto de página html5&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Vamos marcar nosso &lt;em&gt;html&lt;/em&gt; com um título para lista e a lista em si para visualizarmos como ficará o &lt;em&gt;html&lt;/em&gt;. E para rodarmos a aplicação front vamos instalar um pacote maneiro para servir página estáticas, chamado &lt;a href="https://www.npmjs.com/package/http-server"&gt;&lt;strong&gt;http-server&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;br&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install http-server -g
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora após instalado, vamos no terminal de vossas preferências, navegamos até a nossa pasta &lt;em&gt;alunos-front&lt;/em&gt; e rodaremos, lembre-se que precisamos ter outra janela do terminal rodando nosso projeto de API simultaneamente ao projeto front:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zv1fRCdd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AerhakypyA_0sHQRh1RcYBg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zv1fRCdd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AerhakypyA_0sHQRh1RcYBg.png" alt="" width="800" height="412"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Os dois projetos rodando juntos&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NnLiHkxw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/727/1%2APL3Ep0PTM7oW0HTpy3ES5w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NnLiHkxw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/727/1%2APL3Ep0PTM7oW0HTpy3ES5w.png" alt="" width="727" height="188"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Terminal rodando a aplicação alunos-front&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Vamos acessar o nosso endereço para visualizar nosso &lt;em&gt;html&lt;/em&gt; no endereço &lt;a href="http://localhost:8080."&gt;&lt;em&gt;http://localhost:8080&lt;/em&gt;&lt;/a&gt;&lt;em&gt;ou&lt;/em&gt; &lt;a href="http://localhost:8080."&gt;&lt;em&gt;http://127.0.0.1:8080.&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UJ7RdlTN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/965/1%2A0i7uK4tYhSuLV42S_Qa7VA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UJ7RdlTN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/965/1%2A0i7uK4tYhSuLV42S_Qa7VA.png" alt="" width="800" height="263"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Lista de alunos estática&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O que falta para integrarmos com a nossa &lt;strong&gt;API&lt;/strong&gt;  ?! Falta fazermos a requisição, certo ? E para isso, vamos usar &lt;a href="https://www.devmedia.com.br/o-que-e-o-ajax/6702"&gt;&lt;strong&gt;AJAX&lt;/strong&gt;&lt;/a&gt;, para tornar as coisas dinâmicas.&lt;/p&gt;

&lt;p&gt;Vamos utilizar uma biblioteca famosa no mundo front-end para realizar essas requisições, essa &lt;strong&gt;lib&lt;/strong&gt; é o &lt;a href="https://cdnjs.com/libraries/axios"&gt;&lt;em&gt;axios&lt;/em&gt;&lt;/a&gt; &lt;em&gt;0.18.0&lt;/em&gt;, ela tem a finalidade de realizar requisições e ser baseada em &lt;em&gt;promises&lt;/em&gt;, vamos importar ela no nosso &lt;em&gt;html&lt;/em&gt; através da cdn &lt;a href="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"&gt;https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ela tem uso simples com a seguinte estrutura:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;axios.get('enderecodaapi')
    .then(response =&amp;gt; console.log(response)) //caso retorne um sucesso
    .catch(error =&amp;gt; console.log(error)) //caso ocorra algum erro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;após o &lt;em&gt;axios.&lt;/em&gt; temos os verbos &lt;em&gt;HTTP&lt;/em&gt; podendo ser &lt;em&gt;axios.get&lt;/em&gt;, &lt;em&gt;axios.post&lt;/em&gt;, &lt;em&gt;axios.delete&lt;/em&gt;, onde cada método precisa receber como primeiro &lt;em&gt;parâmetro&lt;/em&gt; a &lt;strong&gt;URL&lt;/strong&gt;. O segundo é um parâmetro opcional que são os dados que serão enviados para a  &lt;strong&gt;API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vamos agora consumir nossa &lt;strong&gt;API&lt;/strong&gt; utilizando o &lt;em&gt;axios&lt;/em&gt; e visualizar o retorno dela no console do Chrome.&lt;/p&gt;

&lt;p&gt;Nosso código alterado do front-end ficará assim:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Checando o que acontece com as alterações realizados no front-end, ao darmos refresh na aplicação temos o seguinte.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gE42yQYw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2Abz2lPMabBLHMoX9PP84IPQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gE42yQYw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2Abz2lPMabBLHMoX9PP84IPQ.png" alt="" width="800" height="387"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Página utilizando axios&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Como podemos perceber, ocorreu um erro, esse erro é bem conhecido pela galera de front-end, o famigerado erro de &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Controle_Acesso_CORS"&gt;CORS&lt;/a&gt;, para resolver isso, vamos fazer uma pequena mudança em nossa  &lt;strong&gt;API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Voltando para o terminal e navegando até a pasta onde está localizado nosso projeto de &lt;strong&gt;API&lt;/strong&gt; , vamos instalar a biblioteca &lt;a href="https://github.com/expressjs/cors"&gt;cors&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install cors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Quando finalizar a instalação, vamos adicionar essa lib como um middleware da nossa &lt;strong&gt;API&lt;/strong&gt; , ou seja, todas as requisições irão passar antes, por essa biblioteca.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Com essas alterações realizadas e a nossa &lt;strong&gt;API&lt;/strong&gt; rodando novamente, basta irmos na nossa aplicação e atualizar ela e veremos o resultado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q_NEjhrw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AG48yZ6DRYh6WXEE_Luotmg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q_NEjhrw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AG48yZ6DRYh6WXEE_Luotmg.png" alt="" width="800" height="384"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Front-end requerendo da API&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Agora obtivemos a resposta esperada, recebemos os dados dos alunos e com isso podemos criar nossa lista dinâmica.&lt;/p&gt;

&lt;p&gt;Vamos criar uma função dentro da tag script onde ela receberá uma lista de alunos e irá criar a lista com os nomes. Com essa função criada, agora basta substituir dentro do &lt;em&gt;axios.get.then&lt;/em&gt; o console.log, pela nossa função.&lt;/p&gt;

&lt;p&gt;Nosso &lt;em&gt;html&lt;/em&gt; final será assim:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Agora temos uma noção geral de como construir um backend e frontend separadamente e entendemos alguns conceitos por trás da construção de uma  &lt;strong&gt;API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/iagocavalcante/node-tutorial"&gt;&lt;strong&gt;Github do projeto&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>Programação Funcional com Javascript — Recursão</title>
      <dc:creator>Iago Angelim Costa Cavalcante</dc:creator>
      <pubDate>Thu, 08 Nov 2018 12:04:50 +0000</pubDate>
      <link>https://dev.to/iagocavalcante/programacao-funcional-com-javascript-recursao-372j</link>
      <guid>https://dev.to/iagocavalcante/programacao-funcional-com-javascript-recursao-372j</guid>
      <description>&lt;p&gt;Fala pessoal, depois de algum tempo, estamos de volta. No artigo de hoje iremos tratar e tentar explanar de forma simples e objetiva, o que é a recursão e como aplica-la usando Javascript.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recursão
&lt;/h3&gt;

&lt;p&gt;Dizemos que a recursão é um método para a solução de um determinado problema grande que pode ser quebrado em vários pequenos problemas, até ser pequeno o suficiente para ser resolvido de forma simples. A recursão é dada quando uma função chama a si mesmo, com isso podemos escrever soluções elegantes que seriam meio cabulosos de programar de outra forma.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Problema
&lt;/h3&gt;

&lt;p&gt;Seguindo a linha de pensamento dos artigos anteriores. Vamos imaginar que temos o seguinte problema:&lt;/p&gt;

&lt;p&gt;O cliente chega pra você e diz que precisa de um programa similar ao famoso dropbox, um sistema de gerenciamento de arquivos, e na primeira entrega ele precisa que o sistema apenas faça a criação de pasta e subpastas e precisamos lista-las, contendo arquivos ou subpastas.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Solução
&lt;/h3&gt;

&lt;p&gt;Em primeiro momento, para quem não é familiarizado ou não conhece a técnica de recursão, o que vem na mente para resolver o problema, seriam usar &lt;strong&gt;&lt;em&gt;n&lt;/em&gt;&lt;/strong&gt; laços de repetições.&lt;/p&gt;

&lt;p&gt;Mas a solução mais elegante para esse problema específico, se dá pelo uso de recursão.&lt;/p&gt;

&lt;p&gt;Vamos imaginar que para resolver o problema dessa primeira entrega precisamos construir uma árvore com esses diretórios e subdiretórios. Pensando que nosso sistema será o web, vamos criar elementos html através de nossa função recursiva. Vamos usar a sintaxe e funcionalidades do ES6, segue nosso código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//estrutura de entrada
const folders = {
    folder: [{
        name: 'folder1',
        folder: [
            {
                name: 'folder2'
            },
            {
                name: 'folder3'
            },
            {
                name: 'folder4',
                folder: [
                    {
                        name: 'folder5'
                    },
                    {
                        name: 'folder'
                    }
                ]
            },
           {
                name: 'folder7'
          }
        ]
    }
  ]
}

//funcao para criar pastas e subpastas dado uma entrada
const createFolderTree = (treeFolders, container)=&amp;gt; { 
    treeFolders.map( folder =&amp;gt; {
        const newContainer = document.createElement('div')
        const button = document.createElement('button')
        button.id = folder.name
        button.innerHTML = folder.name
        newContainer.appendChild(button)
        container.appendChild(newContainer)
        if(folder.folder) createFolderTree(folder.folder, newContainer) 
    })
}

//chamada da funcao
createFolderTree(folders.folder, document.querySelector('#folders'))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isso temos uma função recursiva que é chamada toda vez que encontra um nó chamado &lt;strong&gt;&lt;em&gt;folder&lt;/em&gt;&lt;/strong&gt; , com isso ele cria um novo elemento &lt;strong&gt;&lt;em&gt;div&lt;/em&gt;&lt;/strong&gt; e dentro desse elemento cria um botão representando nossa pasta.&lt;/p&gt;

&lt;p&gt;É uma forma bem simples que podemos usar, por exemplo, na criação de menus.&lt;/p&gt;

&lt;p&gt;Espero que tenha ficado claro o problema e aplicabilidade da técnica e como isso é rico e torna nosso código melhor.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programaçãofuncional</category>
    </item>
    <item>
      <title>Programação Funcional — Imutabilidade</title>
      <dc:creator>Iago Angelim Costa Cavalcante</dc:creator>
      <pubDate>Mon, 07 May 2018 01:04:59 +0000</pubDate>
      <link>https://dev.to/iagocavalcante/programacao-funcional-imutabilidade-3fbc</link>
      <guid>https://dev.to/iagocavalcante/programacao-funcional-imutabilidade-3fbc</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Aqf1MqDh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/940/1%2A9A9d-VUAY2oyem4iZrFevg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Aqf1MqDh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/940/1%2A9A9d-VUAY2oyem4iZrFevg.jpeg" alt="" width="800" height="671"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Foto editada por Patrick Monteiro&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Explicando a imutabilidade
&lt;/h3&gt;

&lt;p&gt;Neste artigo, irei tentar expressar uma das muitas maneiras de explicar dados imutáveis em programação em termos familiares, com isso é mais fácil entender o conceito.&lt;/p&gt;
&lt;h3&gt;
  
  
  O problema
&lt;/h3&gt;

&lt;p&gt;Imagine que você acabou de publicar um artigo e compartilhou um link com todos. As pessoas estão aprendendo muito com a sua escrita e compartilhando com os outros. Depois de um tempo você decide adicionar ou mudar alguma coisa, porque sua opinião mudou ou você aprendeu mais sobre o assunto. Você vai editar o artigo e atualizá-lo. Agora lembre-se daquelas pessoas que estão curtindo? Eles gostam e compartilham com os outros porque acharam interessante. Mas você acabou de alterar algo e isso significa que você potencialmente removeu o valor porque alguns dos seus leitores gostaram e compartilharam esse artigo. Você pode imaginar a frustração quando as pessoas estão se referindo à sua escrita e quando voltam, elas vêem pontos completamente diferentes?&lt;/p&gt;
&lt;h3&gt;
  
  
  Soluções
&lt;/h3&gt;

&lt;p&gt;Existem algumas formas comuns de como você pode editar ou adicionar mais conteúdo em um artigo:&lt;/p&gt;

&lt;p&gt;No caso de você perceber que sua opinião foi completamente alterada desde que o artigo foi publicado, é melhor escrever um novo.&lt;/p&gt;

&lt;p&gt;Se você quiser substituir algumas frases por uma nova declaração, basta aplicar o estilo rasurado a ela e colocar sua nova opinião logo após.&lt;/p&gt;

&lt;p&gt;Se você quiser adicionar mais texto ou reescrever algo, você pode adicionar uma nota no início do artigo que diz que ele foi atualizado em uma data específica e colocar um pouco de resumo sobre quais são essas mudanças e por que você decidiu torná-las .&lt;/p&gt;

&lt;p&gt;Observe como em todos os casos você faz a mudança explícita. Quando alguém volta a ler esse artigo novamente, ele pode observar exatamente o que foi alterado e ainda ter uma ideia do conteúdo original.&lt;/p&gt;
&lt;h3&gt;
  
  
  Dados imutáveis
&lt;/h3&gt;

&lt;p&gt;Sua postagem no blog também é de dados. Na programação, pode ser um valor representado como um mapa hash. Você pode atribuir esse valor a uma variável. Por isso, possui um ponteiro para o valor, assim como uma pessoa possui um link para o artigo na web. Depois de um tempo você quer lê-lo novamente, então você usa esse link para acessar o artigo ou, se estivermos no programa, usamos essa variável para acessar o valor. Nos dois mundos, você quer que os dados sejam exatamente os mesmos que você viu antes, eles devem permanecer inalterados. Mas se você alterar o artigo ou o valor, ele não será mais o mesmo e não haverá como acessar os dados antes que eles sejam alterados.&lt;/p&gt;

&lt;p&gt;Vamos aplicar a solução acima aos dados na programação. Em vez de editar o valor atual, crie um novo, que é basicamente o valor original + alterações que você deseja fazer. É exatamente o que significa imutabilidade. Você não deve alterar os dados depois de criados. Crie uma cópia dos dados originais e inclua suas alterações. Desta forma, você terá acesso a ambos os valores da mesma forma que seus leitores ainda podem acessar o artigo original e um novo.&lt;/p&gt;

&lt;p&gt;Veja uma amostra de como você pode alcançar a imutabilidade básica simples em JavaScript com Object.assign ao alterar objetos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const user {
  name: 'Iago Cavalcante',
  age: 25
}
const updateUser = Object.assign(
  {},
  user,
  { age: 26 });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Programação Funcional com Javascript — Funções Puras</title>
      <dc:creator>Iago Angelim Costa Cavalcante</dc:creator>
      <pubDate>Fri, 02 Mar 2018 18:12:15 +0000</pubDate>
      <link>https://dev.to/iagocavalcante/programacao-funcional-com-javascript-funcoes-puras-56p8</link>
      <guid>https://dev.to/iagocavalcante/programacao-funcional-com-javascript-funcoes-puras-56p8</guid>
      <description>&lt;p&gt;E ae pessoal, tudo certo ?! Hoje vou começar a falar um pouco sobre programação funcional utilizando Javascript, quais as características desse paradigma e especialmente entrar na primeira parte dessa série, que são os conceitos e definições de funções puras.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é programação funcional?
&lt;/h3&gt;

&lt;p&gt;Nada mais é que um paradigma onde os programas são executados por meio de avaliação de funções. No sentindo mais puro, é baseada em como funções, variáveis e valores trabalham de fato na matemática. Além de que usam uma abordagem mais declarativa que imperativa em suas estruturas. Sendo assim temos princípios fundamentais da programação funcional, sendo eles: funções puras, imutabilidade, recursão, composição de função, funções de primeira classe, lambdas e closures.&lt;/p&gt;

&lt;p&gt;Nesse primeiro artigo, irei falar exclusivamente sobre:&lt;/p&gt;

&lt;h3&gt;
  
  
  Funções Puras
&lt;/h3&gt;

&lt;p&gt;Para uma função ser considerada pura ela necessariamente tem que ter duas características, sendo elas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dada a mesma entrada, sempre retornará a mesma saída:&lt;/strong&gt; a função sempre dá o mesmo valor de retorno para os mesmos argumentos. Isso significa que a função não pode depender de nenhum estado mutável ( objetos mutáveis são objetos cujo estado pode mudar, instanciar e atribuir valor a uma variável).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Não causa efeito colateral:&lt;/strong&gt; a função não pode causar efeitos colaterais, ou seja, a função não acessa ou altera valores globais. Os efeitos secundários podem incluir Entrada/Saída ( &lt;strong&gt;console.log&lt;/strong&gt; , &lt;strong&gt;Math.random,Date.now&lt;/strong&gt; ).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Exemplo de função pura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const multiplica = (a, b) =&amp;gt; a * b;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quais as vantagens de se utilizar uma função pura?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Elas são de fácil processamento, testes e depuração, por não dependerem de estados mutáveis.&lt;/li&gt;
&lt;li&gt;O valor de retorno pode ser guardado, evitando assim uma re-computação no futuro.&lt;/li&gt;
&lt;li&gt;São mais fáceis de testar porque não há dependências (como log, ajax, banco de dados, etc.) que precisam ser mockadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como podemos ver, nem todas as funções de nossos sistemas serão puras, mas podemos tentar utilizar as funções puras em pelo menos 80% dos casos, sendo o valor restante, destinados a funções de gravação de log, recuperação de data, valores randômicos e etc.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>functional</category>
      <category>programação</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Conhecendo um pouco sobre Flux!</title>
      <dc:creator>Iago Angelim Costa Cavalcante</dc:creator>
      <pubDate>Sat, 24 Feb 2018 13:55:40 +0000</pubDate>
      <link>https://dev.to/iagocavalcante/conhecendo-um-pouco-sobre-flux-1922</link>
      <guid>https://dev.to/iagocavalcante/conhecendo-um-pouco-sobre-flux-1922</guid>
      <description>&lt;p&gt;Flux é um padrão de projetos criado pelos engenheiros do facebook, onde se tem por padrão o fluxo unidirecional dos dados (single direction data flow). Padrão esse popularmente usado no front-end das aplicações.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y0d-jU9e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1000/0%2AFObL5i4rHn_J0xCs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y0d-jU9e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1000/0%2AFObL5i4rHn_J0xCs.jpg" alt="" width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A &lt;em&gt;view&lt;/em&gt; envia ações que descrevem o que aconteceu. A &lt;em&gt;store&lt;/em&gt; recebe essas &lt;em&gt;actions&lt;/em&gt; e determina quais mudanças de estado devem ocorrer. Após o estado ser atualizado, o novo estado é enviado para a &lt;em&gt;view&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Todos os dados fluem através do &lt;em&gt;dispatcher&lt;/em&gt;, que é como um hub central. As ações são fornecidas ao &lt;em&gt;dispatcher&lt;/em&gt; em um método criador de ação e, na maioria das vezes, são originadas pelas interações do usuário com as &lt;em&gt;views&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;dispatcher&lt;/em&gt; então invoca as devoluções de chamada que as &lt;em&gt;store&lt;/em&gt; registraram, enviando ações para todas as &lt;em&gt;stores&lt;/em&gt;. Dentro das devoluções de retorno registradas, as &lt;em&gt;stores_respondem a qualquer ação relevante para o estado que eles mantêm. As _stores&lt;/em&gt; emitem um evento de alteração para alertar as &lt;em&gt;views&lt;/em&gt; do controlador de que ocorreu uma alteração na camada de dados. &lt;em&gt;Controller-views&lt;/em&gt; escutam esses eventos e recuperam dados das &lt;em&gt;stores_em um manipulador de eventos. As c_ontroller-views&lt;/em&gt; chamam seu próprio método setState (), causando uma re-renderização de si mesmos e todos os seus descendentes na árvore do componente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Características
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fluxo único de dados;&lt;/li&gt;
&lt;li&gt;Não sofre alterações em cascata;&lt;/li&gt;
&lt;li&gt;Previsível;&lt;/li&gt;
&lt;li&gt;Ações descritivas;&lt;/li&gt;
&lt;li&gt;Lógica contida em um único ponto (store);&lt;/li&gt;
&lt;li&gt;Flexível para ser usada em pequenas e grandes aplicações.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estou me aventurando nesse novo design pattern, é um conceito novo pra mim, utilizando a implementação desse padrão para Vue, o Vuex. É bastante diferente do que eu usava de arquitetura web e vem se mostrando bem interessante, quem não conhece, recomendo ficar por dentro do assunto e entender. Abraços!&lt;/p&gt;

&lt;p&gt;Fonte: &lt;a href="http://facebook.github.io/flux/index.html"&gt;http://facebook.github.io/flux/index.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flux</category>
      <category>arquiteturadeinforma</category>
    </item>
  </channel>
</rss>
