<?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>Forem: Robson Junior</title>
    <description>The latest articles on Forem by Robson Junior (@jrobsonjr).</description>
    <link>https://forem.com/jrobsonjr</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%2F158293%2F8650cd54-6479-45f8-b885-681ac5eee9a2.jpeg</url>
      <title>Forem: Robson Junior</title>
      <link>https://forem.com/jrobsonjr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jrobsonjr"/>
    <language>en</language>
    <item>
      <title>Não tenha medo de mudar de rota</title>
      <dc:creator>Robson Junior</dc:creator>
      <pubDate>Mon, 26 Jul 2021 17:31:49 +0000</pubDate>
      <link>https://forem.com/opendevufcg/nao-tenha-medo-de-mudar-de-rota-270e</link>
      <guid>https://forem.com/opendevufcg/nao-tenha-medo-de-mudar-de-rota-270e</guid>
      <description>&lt;p&gt;Escolhas... Não importa o quanto nós treinemos durante toda a vida a ter que fazê-las, tomar decisões não parece se tornar uma tarefa mais simples com o tempo. Vamos usar a sua potencial área de atuação como exemplo. Mesmo já sabendo que você gostaria de tentar Ciência da Computação (e mesmo se não for o caso, não desista desta postagem!), esse termo abarca uma infinidade de possibilidades. Como ter certeza de que o que você escolher vai possibilitar sua satisfação por tempo suficiente até você descobrir a próxima grande coisa?&lt;/p&gt;

&lt;p&gt;Resposta rápida, ou melhor, a única resposta: é impossível garantir isso.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv4oh4nnnzty9jymzrxsb.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv4oh4nnnzty9jymzrxsb.gif" alt="Ocupando muito espaço do cérebro..." width="168" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Não se preocupe: não vou te atacar com mais perguntas difíceis, nem usar termos de coach para mudar o seu &lt;em&gt;#mindset&lt;/em&gt;. Também não tenho nenhuma solução para oferecer, infelizmente. No lugar disso tudo, quero compartilhar uma história sobre o lado bom de criar coragem para tomar decisões difíceis, mesmo quando as suas escolhas anteriores não anteviam esse futuro.&lt;/p&gt;

&lt;p&gt;Cursos de graduação geralmente culminam em um Trabalho de Conclusão de Curso, certo? Aquela última disciplina que quase ninguém quer, mas vai ter que cursar, sendo geralmente o último obstáculo entre você e o tão sonhado diploma. Nesse caso em específico, o TCC se deu em duas etapas: um Projeto de TCC, consistindo basicamente no esboço e planejamento do trabalho, e o TCC propriamente dito, cada um em um semestre.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fimxxsrhuirc6g04v36bg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fimxxsrhuirc6g04v36bg.gif" alt="Muito trabalho..." width="298" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O primeiro passo foi, naturalmente, escolher qual professor(a) eu abordaria quanto à orientação, o que felizmente não foi uma decisão muito difícil. Embora eu tenha estudado com vários professores e professoras sensacionais, levei em consideração principalmente com quem eu ainda não tinha (até o momento) tido a chance de trabalhar, quem poderia me ajudar a encontrar mais possibilidades para o TCC e, principalmente, com quem eu realmente me sentia confortável.&lt;/p&gt;

&lt;p&gt;Em seguida, surgiu uma dúvida bem mais complicada: qual tema escolher? Eu sabia que queria fazer sobre um tema que realmente me despertasse interesse, mas, mesmo com as opções sendo teoricamente infinitas, nem todas se sustentam como uma temática de TCC. Depois de contatar a minha orientadora para definirmos isso, eu pensava que não fazia ideia do que queria trabalhar. Depois dela dar umas dez (sério mesmo) sugestões de temas super interessantes, eu... Propus o meu próprio. Pensei rapidamente que o que me traria satisfação seria construir algo com algum impacto social, e então dei uma ideia de um sistema que atuaria nesse sentido.&lt;/p&gt;

&lt;p&gt;Vieram mais dúvidas: como se daria esse trabalho? Focaríamos o TCC no desenvolvimento desse sistema, ou utilizaríamos os aprendizados obtidos ao longo do curso para viabilizar uma pesquisa? Como encaixar isso no contexto de Computação? Como encontrar os contatos das pessoas que poderiam nos ajudar a ceder as informações necessárias?&lt;/p&gt;

&lt;p&gt;Depois de uma série de ameaças à validade do tema e inseguranças quanto ao que poderíamos fazer, conseguimos chegar em uma proposta sólida ao fim de Projeto de TCC. Caramba, já tínhamos bastante coisa: uma introdução que poderia muito bem ser aproveitada, um cronograma otimista, referências a artigos multidisciplinares que poderiam nos guiar…&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4lynoon7o4ijxyaz0yek.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4lynoon7o4ijxyaz0yek.gif" alt="Planejamento do TCC." width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mesmo assim, quando começamos TCC, comecei a enxergar mais furos naquilo tudo. Como íamos conseguir contatar todas aquelas pessoas? Como íamos abraçar o mundo com aquele projeto, estando no meio de uma pandemia que cada vez mais minava a minha vontade de interagir com outros virtualmente? Ainda assim, planejamos uma redução de escopo, fizemos mais pesquisas e estava tudo bem, talvez.&lt;/p&gt;

&lt;p&gt;Mas não estava. Eu já sabia que, apesar de já ter sido apaixonado por aquele tema, nenhum caminho que eu via naquele momento me levaria a um resultado satisfatório. E isso, a cada reunião, estava me deixando cada vez mais ansioso e incerto. Aquela sensação de saber o que precisa ser feito agora, mas perder todo o ânimo de continuar só por imaginar que no fim das contas não vai haver tempo o suficiente para fazer o melhor possível.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Facr0661hf2lbjubi2fjw.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Facr0661hf2lbjubi2fjw.gif" alt="Trabalhando no TCC." width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Junto a isso, havia uma impotência ainda maior na insatisfação com aquele tema. Afinal, que direito eu tinha de não querer trabalhá-lo? Eu me agarrei com unhas e dentes a uma ideia que eu mesmo havia sugerido, fiz com que a lapidássemos de diversas formas e tinha uma proposta que, de diversos ângulos, parecia factível. Desistir de algo que você insistiu não é nada fácil. Mas eu não estava nada feliz.&lt;/p&gt;

&lt;p&gt;Foi nesse momento que uma ideia antiga, que eu não havia sugerido anteriormente por não ter domínio do tema, voltou à minha mente. Ao comentá-lo com alguns amigos que estavam acompanhando o andamento do meu trabalho, eles perceberam que essa nova proposta realmente me deixava empolgado e me incentivaram a sugeri-la. Com um novo ânimo, criei coragem e conversei com a minha orientadora: "não quero decepcioná-la, mas podemos mudar de tema?"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhjdekee369vd9pqrh0b.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhjdekee369vd9pqrh0b.gif" alt="Implorando..." width="498" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E mais uma vez, provavelmente por eu ter muito privilégio de estar rodeado de gente incrivelmente acolhedora, eu não fui contrariado. Estávamos lá, com menos de três meses para desenvolver todo o TCC, com uma nova proposta em uma área totalmente diferente, com um propósito totalmente diferente. A diferença era: agora eu sentia que era o tema certo.&lt;/p&gt;

&lt;p&gt;Escrevi uma nova proposta, comecei a fazer os experimentos, digitei incansavelmente aquele trabalho e, o melhor de tudo, eu me vi apaixonado mais uma vez por um projeto. Depois de muitas linhas de código, muitas horas ouvindo "Te Amo Lá Fora" da DUDA BEAT, muitas revisões e muito apoio, consegui terminar o trabalho de que mais me orgulho até hoje. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/B6vfi_i2RnA"&gt;
&lt;/iframe&gt;
&lt;br&gt;
&lt;em&gt;Eu‌ ‌esqueci‌ ‌dessa‌ ‌lição‌ ‌de‌ ‌me‌ ‌tratar‌ ‌com‌ ‌mais‌ ‌amor‌ ‌&lt;br&gt;
Restou‌ ‌um‌ ‌pouco‌ ‌de‌ ‌esperança,‌ ‌dеcidi‌ ‌que‌ ‌é‌ ‌pra‌ ‌lá‌ ‌que‌ ‌eu‌ ‌vou&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Espero que essa história ~de superação~ seja um incentivo para você acreditar que não deve ter medo de mudar de rota. É claro: seja racional, considere bem todas as suas opções. Se, no fim das contas, você sente que há algo que poderia te levar por um caminho em que você se sinta uma pessoa mais realizada, não tema.&lt;/p&gt;

&lt;p&gt;Como diria Lady Gaga em sua fala icônica, pode haver 100 pessoas em uma sala e 99 não acreditam em você, mas basta que uma acredite. E essa primeira pessoa, por mais clichê que seja dizer isso, &lt;strong&gt;precisa&lt;/strong&gt; ser você. Espero que, como eu tive e tenho, você tenha a chance de estar rodeado por uma comunidade de pessoas que te levam para frente, mas acreditar em si é o primeiro e mais importante passo!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgqmgsako7777k3x5ynaq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgqmgsako7777k3x5ynaq.gif" alt="Pode haver 100 pessoas em uma sala e 99 não acreditam, mas você só precisa de 1 para acreditar." width="550" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura! Meu nome é Robson e normalmente você pode me encontrar no &lt;a href="https://twitter.com/JRosboJr" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, no &lt;a href="https://instagram.com/jrobsonjr" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; ou no &lt;a href="https://www.linkedin.com/in/jrobsonjr/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ptbr</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Bem-vindos e bem-vindas, feras de Computação@UFCG!</title>
      <dc:creator>Robson Junior</dc:creator>
      <pubDate>Thu, 12 Mar 2020 16:51:09 +0000</pubDate>
      <link>https://forem.com/opendevufcg/bem-vindos-e-bem-vindas-feras-de-computacao-ufcg-6c6</link>
      <guid>https://forem.com/opendevufcg/bem-vindos-e-bem-vindas-feras-de-computacao-ufcg-6c6</guid>
      <description>&lt;h2&gt;
  
  
  Oi, feras!
&lt;/h2&gt;

&lt;p&gt;Primeiramente, bem-vindos ao curso de Ciência da Computação! Esperamos que todos se sintam acolhidos com esse contato inicial da Semana do Fera. O PET organiza tudo com muito carinho e ficamos felizes em fazer parte de um pouquinho disso. ✨&lt;/p&gt;

&lt;p&gt;Tivemos a apresentação de algumas organizações estudantis do nosso curso, incluindo o OpenDevUFCG. Como prometido, vamos repassar algumas informações para quem ainda ficou meio perdido/orientações iniciais para quem não esteve presente ficar por dentro da nossa comunidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quais são os links mais importantes?
&lt;/h3&gt;

&lt;p&gt;O link mágico que centraliza tudo é o nosso &lt;a href="https://opendevufcg.org" rel="noopener noreferrer"&gt;portal&lt;/a&gt;. Lá tem descrição da nossa visão (basicamente o motivo de nós existirmos), alguns dos nossos projetos e os integrantes do nosso core team. Outros projetos que devem ser de principal interesse para vocês nesse momento inicial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="//tamburetei.opendevufcg.org"&gt;Tamburetei&lt;/a&gt;, o nosso repositório de leites e dicas das disciplinas;&lt;/li&gt;
&lt;li&gt;
&lt;a href="//glossario.opendevufcg.org"&gt;Glossário&lt;/a&gt;, o guia para entender e se localizar melhor no curso;&lt;/li&gt;
&lt;li&gt;o &lt;a href="//dev.to/opendevufcg"&gt;blog OpenDevUFCG&lt;/a&gt;, que você deve estar lendo nesse momento. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O código fonte de todos esses projetos está hospedado no nosso &lt;a href="//github.com/OpenDevUFCG"&gt;GitHub&lt;/a&gt;:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/OpenDevUFCG" rel="noopener noreferrer"&gt;
        OpenDevUFCG
      &lt;/a&gt; / &lt;a href="https://github.com/OpenDevUFCG/opendevufcg.org" rel="noopener noreferrer"&gt;
        opendevufcg.org
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Portal da OpenDevUFCG
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;OpenDevUFCG &lt;a href="https://discord.gg/UgR5WrY" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d75071dbb402797f29b81c5833bfeac6aa622252654a618780f7ee88349bd3a6/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3535383239333537333439343131323235372e7376673f6c6f676f3d646973636f7264" alt="chat on Discord"&gt;&lt;/a&gt;
&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Este repositório contém o código que faz o &lt;a href="https://opendevufcg.org/" rel="nofollow noopener noreferrer"&gt;portal da OpenDevUFCG&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Objetivo&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Objetivo do &lt;a href="https://opendevufcg.org/" rel="nofollow noopener noreferrer"&gt;opendevufcg.org&lt;/a&gt; é ser um site de apresentação para qualquer um que queria saber quem é a OpenDevUFCG, contendo informações sobre o que fazemos, nossos valores, e também uma listagem de projetos e maintainers atuais.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A filosofia desse projeto é ser simples sempre!&lt;/strong&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Como funciona&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;O site é feito utilizando apenas o essencial, &lt;strong&gt;Javascript&lt;/strong&gt;, &lt;strong&gt;HTML&lt;/strong&gt; e &lt;strong&gt;CSS&lt;/strong&gt;. Caso não conheça essas linguagens e como elas se comunicam, &lt;a href="http://apexensino.com.br/html-css-e-javascript-entendendo-melhor-base-da-programacao-front-end/" rel="nofollow noopener noreferrer"&gt;veja aqui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Você pode encontrar o código na pasta &lt;a href="https://github.com/OpenDevUFCG/opendevufcg.orgdocs" rel="noopener noreferrer"&gt;&lt;code&gt;docs/&lt;/code&gt;&lt;/a&gt;. Caso queira entender melhor do código, veja nosso &lt;a href="https://github.com/OpenDevUFCG/opendevufcg.org/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Desenvolvimento&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Caso deseje fazer alterações no código, você pode rodar o site na sua máquina, basta apenas que você tenha algum browser. Recomendamos que você faça um &lt;a href="https://github.com/UNIVALI-LITE/Portugol-Studio/wiki/Fazendo-um-Fork-do-reposit%C3%B3rio" rel="noopener noreferrer"&gt;&lt;strong&gt;Fork&lt;/strong&gt;&lt;/a&gt; do repositório e o &lt;em&gt;Clone&lt;/em&gt; para sua máquina:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/&lt;span class="pl-k"&gt;&amp;lt;&lt;/span&gt;seu_usuario&lt;span class="pl-k"&gt;&amp;gt;&lt;/span&gt;/opendevufcg.org&lt;/pre&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Substitua &amp;lt;seu_usuario&amp;amp;gt…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/OpenDevUFCG/opendevufcg.org" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Mas eu ainda não entendi nada de open source e GitHub, o que eu faço?
&lt;/h3&gt;

&lt;p&gt;Falando mais especificamente do blog, ressaltamos a publicação que faz uma introdução do zero a alguns conceitos de open source e GitHub que foi pensada especialmente para quem está chegando agora:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/opendevufcg" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F726%2F786a8f6e-b488-4e18-a2e3-4f9188f718aa.png" alt="OpenDevUFCG" width="500" height="500"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F158995%2F5b74a725-ccd2-4cfd-9297-fc02d6cbbeeb.jpeg" alt="" width="460" height="460"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/opendevufcg/contribuindo-para-projetos-open-source-com-github-3i76" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Contribuindo para projetos open source com GitHub&lt;/h2&gt;
      &lt;h3&gt;Lucas de Medeiros for OpenDevUFCG ・ Aug 3 '19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#community&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ptbr&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;E é claro, estamos disponíveis para esclarecer eventuais dúvidas. ;)&lt;/p&gt;

&lt;h3&gt;
  
  
  E o que eu tenho a ganhar contribuindo com open source?
&lt;/h3&gt;

&lt;p&gt;Fanny, integrante do nosso Core Team, conta um pouco de como o open source e o OpenDevUFCG contribuíram para que ela chegasse até uma vaga de estágio no Facebook. Tem que respeitar, viu?&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/X5iIpXW-Exs"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Como entro em contato com o OpenDevUFCG?
&lt;/h3&gt;

&lt;p&gt;O principal meio de comunicação com a comunidade OpenDevUFCG é o nosso &lt;a href="https://discordapp.com/invite/vFFGGEE" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;. Também é possível ficar por dentro das nossas atividades através das redes sociais: &lt;a href="//instagram.com/OpenDevUFCG"&gt;Instagram&lt;/a&gt; e &lt;a href="//twitter.com/OpenDevUFCG"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyy4tfbjork2asuuuy8l.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyy4tfbjork2asuuuy8l.gif" alt="Cachorro digitando" width="480" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No mais, lembrem-se que estamos aqui para ajudá-los. Não fiquem com vergonha de falar conosco caso tenham dúvidas de como começar e como contribuir. Desejamos a todos um ótimo período! &amp;lt;3&lt;/p&gt;

</description>
      <category>ptbr</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Projetos open source que apoiamos no Hacktoberfest 2019</title>
      <dc:creator>Robson Junior</dc:creator>
      <pubDate>Sat, 05 Oct 2019 23:46:06 +0000</pubDate>
      <link>https://forem.com/opendevufcg/projetos-open-source-que-apoiamos-no-hacktoberfest-2019-34be</link>
      <guid>https://forem.com/opendevufcg/projetos-open-source-que-apoiamos-no-hacktoberfest-2019-34be</guid>
      <description>&lt;p&gt;Já estamos no quinto dia do &lt;strong&gt;Hacktoberfest 2019&lt;/strong&gt; e amando ver tanta gente engajada com a causa! &lt;a href="https://twitter.com/OpenDevUFCG/status/1178114564132618240" rel="noopener noreferrer"&gt;Pedimos aos alunos de Computação@UFCG&lt;/a&gt; que compartilhassem conosco seus projetos open source e agora nós os compartilhamos com todo mundo. Confira alguns dos repositórios criados e mantidos por alunos do nosso curso!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Guardians-DSC" rel="noopener noreferrer"&gt;
        Guardians-DSC
      &lt;/a&gt; / &lt;a href="https://github.com/Guardians-DSC/horarios-ufcg" rel="noopener noreferrer"&gt;
        horarios-ufcg
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Visualização dos horários das disciplinas do curso de Ciência da Computação da UFCG
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Frontend, design&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; JavaScript, HTML, CSS, Vue&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Guardians-DSC" rel="noopener noreferrer"&gt;
        Guardians-DSC
      &lt;/a&gt; / &lt;a href="https://github.com/Guardians-DSC/horarios-ufcg-api" rel="noopener noreferrer"&gt;
        horarios-ufcg-api
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Api dos horários das disciplinas do curso de Ciência da Computação da UFCG
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Backend&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; JavaScript, Node.js, Docker&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Guardians-DSC" rel="noopener noreferrer"&gt;
        Guardians-DSC
      &lt;/a&gt; / &lt;a href="https://github.com/Guardians-DSC/iarl-vue" rel="noopener noreferrer"&gt;
        iarl-vue
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Aplicação da Interface de Acesso Remoto aos Laboratórios em VueJS
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Frontend, design&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; JavaScript, Vue, Docker&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/dadosjusbr" rel="noopener noreferrer"&gt;
        dadosjusbr
      &lt;/a&gt; / &lt;a href="https://github.com/dadosjusbr/api" rel="noopener noreferrer"&gt;
        api
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Site que publica as informações libertadas pelo DadosJusBR
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Data science, recuperação da informação, frontend&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; Go, HTML&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/joseims" rel="noopener noreferrer"&gt;
        joseims
      &lt;/a&gt; / &lt;a href="https://github.com/joseims/doqueru-kun" rel="noopener noreferrer"&gt;
        doqueru-kun
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🐌
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Sistemas operacionais&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; Perl, Shell, Python&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/richecr" rel="noopener noreferrer"&gt;
        richecr
      &lt;/a&gt; / &lt;a href="https://github.com/richecr/CamaraDosDeputados" rel="noopener noreferrer"&gt;
        CamaraDosDeputados
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Aplicativo web da câmara dos deputados usando ReactJS.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Frontend, design&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; JavaScript, HTML, CSS, React&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/richecr" rel="noopener noreferrer"&gt;
        richecr
      &lt;/a&gt; / &lt;a href="https://github.com/richecr/PyGraph" rel="noopener noreferrer"&gt;
        PyGraph
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Biblioteca com intuito de implementar os tipos de grafos e os algoritmos de Teoria dos Grafos.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Backend, educação, biblioteca&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; Python&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/richecr" rel="noopener noreferrer"&gt;
        richecr
      &lt;/a&gt; / &lt;a href="https://github.com/richecr/PyTwitterSDK" rel="noopener noreferrer"&gt;
        PyTwitterSDK
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A Python SDK for the API Twitter.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Backend&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; Python&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/felipemarinho97" rel="noopener noreferrer"&gt;
        felipemarinho97
      &lt;/a&gt; / &lt;a href="https://github.com/felipemarinho97/pipeline-previewer" rel="noopener noreferrer"&gt;
        pipeline-previewer
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Application that allows you to view and manage multiple deploys on a single static server through a graphical interface.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Frontend, backend, dev tools&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; JavaScript, HTML, CSS, Vue, Node.js&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/dados-congresso" rel="noopener noreferrer"&gt;
        dados-congresso
      &lt;/a&gt; / &lt;a href="https://github.com/dados-congresso/raspador-discursos-camara" rel="noopener noreferrer"&gt;
        raspador-discursos-camara
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      scripts para baixar discursos dos deputados em sessões políticas
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Data science, scraping&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; Python&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/0xHericles" rel="noopener noreferrer"&gt;
        0xHericles
      &lt;/a&gt; / &lt;a href="https://github.com/0xHericles/cast-sh" rel="noopener noreferrer"&gt;
        cast-sh
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      📟 An instance of your terminal in your browser
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Frontend, backend&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; Python, HTML, JavaScript, Docker&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/Benardi" rel="noopener noreferrer"&gt;
        Benardi
      &lt;/a&gt; / &lt;a href="https://github.com/Benardi/touvlo" rel="noopener noreferrer"&gt;
        touvlo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🤖 ML algorithms implemented  from scratch and provided block by block 
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Machine learning, data science&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; Python&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/calluswhatyouwant" rel="noopener noreferrer"&gt;
        calluswhatyouwant
      &lt;/a&gt; / &lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk" rel="noopener noreferrer"&gt;
        spotify-web-sdk
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A JS SDK for the Spotify Web API.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Backend, biblioteca&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; TypeScript, mocha, chai, nock&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/calluswhatyouwant" rel="noopener noreferrer"&gt;
        calluswhatyouwant
      &lt;/a&gt; / &lt;a href="https://github.com/calluswhatyouwant/musicritic" rel="noopener noreferrer"&gt;
        musicritic
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Your personal music-specific Metacritic.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Frontend, design&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; JavaScript, HTML, CSS, React&lt;/p&gt;




&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/calluswhatyouwant" rel="noopener noreferrer"&gt;
        calluswhatyouwant
      &lt;/a&gt; / &lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor" rel="noopener noreferrer"&gt;
        spotify-playlist-editor
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Sort your Spotify playlists any way you want.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tópicos:&lt;/strong&gt; Frontend, design&lt;br&gt;
&lt;strong&gt;Principais linguagens e tecnologias:&lt;/strong&gt; JavaScript, HTML, CSS, React&lt;/p&gt;
&lt;h2&gt;
  
  
  Repositórios do OpenDevUFCG
&lt;/h2&gt;

&lt;p&gt;Não vamos esquecer dos nossos próprios repositórios, né? ❤️ Temos várias issues abertas, especialmente no Tamburetei, que é super fácil de contribuir. Corre lá!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/OpenDevUFCG" rel="noopener noreferrer"&gt;
        OpenDevUFCG
      &lt;/a&gt; / &lt;a href="https://github.com/OpenDevUFCG/Tamburetei" rel="noopener noreferrer"&gt;
        Tamburetei
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Fazendo de tamburete as cadeiras de CC@UFCG.
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Ainda mais repositórios
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.to/jtemporal"&gt;Jessica Temporal&lt;/a&gt; publicou no blog dela uma lista enorme de projetos brasileiros para contribuir nesse Hacktoberfest. Não deixe de conferir o montão de ideias que são mantidas por pessoas do nosso país!&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;div class="ltag__link__content"&gt;
    &lt;div class="missing"&gt;
      &lt;h2&gt;Article No Longer Available&lt;/h2&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Mais por vir!
&lt;/h2&gt;

&lt;p&gt;Estamos preparando bastante coisa para esse mês tão lindo para o open source. Continuem nos acompanhando nas redes sociais (&lt;a href="https://twitter.com/OpenDevUFCG" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; e &lt;a href="https://instagram.com/OpenDevUFCG" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt;)!&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1179961889675235329-130" src="https://platform.twitter.com/embed/Tweet.html?id=1179961889675235329"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1179961889675235329-130');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1179961889675235329&amp;amp;theme=dark"
  }



&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>contributorswanted</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Usando o spotify-web-sdk para gerenciar requisições à API Web do Spotify</title>
      <dc:creator>Robson Junior</dc:creator>
      <pubDate>Sun, 15 Sep 2019 00:45:18 +0000</pubDate>
      <link>https://forem.com/opendevufcg/usando-o-spotify-web-sdk-para-gerenciar-requisicoes-a-api-web-do-spotify-3j3i</link>
      <guid>https://forem.com/opendevufcg/usando-o-spotify-web-sdk-para-gerenciar-requisicoes-a-api-web-do-spotify-3j3i</guid>
      <description>&lt;p&gt;Eu e &lt;a href="https://dev.to/joserenan"&gt;Renan&lt;/a&gt; temos uma organização open source chamada &lt;a href="https://github.com/calluswhatyouwant" rel="noopener noreferrer"&gt;Call Us What You Want&lt;/a&gt;, na qual desenvolvemos aplicações com foco em música. Um de nossos projetos é um SDK para a API Web do Spotify, que criamos para servir de apoio para outras aplicações que fazem uso desses dados.&lt;/p&gt;

&lt;p&gt;Nessa postagem (que é tradução de &lt;a href="https://dev.to/calluswhatyouwant/using-spotify-web-sdk-to-handle-requests-to-the-spotify-web-api-2oj6"&gt;uma feita originalmente no dev.to da nossa organização&lt;/a&gt;), vou mostrar como o &lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk" rel="noopener noreferrer"&gt;spotify-web-sdk&lt;/a&gt; pode facilitar a recuperação e a gerência de dados de usuários do Spotify. Farei isso descrevendo o processo de desenvolvimento de uma aplicação inspirada por um problema &lt;em&gt;muito sério&lt;/em&gt; que eu enfrentava como usuário dessa plataforma de streaming. &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/calluswhatyouwant" rel="noopener noreferrer"&gt;
        calluswhatyouwant
      &lt;/a&gt; / &lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk" rel="noopener noreferrer"&gt;
        spotify-web-sdk
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A JS SDK for the Spotify Web API.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Spotify Web SDK&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A JavaScript SDK for the &lt;a href="https://developer.spotify.com/documentation/web-api/" rel="nofollow noopener noreferrer"&gt;Spotify Web API&lt;/a&gt;
Note that this project is still a BETA version.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#installation" rel="noopener noreferrer"&gt;Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#community" rel="noopener noreferrer"&gt;Community&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#suggest-a-new-feature-or-report-a-bug" rel="noopener noreferrer"&gt;Suggest a new feature or report a bug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#do-it-yourself" rel="noopener noreferrer"&gt;Do it yourself&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#maintainers" rel="noopener noreferrer"&gt;Maintainers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#hall-of-fame" rel="noopener noreferrer"&gt;Hall of Fame&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;"Why should I use this?"&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;We want to handle the hard work for you.
Even to make simple requests, such as to get information on a track, you'd need to make a bunch of setups.
Here is how you could do the same thing with our aid:&lt;/p&gt;
&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-c1"&gt;*&lt;/span&gt; &lt;span class="pl-k"&gt;as&lt;/span&gt; &lt;span class="pl-s1"&gt;spotify&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'spotify-web-sdk'&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-s1"&gt;spotify&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;init&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt; &lt;span class="pl-c1"&gt;token&lt;/span&gt;: &lt;span class="pl-s"&gt;'YOUR SPOTIFY TOKEN HERE!'&lt;/span&gt; &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt; &lt;span class="pl-c"&gt;// You should only need to run this once.&lt;/span&gt;
&lt;span class="pl-s1"&gt;spotify&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;getTrack&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'3LOpHuEpjkL4T1Zcjhko8w'&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt; &lt;span class="pl-c"&gt;// Or any other track id.&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Yes, it's as simple as that!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;"I still think it's no hard work at all.&lt;/h3&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/calluswhatyouwant/spotify-web-sdk" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h1&gt;
  
  
  Um problema do mundo real (&lt;em&gt;A little motivation&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;A seção de álbuns da minha biblioteca do Spotify é bem desorganizada, mas não exatamente por culpa minha — na implementação do aplicativo, sempre que um single é adicionado às músicas, o mesmo também acaba aparecendo como álbum. Isso acaba sendo um problema na hora de localizar algo para ouvir, já que eu prefiro consumir álbuns do início ao fim no lugar de entrar no modo aleatório das playlists.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzsb4asmtt5d5ztpo5hoo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzsb4asmtt5d5ztpo5hoo.png" alt="Screenshot de álbuns no Spotify" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;b&gt;Comfort Crowd&lt;/b&gt; and &lt;b&gt;People&lt;/b&gt; são singles, mas também aparecem na minha biblioteca como álbuns.



&lt;p&gt;Pensei em uma solução simples: criei uma &lt;a href="https://open.spotify.com/user/jrobsonjr/playlist/7lWSJamQptWauCMIEDXgYC?si=HZZTKAY8RWObSGEdYm-4uA" rel="noopener noreferrer"&gt;playlist&lt;/a&gt; contendo a primeira faixa de cada álbum que eu já ouvi. Ter essa playlist é muito útil para que eu também mantenha o registro do dia em que ouvi os trabalhos inteiros pela primeira vez (pelo menos quando eu lembro de adicioná-los assim que termino de escutá-los). Problema resolvido... ao menos parcialmente. Bem, para manter as coisas ainda mais organizadas, eu ainda queria poder ordenar as referências aos álbuns pelas suas datas de lançamento, algo que o Spotify ainda não dá suporte (mesmo com usuários pedindo por essa feature &lt;a href="https://community.spotify.com/t5/Live-Ideas/Your-Music-Sort-Music-in-quot-Your-Music-quot-by-Year/idi-p/744893" rel="noopener noreferrer"&gt;há mais de cinco anos&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Procurei por ferramentas que pudessem gerenciar esse método de ordenação para mim e descobri uma aplicação web chamada &lt;a href="http://sortyourmusic.playlistmachinery.com/" rel="noopener noreferrer"&gt;Sort Your Music&lt;/a&gt;. Apesar de ser super simples e eficiente de usar, a abordagem de ordenação deles sobrescreve a data de adição das faixas. Sei que por agora você já deve estar revirando os olhos com a minha insatisfação, mas, sabendo que é possível conseguir o resultado que eu desejo, decidi implementar a minha própria ferramenta. Nada como um pequeno "faça você mesmo", certo?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35plebrwy8zvouqiiu5m.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F35plebrwy8zvouqiiu5m.gif" alt="Taylor Swift com ódio" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;
Perdoe-me caso você não enfrente esse problema no seu dia a dia.



&lt;h1&gt;
  
  
  Devagar e sempre
&lt;/h1&gt;

&lt;p&gt;A API Web do Spotify disponibiliza dois endpoints para gerência de playlists: &lt;a href="https://developer.spotify.com/documentation/web-api/reference/playlists/replace-playlists-tracks" rel="noopener noreferrer"&gt;um&lt;/a&gt; que permite sobrescrever todas as faixas e &lt;a href="https://developer.spotify.com/documentation/web-api/reference/playlists/reorder-playlists-tracks/" rel="noopener noreferrer"&gt;outro&lt;/a&gt; que pode ser usado para mover uma faixa ou um bloco de faixas. Ao contrário do primeiro, este não modifica o &lt;em&gt;timestamp&lt;/em&gt; que indica quando as faixas foram adicionadas à playlist e o identificador de quem as adicionou (para playlists colaborativas).  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk763yquv20q848pdvuhe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk763yquv20q848pdvuhe.png" alt="Visualização da reordenação de faixas" width="506" height="262"&gt;&lt;/a&gt;&lt;/p&gt;
Visualização de como funciona o endpoint "reordenação de faixas de uma playlist". &lt;br&gt; Fonte: &lt;a href="https://developer.spotify.com/documentation/web-api/reference/playlists/reorder-playlists-tracks/" rel="noopener noreferrer"&gt;Spotify for Developers&lt;/a&gt;



&lt;p&gt;Como visto acima, esse endpoint funciona de forma que ordenar uma playlist requer várias requisições consecutivas (basicamente uma requisição por faixa na playlist), o que também significa que leva muito mais tempo do que simplesmente sobrescrever tudo. Sacrifícios tiveram que ser feitos, mas o resultado é exatamente o esperado: aqui está o &lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor" rel="noopener noreferrer"&gt;Spotify Playlist Editor&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mhaxmvbqepdmocpclq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mhaxmvbqepdmocpclq3.png" alt="Spotify Playlist Editor" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;
Quando você tiver feito login, algo assim deve aparecer na tela inicial da aplicação.



&lt;h1&gt;
  
  
  Detalhando o processo (mas não demais)
&lt;/h1&gt;

&lt;p&gt;Eu queria prototipar uma aplicação React o mais rápido possível, então usei o &lt;a href="https://facebook.github.io/create-react-app/" rel="noopener noreferrer"&gt;create-react-app&lt;/a&gt;, que me poupou muito tempo de configurações iniciais. Em geral, encorajo que você tente entender como criar uma aplicação React do zero, mas isso é com certeza é uma mão na roda quando se tem pressa. Para manter tudo simples, o &lt;strong&gt;Spotify Playlist Editor&lt;/strong&gt; é &lt;em&gt;serverless&lt;/em&gt;, mas permite que todos acessem seus dados do Spotify através de uma implementação do &lt;a href="https://developer.spotify.com/documentation/general/guides/authorization-guide/" rel="noopener noreferrer"&gt;fluxo de concessão implícita&lt;/a&gt;, uma abordagem simples para conseguir token de acesso à API.&lt;/p&gt;

&lt;p&gt;Incluí alguns pacotes e ferramentas para simplificar o processo de codificação (por exemplo, &lt;a href="https://getbootstrap.com" rel="noopener noreferrer"&gt;Bootstrap&lt;/a&gt; para que eu me preocupasse menos com estilos e &lt;a href="https://prettier.io/" rel="noopener noreferrer"&gt;prettier&lt;/a&gt; para ajudar a manter o código padronizadinho). Também considero interessante mencionar que uso &lt;a href="https://flow.org" rel="noopener noreferrer"&gt;Flow&lt;/a&gt; para checagem estática de tipos. Eu amo que JavaScript tem tipagem dinâmica, mas como o SDK lida com muitos modelos que têm, por sua vez, muitos atributos, Flow se torna um ótimo aliado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5cc5wozmf3c7qxhovub8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5cc5wozmf3c7qxhovub8.png" alt="IntelliSense" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;
Você pode até odiar o Flow, mas o fato é que React + Flow + &lt;a href="https://code.visualstudio.com/docs/editor/intellisense" rel="noopener noreferrer"&gt;IntelliSense&lt;/a&gt; é um verdadeiro dream team.



&lt;h2&gt;
  
  
  Conheça o melhor amigo &lt;del&gt;autoproclamado&lt;/del&gt; da API Web do Spotify, o spotify-web-sdk!
&lt;/h2&gt;

&lt;p&gt;Aqui está um trecho de código tirado do componente &lt;em&gt;UserPage&lt;/em&gt;. Você pode ver que alguns imports são feitos diretamente ao SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* @flow */&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&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;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* Funções que encapsulam endpoints da API do Spotify */&lt;/span&gt;
    &lt;span class="nx"&gt;init&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;getCurrentUserPlaylists&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;getCurrentUserProfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="cm"&gt;/* Modelos */&lt;/span&gt;
    &lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;PlaylistSimplified&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;PrivateUser&lt;/span&gt;&lt;span class="p"&gt;,&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;spotify-web-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;history&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PlaylistSimplified&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;playlists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PlaylistSimplified&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PrivateUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserPage&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Component&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Uma vez que o usuário esteja conectado ao Spotify, &lt;em&gt;UserPage&lt;/em&gt; é a página principal da aplicação. Seu principal propósito é exibir uma lista de playlists do usuário, com um botão que permite selecionar uma playlist de interesse. Inicialmente, cinco playlists são recuperadas:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;componentDidMount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getCurrentUserPlaylists&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;playlists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Ao manter o objeto &lt;em&gt;page&lt;/em&gt; no state do componente, requisitar mais playlists é tão simples quanto poderia ser. Isso é graças à lógica de recuperar os próximos dados já estar implementada lá na declaração da classe &lt;em&gt;Page&lt;/em&gt; no &lt;em&gt;spotify-web-sdk&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getNextPage&lt;/span&gt;&lt;span class="p"&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="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasNext&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;There are no more pages&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queryParams&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAxiosPageInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&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="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wrapper&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Dessa forma, lidar com toda essa lógica no editor de playlists se resume a uma simples chamada de função, dispensando a necessidade de manter-se a par de valores como limite e offset:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;loadMorePlaylists&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getNextPage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
    &lt;span class="c1"&gt;// Relaxa e deixa o spotify-web-sdk lidar com o trabalho duro!&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevState&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;playlists&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prevState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;playlists&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nextPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;playlists&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nextPage&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;O propósito principal da aplicação é permitir que os usuários ordenem suas playlists, então vamos focar nisso agora. Do componente &lt;em&gt;PlaylistPage&lt;/em&gt;, o usuário pode selecionar um método de ordenação (incluindo por data de lançamento!). Por baixo, minha implementação determina primeiro a ordem final esperada das faixas e então faz uso de chamadas sequenciais para reordená-las. É assim que funciona mais ou menos em código:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;reorderPlaylistTracks&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;spotify-web-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sortPlaylistTracksByAttribute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;insertionOrder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getInsertionOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;insertionOrder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;previousPromise&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;current&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;await&lt;/span&gt; &lt;span class="nx"&gt;previousPromise&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;moveTrackToTop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getInsertionOrder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&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="cm"&gt;/* Determina a ordem de inserção baseada no atributo escolhido. */&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moveTrackToTop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;oldIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;reorderPlaylistTracks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;oldIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;rangeLength&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;insertBefore&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A propósito, se você não está familizarizado com essa abordagem de resolver Promises sequencialmente usando &lt;em&gt;Array.prototype.reduce()&lt;/em&gt;, tem um excelente artigo explicando como e, mais importantemente, a &lt;strong&gt;razão&lt;/strong&gt; disso funcionar. Dá uma olhada lá no &lt;a href="https://css-tricks.com/why-using-reduce-to-sequentially-resolve-promises-works/" rel="noopener noreferrer"&gt;CSS Tricks&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Como mostrado acima, o objetivo principal do spotify-web-sdk é poupar tempo dos desenvolvedores que desejam fazer acesso à API Web do Spotify. No lugar de fazer chamadas diretas à API e se preocupar com detalhes, a maior parte do seu trabalho deve ser importar uma função e invocá-la no código. &lt;/p&gt;

&lt;p&gt;Caso você tenha interesse em construir sua própria aplicação usando dados do Spotify, a versão atual do &lt;em&gt;spotify-web-sdk&lt;/em&gt; está &lt;a href="https://npmjs.com/package/spotify-web-sdk" rel="noopener noreferrer"&gt;hospedada no NPM&lt;/a&gt; e pode ser adicionada rapidamente em um projeto com package.json rodando &lt;code&gt;npm add spotify-web-sdk&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Spotify Playlist Editor&lt;/strong&gt; também está no ar &lt;a href="https://calluswhatyouwant.github.io/spotify-playlist-editor/" rel="noopener noreferrer"&gt;aqui&lt;/a&gt; se você quiser brincar um pouco. Caso você experiencie qualquer coisa inesperada ao usar a aplicação, é apenas um treino para estimular o espírito open source: crie uma issue no repositório do GitHub! PRs também são sempre bem-vindas (tem umas issues abertas e o Hacktoberfest está logo aí...). &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/calluswhatyouwant" rel="noopener noreferrer"&gt;
        calluswhatyouwant
      &lt;/a&gt; / &lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor" rel="noopener noreferrer"&gt;
        spotify-playlist-editor
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Sort your Spotify playlists any way you want.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Spotify Playlist Editor&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Sort your Spotify playlists anyway you want! 🛠&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/calluswhatyouwant/spotify-playlist-editor./main-page.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcalluswhatyouwant%2Fspotify-playlist-editor.%2Fmain-page.png" alt="Initial page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor#community" rel="noopener noreferrer"&gt;Community&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor#installation-and-usage" rel="noopener noreferrer"&gt;Installation and Usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor#deployment" rel="noopener noreferrer"&gt;Deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor#suggest-a-new-feature-or-report-a-bug" rel="noopener noreferrer"&gt;Suggest a new feature or report a bug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor#maintainers" rel="noopener noreferrer"&gt;Maintainers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Create new playlists out of your recent Spotify tracks or your all-time top tracks;&lt;/li&gt;
&lt;li&gt;Sort playlists based on:
&lt;ul&gt;
&lt;li&gt;playlist track attributes (addition date);&lt;/li&gt;
&lt;li&gt;track attributes (name, length, popularity);&lt;/li&gt;
&lt;li&gt;album attributes (name, release date);&lt;/li&gt;
&lt;li&gt;artist attributes (name).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Current limitations&lt;/h3&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;It's highly recommended to create a copy of the playlists you want to edit or to use one of the playlist creation options. (play around, but do it safely!);&lt;/li&gt;
&lt;li&gt;You can only sort playlists with 100 tracks or less;&lt;/li&gt;
&lt;li&gt;Sorting might take a while (a playlist with 100 tracks can take between 30 seconds and 1 minute). Do NOT reload or close the playlist page until sorting is over.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Community&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Installation and Usage&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Simply run &lt;code&gt;yarn install&lt;/code&gt; to install the project's dependencies…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/calluswhatyouwant/spotify-playlist-editor" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;Se quiser ficar por dentro das novidades dos projetos do Call Us What You Want, acompanhe o nosso &lt;a href="https://twitter.com/CallUsWhat" rel="noopener noreferrer"&gt;perfil no Twitter&lt;/a&gt;!&lt;/p&gt;




&lt;p&gt;Muito obrigado pela leitura! Fique atento: em breve, teremos novos artigos de contribuidores do OpenDevUFCG aqui no &lt;strong&gt;dev.to&lt;/strong&gt;. Acompanhe o OpenDevUFCG no &lt;a href="https://twitter.com/OpenDevUFCG" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;, no &lt;a href="https://instagram.com/OpenDevUFCG" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; e, claro, no &lt;a href="https://github.com/OpenDevUFCG" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>music</category>
      <category>webdev</category>
      <category>showdev</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>Using spotify-web-sdk to handle requests to the Spotify Web API</title>
      <dc:creator>Robson Junior</dc:creator>
      <pubDate>Mon, 29 Apr 2019 18:00:15 +0000</pubDate>
      <link>https://forem.com/calluswhatyouwant/using-spotify-web-sdk-to-handle-requests-to-the-spotify-web-api-2oj6</link>
      <guid>https://forem.com/calluswhatyouwant/using-spotify-web-sdk-to-handle-requests-to-the-spotify-web-api-2oj6</guid>
      <description>&lt;p&gt;This is the first post of the &lt;strong&gt;Meet spotify-web-sdk!&lt;/strong&gt; series, in which we (&lt;a href="https://dev.to/calluswhatyouwant/call-us-what-you-want-is-officially-on-board-1km"&gt;Call Us What You Want&lt;/a&gt;) will comment about the possibilities offered by the Spotify Web API and some of our code design choices. In this first part, we'll see how spotify-web-sdk can help build &lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor" rel="noopener noreferrer"&gt;an application&lt;/a&gt; that uses Spotify Web API to retrieve information and manage a user's data.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/calluswhatyouwant" rel="noopener noreferrer"&gt;
        calluswhatyouwant
      &lt;/a&gt; / &lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk" rel="noopener noreferrer"&gt;
        spotify-web-sdk
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A JS SDK for the Spotify Web API.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Spotify Web SDK&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A JavaScript SDK for the &lt;a href="https://developer.spotify.com/documentation/web-api/" rel="nofollow noopener noreferrer"&gt;Spotify Web API&lt;/a&gt;
Note that this project is still a BETA version.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#installation" rel="noopener noreferrer"&gt;Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#usage" rel="noopener noreferrer"&gt;Usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#community" rel="noopener noreferrer"&gt;Community&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#suggest-a-new-feature-or-report-a-bug" rel="noopener noreferrer"&gt;Suggest a new feature or report a bug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#do-it-yourself" rel="noopener noreferrer"&gt;Do it yourself&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#maintainers" rel="noopener noreferrer"&gt;Maintainers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#hall-of-fame" rel="noopener noreferrer"&gt;Hall of Fame&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;"Why should I use this?"&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;We want to handle the hard work for you.
Even to make simple requests, such as to get information on a track, you'd need to make a bunch of setups.
Here is how you could do the same thing with our aid:&lt;/p&gt;
&lt;div class="highlight highlight-source-js notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-c1"&gt;*&lt;/span&gt; &lt;span class="pl-k"&gt;as&lt;/span&gt; &lt;span class="pl-s1"&gt;spotify&lt;/span&gt; &lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s"&gt;'spotify-web-sdk'&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt;
&lt;span class="pl-s1"&gt;spotify&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;init&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-kos"&gt;{&lt;/span&gt; &lt;span class="pl-c1"&gt;token&lt;/span&gt;: &lt;span class="pl-s"&gt;'YOUR SPOTIFY TOKEN HERE!'&lt;/span&gt; &lt;span class="pl-kos"&gt;}&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt; &lt;span class="pl-c"&gt;// You should only need to run this once.&lt;/span&gt;
&lt;span class="pl-s1"&gt;spotify&lt;/span&gt;&lt;span class="pl-kos"&gt;.&lt;/span&gt;&lt;span class="pl-en"&gt;getTrack&lt;/span&gt;&lt;span class="pl-kos"&gt;(&lt;/span&gt;&lt;span class="pl-s"&gt;'3LOpHuEpjkL4T1Zcjhko8w'&lt;/span&gt;&lt;span class="pl-kos"&gt;)&lt;/span&gt;&lt;span class="pl-kos"&gt;;&lt;/span&gt; &lt;span class="pl-c"&gt;// Or any other track id.&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Yes, it's as simple as that!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;"I still think it's no hard work at all.&lt;/h3&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/calluswhatyouwant/spotify-web-sdk" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h1&gt;
  
  
  The real-world problem (&lt;em&gt;Another day, another drama&lt;/em&gt;)
&lt;/h1&gt;

&lt;p&gt;The Album section of my Spotify library is very cluttered — the thing is, if I save a new single, it ends up being saved as an album as well. Maintaining a simple way to access each album is important to me because most of the time I'd rather listen to a whole EP/LP from start to finish instead of hitting the shuffle button in a playlist.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcp367j89mnnnuti5v5r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcp367j89mnnnuti5v5r.png" alt="Spotify Albums screenshot" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;b&gt;ME!&lt;/b&gt; and &lt;b&gt;The Other Side&lt;/b&gt; are both singles but also show up in my Spotify library as albums.



&lt;p&gt;I came up with a seemingly simple solution: I created &lt;a href="https://open.spotify.com/user/jrobsonjr/playlist/7lWSJamQptWauCMIEDXgYC?si=HZZTKAY8RWObSGEdYm-4uA" rel="noopener noreferrer"&gt;a playlist&lt;/a&gt; containing the first track of each album I've listened to. Having this playlist is also a great way to keep track of the day I first listened to new releases (at least when I remember to add them right away). Problem solved... at least partially. Well, to keep things tidier, I still wanted to sort my album references by their release date. The problem is that Spotify doesn't support this sorting method, even though users have been requesting it for &lt;a href="https://community.spotify.com/t5/Live-Ideas/Your-Music-Sort-Music-in-quot-Your-Music-quot-by-Year/idi-p/744893" rel="noopener noreferrer"&gt;over five years&lt;/a&gt;. Guess we can't have it all.&lt;/p&gt;

&lt;p&gt;I searched for tools that managed this sorting for me and there's a great web app named &lt;a href="http://sortyourmusic.playlistmachinery.com/" rel="noopener noreferrer"&gt;Sort Your Music&lt;/a&gt;. Even though it's pretty simple and efficient to use, their sorting approach overwrites the addition dates of tracks. I know I'm being quite a handful (&lt;a href="https://genius.com/Taylor-swift-me-lyrics" rel="noopener noreferrer"&gt;uh&lt;/a&gt;), but knowing it's possible, I decided to implement my own tool. Nothing like a little DIY, right?&lt;/p&gt;

&lt;h1&gt;
  
  
  I'm alright with a slow burn
&lt;/h1&gt;

&lt;p&gt;Managing playlists with the Spotify Web API can be done using two endpoints: &lt;a href="https://developer.spotify.com/documentation/web-api/reference/playlists/replace-playlists-tracks" rel="noopener noreferrer"&gt;one that allows replacing all tracks&lt;/a&gt; and &lt;a href="https://developer.spotify.com/documentation/web-api/reference/playlists/reorder-playlists-tracks/" rel="noopener noreferrer"&gt;another one that can be used to reorder a track or a block of tracks&lt;/a&gt;. Unlike the first one, the latter doesn't touch the timestamp that indicates when the tracks were added and the identifier of who added them (for collaborative playlists).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk763yquv20q848pdvuhe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk763yquv20q848pdvuhe.png" alt="Visualization of track reordering" width="506" height="262"&gt;&lt;/a&gt;&lt;/p&gt;
Visualization of how the "reorder a playlist's tracks" endpoint works. Source: &lt;a href="https://developer.spotify.com/documentation/web-api/reference/playlists/reorder-playlists-tracks/" rel="noopener noreferrer"&gt;Spotify for Developers&lt;/a&gt;



&lt;p&gt;As seen above, the endpoint works in such a way that sorting a playlist requires a lot of consecutive requests (basically, one request per track in the playlist), which also means it can take much longer than simply overwriting everything. Sacrifices had to be done, but the result is exactly what expected: here's &lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor" rel="noopener noreferrer"&gt;Spotify Playlist Editor&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mhaxmvbqepdmocpclq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mhaxmvbqepdmocpclq3.png" alt="Spotify Playlist Editor" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;
Once logged in, something like that should appear to you.



&lt;h1&gt;
  
  
  Detailing the process (but not too much)
&lt;/h1&gt;

&lt;p&gt;I wanted to prototype a React application as fast as I could, so I used &lt;a href="https://facebook.github.io/create-react-app/" rel="noopener noreferrer"&gt;create-react-app&lt;/a&gt;, saving me a lot of time of configuration. In general, I suggest everyone to take their time to understand how to create a React app from scratch, but this sure comes in handy! To keep things simple, &lt;strong&gt;Spotify Playlist Editor&lt;/strong&gt; is serverless but still lets anyone access their Spotify data by implementing the &lt;a href="https://developer.spotify.com/documentation/general/guides/authorization-guide/" rel="noopener noreferrer"&gt;Implicit Grant Flow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I included some packages and toolkits to simplify the coding process (for instance, &lt;a href="https://getbootstrap.com" rel="noopener noreferrer"&gt;Bootstrap&lt;/a&gt; so that I could worry less about styles and &lt;a href="https://prettier.io/" rel="noopener noreferrer"&gt;prettier&lt;/a&gt; to help keep the code neat). I think it's worth mentioning I'm using &lt;a href="https://flow.org" rel="noopener noreferrer"&gt;Flow&lt;/a&gt; for static type checking. I like that JavaScript is a dynamically typed language, but since the SDK deals with a lot of models which have each many attributes, Flow becomes a great ally.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5cc5wozmf3c7qxhovub8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5cc5wozmf3c7qxhovub8.png" alt="IntelliSense" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;
Also, React + Flow + &lt;a href="https://code.visualstudio.com/docs/editor/intellisense" rel="noopener noreferrer"&gt;IntelliSense&lt;/a&gt; is a dream combo.



&lt;h2&gt;
  
  
  Meet Spotify Web API's self-proclaimed best friend, spotify-web-sdk!
&lt;/h2&gt;

&lt;p&gt;Here's a snippet of code taken from the &lt;em&gt;UserPage&lt;/em&gt; component. You can see some imports made directly to the SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* @flow */&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&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;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* Functions that wrap Spotify endpoints */&lt;/span&gt;
    &lt;span class="nx"&gt;init&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;getCurrentUserPlaylists&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;getCurrentUserProfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="cm"&gt;/* Models */&lt;/span&gt;
    &lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;PlaylistSimplified&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;PrivateUser&lt;/span&gt;&lt;span class="p"&gt;,&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;spotify-web-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;history&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PlaylistSimplified&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;playlists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PlaylistSimplified&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PrivateUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserPage&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Component&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;State&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Once the user has connected to Spotify, &lt;em&gt;UserPage&lt;/em&gt; is the main page of the application. Its main purpose is to display a list of the current user's playlists, with a button to allow them to select a playlist of interest. Initially, five playlists are retrieved:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;componentDidMount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getCurrentUserPlaylists&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;playlists&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;By keeping the page object in the state, requesting more playlists is as simple as it gets. This is because the following logic is already implemented on spotify-web-sdk's Page object:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getNextPage&lt;/span&gt;&lt;span class="p"&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="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasNext&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;There are no more pages&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;queryParams&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;offset&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAxiosPageInstance&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&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="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wrapper&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Therefore, dealing with all this logic in the playlist editor is summed up to a single function call, dismissing the need of keeping track of values such as limit and offset:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;loadMorePlaylists&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getNextPage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Sit back and let spotify-web-sdk handle the hard work!&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevState&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;playlists&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prevState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;playlists&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nextPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;playlists&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nextPage&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The whole point of the application is to let users sort their playlists, so let's get to it. From the &lt;em&gt;PlaylistPage&lt;/em&gt;, the user can select a sorting method (release date included!). Initially, the expected order of the tracks is defined and then sequential operations are done to reorder them. This is more or less how it works in code:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&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;reorderPlaylistTracks&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;spotify-web-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sortPlaylistTracksByAttribute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;insertionOrder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getInsertionOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;insertionOrder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;previousPromise&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;current&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;await&lt;/span&gt; &lt;span class="nx"&gt;previousPromise&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;moveTrackToTop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getInsertionOrder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;playlistId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&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="cm"&gt;/* Determines the insertion order based on the attribute. */&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moveTrackToTop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;oldIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;reorderPlaylistTracks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;oldIndex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;rangeLength&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;insertBefore&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;BTW, if you're not familiar with this approach of resolving Promises sequentially using &lt;em&gt;Array.prototype.reduce()&lt;/em&gt;, there's a great article about how it works and, most importantly, &lt;strong&gt;why&lt;/strong&gt; it works. Check it out on &lt;a href="https://css-tricks.com/why-using-reduce-to-sequentially-resolve-promises-works/" rel="noopener noreferrer"&gt;CSS Tricks&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;If you'd like to see more details, I think that the commit log can be a good guide on what was added and when, since I try to make descriptive and succinct commit messages. &lt;strong&gt;Spotify Playlist Editor&lt;/strong&gt; is also live right &lt;a href="https://calluswhatyouwant.github.io/spotify-playlist-editor/" rel="noopener noreferrer"&gt;here&lt;/a&gt; if you want to play around a bit. If you come across anything unexpected, please, create an issue in the project's GitHub repository. PRs are also welcome and we do have a few issues already open, so suit yourself!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/calluswhatyouwant" rel="noopener noreferrer"&gt;
        calluswhatyouwant
      &lt;/a&gt; / &lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor" rel="noopener noreferrer"&gt;
        spotify-playlist-editor
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Sort your Spotify playlists any way you want.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Spotify Playlist Editor&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Sort your Spotify playlists anyway you want! 🛠&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/calluswhatyouwant/spotify-playlist-editor./main-page.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcalluswhatyouwant%2Fspotify-playlist-editor.%2Fmain-page.png" alt="Initial page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor#features" rel="noopener noreferrer"&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor#community" rel="noopener noreferrer"&gt;Community&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor#installation-and-usage" rel="noopener noreferrer"&gt;Installation and Usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor#deployment" rel="noopener noreferrer"&gt;Deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor#suggest-a-new-feature-or-report-a-bug" rel="noopener noreferrer"&gt;Suggest a new feature or report a bug&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/calluswhatyouwant/spotify-playlist-editor#maintainers" rel="noopener noreferrer"&gt;Maintainers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Create new playlists out of your recent Spotify tracks or your all-time top tracks;&lt;/li&gt;
&lt;li&gt;Sort playlists based on:
&lt;ul&gt;
&lt;li&gt;playlist track attributes (addition date);&lt;/li&gt;
&lt;li&gt;track attributes (name, length, popularity);&lt;/li&gt;
&lt;li&gt;album attributes (name, release date);&lt;/li&gt;
&lt;li&gt;artist attributes (name).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Current limitations&lt;/h3&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;It's highly recommended to create a copy of the playlists you want to edit or to use one of the playlist creation options. (play around, but do it safely!);&lt;/li&gt;
&lt;li&gt;You can only sort playlists with 100 tracks or less;&lt;/li&gt;
&lt;li&gt;Sorting might take a while (a playlist with 100 tracks can take between 30 seconds and 1 minute). Do NOT reload or close the playlist page until sorting is over.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Community&lt;/h2&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Installation and Usage&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;Simply run &lt;code&gt;yarn install&lt;/code&gt; to install the project's dependencies…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/calluswhatyouwant/spotify-playlist-editor" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;





&lt;p&gt;This is it for the part one of the &lt;strong&gt;Meet spotify-web-sdk!&lt;/strong&gt; series. What do you think? Let us know in the comments! If you're interested in knowing what we're up to, you can &lt;a href="https://twitter.com/CallUsWhat" rel="noopener noreferrer"&gt;find us on Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank you so much for reading and see you next time! 😉&lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Call Us What You Want is officially on board!</title>
      <dc:creator>Robson Junior</dc:creator>
      <pubDate>Fri, 19 Apr 2019 23:27:51 +0000</pubDate>
      <link>https://forem.com/calluswhatyouwant/call-us-what-you-want-is-officially-on-board-1km</link>
      <guid>https://forem.com/calluswhatyouwant/call-us-what-you-want-is-officially-on-board-1km</guid>
      <description>&lt;p&gt;Hello, World!&lt;/p&gt;

&lt;p&gt;We contemplated creating our own website from zero or using a platform such as Medium. In the end, we've decided that &lt;a href="//dev.to"&gt;dev.to&lt;/a&gt; is the perfect environment for our posts — just like &lt;em&gt;Call Us What You Want&lt;/em&gt;, it's 100% open source! &lt;/p&gt;

&lt;p&gt;Right now, you might be asking yourself: what is &lt;em&gt;Call Us What You Want&lt;/em&gt;? Put it simply, we're (at least two) friends that love music and programming. We originally created this organization with our first project idea: an open source platform where people can rate the music they listen to.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1107781263820275712-67" src="https://platform.twitter.com/embed/Tweet.html?id=1107781263820275712"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1107781263820275712-67');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1107781263820275712&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;We have been working on this project (which we named &lt;a href="https://github.com/calluswhatyouwant/musicritic" rel="noopener noreferrer"&gt;Musicritic&lt;/a&gt;) and &lt;a href="https://github.com/calluswhatyouwant/spotify-web-sdk" rel="noopener noreferrer"&gt;spotify-web-sdk&lt;/a&gt; for over a year now and while there's still a lot of work to be done, we've sure come a long way! We'd be honored if you took your time to check out our projects and maybe contribute with them yourself.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1103478430555951104-594" src="https://platform.twitter.com/embed/Tweet.html?id=1103478430555951104"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1103478430555951104-594');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1103478430555951104&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Here in &lt;strong&gt;dev.to&lt;/strong&gt; we intend to discuss our experiences and share what we've been learning along the road. Code design decisions, how to contribute with our repositories, our recommended best practices... We're here to continue improving ourselves and (who knows?) inspire people to contribute with open source as well.&lt;/p&gt;

&lt;p&gt;That's just about everything. Hope to see you all soon with posts that actually have some interesting content!&lt;/p&gt;

&lt;p&gt;Oh, I've just come across &lt;a href="https://dev.to/tomekponiat/my-pizza-recipe-3ook"&gt;a pizza recipe posted here&lt;/a&gt;... I guess we'll feel free to post about some other things from time to time. 😅&lt;/p&gt;

&lt;p&gt;Until next time!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>news</category>
    </item>
  </channel>
</rss>
