<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: David Snyder</title>
    <description>The latest articles on DEV Community by David Snyder (@snyderling).</description>
    <link>https://dev.to/snyderling</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%2F399461%2F3d96e510-602f-4cde-8c53-d9661c5df585.png</url>
      <title>DEV Community: David Snyder</title>
      <link>https://dev.to/snyderling</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/snyderling"/>
    <language>en</language>
    <item>
      <title>Set Up a personal File Host with Google Cloud Storage</title>
      <dc:creator>David Snyder</dc:creator>
      <pubDate>Sun, 11 Sep 2022 18:44:01 +0000</pubDate>
      <link>https://dev.to/snyderling/set-up-a-personal-cdn-with-google-cloud-storage-gpo</link>
      <guid>https://dev.to/snyderling/set-up-a-personal-cdn-with-google-cloud-storage-gpo</guid>
      <description>&lt;p&gt;Have you ever wanted to share a picture on a site that doesn't let you upload files? Or had a support ticket ask you to send links to screenshots? How would host those images so that you have a link to send? I personally would upload them to discord and use the &lt;code&gt;cdn.discordapp.com&lt;/code&gt; link that is created. But that isn't a great solution, so lets create our own file sharing server with Google Cloud Storage.&lt;/p&gt;

&lt;p&gt;To get started you'll need to have set up GCP, you can learn how to that &lt;a href="https://cloud.google.com/docs/get-started"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the Bucket for public file sharing
&lt;/h2&gt;

&lt;p&gt;Now that you're setup and in the &lt;a href="https://console.cloud.google.com/home/dashboard"&gt;GCP console&lt;/a&gt;, create a new project and navigate to &lt;a href="https://console.cloud.google.com/storage/browser"&gt;Google Cloud Storage&lt;/a&gt;. In the Cloud Storage browser, create a new bucket by clicking the button in the top.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zdI43TAe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.davidsnyder.tech/tutorial/create_bucket_screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zdI43TAe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.davidsnyder.tech/tutorial/create_bucket_screenshot.png" alt='screenshot of "create bucket" button' width="880" height="65"&gt;&lt;/a&gt;&lt;br&gt;
you can also create a bucket with the Google Cloud SDK with the command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gsutil mb standard gs://&amp;lt;bucket name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but make sure that &lt;code&gt;bucket name&lt;/code&gt; is globally unique.&lt;/p&gt;

&lt;p&gt;Now that you've created the bucket we need to give it public read access so that any client can load the files in it. You can do this by going to the &lt;code&gt;permissions&lt;/code&gt; section inside the bucket.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6q5XH27E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.davidsnyder.tech/tutorial/permissions_screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6q5XH27E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.davidsnyder.tech/tutorial/permissions_screenshot.png" alt="screenshot of  raw `permissions` endraw  tab" width="880" height="365"&gt;&lt;/a&gt;&lt;br&gt;
click "Add" in the permissions section and search for and select "allUsers" in the search bar for "principal". In the role search bar search for "Storage Object Viewer" and select it.&lt;br&gt;
Congrats! you've made all the objects in the bucket open to public, make sure there's nothing private in there.&lt;/p&gt;

&lt;p&gt;Now you have a bucket that you can upload files to and share the public link to the file, but that url will be an ugly &lt;code&gt;storage.googleapis.com&lt;/code&gt; url. Now let's make it so you can share your files with your own custom domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the Custom Domain
&lt;/h2&gt;

&lt;p&gt;To make a custom domain work we'll need to set up an HTTP(s) load balancer in GCP. To get started navigate to the &lt;a href="https://console.cloud.google.com/net-services/loadbalancing"&gt;load balancing&lt;/a&gt; page in the GCP console and create a load balancer with button at the top.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gjCYrodP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.davidsnyder.tech/tutorial/create_load_balancer_screenshot.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gjCYrodP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.davidsnyder.tech/tutorial/create_load_balancer_screenshot.png" alt="screenshot of load balancer create button" width="880" height="61"&gt;&lt;/a&gt;&lt;br&gt;
Select "Start Configuration" on the HTTP(S) load balancer, which is the first option on the left. Keep the defaults selected on the first page.&lt;br&gt;
Now you should be on a page that looks like this.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TAY3cxym--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.davidsnyder.tech/tutorial/create_load_balancer_page.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TAY3cxym--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.davidsnyder.tech/tutorial/create_load_balancer_page.png" alt='screen of "new HTTP(S) load balancer" page' width="880" height="432"&gt;&lt;/a&gt;&lt;br&gt;
On the "Frontend Configuration" tab give any name you'd like and change the protocol to "HTTPS (Includes HTTP/2)" and for "IP address" change it from "Ephemeral" to "Create IP Adress". Creating the IP address is easy, all you have to do is give it a name and Google with reserve a public static IP for you. Then click on the "Certificate" box and select "Create a new Certificate". In the modal, give the certificate a name and select "Create a google-managed certificate". In the "domains" box enter the domain you're planning to use with this with the subdomain included. Now certificate is being provisioned, this may take up to 24 hours but I found it took 30 minutes to 2 hours. Finally check the box for "Enable HTTP to HTTPS redirect" &lt;/p&gt;

&lt;p&gt;We're done with the Frontend tab, so navigate to the "Backend configuration" tab, click on "Backend Services &amp;amp; Backend Buckets", and select "Create a Backend Bucket". In the Modal give the backend bucket a name, it can be the same as your cloud storage bucket if you want, but it doesn't have to be globally unique. Then select "BROWSE" for cloud storage bucket and select the bucket you created previously. To make this file host even more powerful, check the box for "Enable Cloud CDN" and click "Create".&lt;/p&gt;

&lt;p&gt;In the "Routing Rules" tab click the "Add Host And Path Rule" button. In the host box enter your domain name with the subdomain you'r planning to use, in the path box enter "/*" to select all paths, and the backend bucket should be automatically selected as the backend.&lt;/p&gt;

&lt;p&gt;Now We're done in the GCP console, all that is left is to setup DNS for your domain. For that copy the IP address Google reserved for you earlier and add an "A" record in your DNS settings with the subdomain as the host and IP address.&lt;/p&gt;

&lt;p&gt;Now you just have to wait for the SSL certificate to finish provisioning, which as I said before will hopefully take 30 minutes to 2 hours.&lt;/p&gt;

&lt;p&gt;Congrats! you now have a file sharing server with a custom domain. To bring it all home take a look at the url for all the images in this tutorial and you'll see that I'm sharing them from &lt;code&gt;cdn.davidsnyder.tech&lt;/code&gt;, which is my personal File Host.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>googlecloud</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Promisify old callback functions</title>
      <dc:creator>David Snyder</dc:creator>
      <pubDate>Wed, 16 Sep 2020 02:28:15 +0000</pubDate>
      <link>https://dev.to/snyderling/promisify-old-callback-functions-5cke</link>
      <guid>https://dev.to/snyderling/promisify-old-callback-functions-5cke</guid>
      <description>&lt;p&gt;Are you using a library that still uses callback functions for their asynchronous code and you want to await those functions? This problem is easy to solve by wrapping the function in a promise. Here is how you do it&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="c1"&gt;//old method&lt;/span&gt;
&lt;span class="nx"&gt;doAsyncStuff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;params&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;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// with promises&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doPromiseStuff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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="nx"&gt;doAsyncStuff&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="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// in an async function&lt;/span&gt;
&lt;span class="k"&gt;try&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;result&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;doPromiseStuff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;params&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="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&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;Hope this helps 😃&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Twitchio.js: A better way to interact with twitch services</title>
      <dc:creator>David Snyder</dc:creator>
      <pubDate>Tue, 15 Sep 2020 21:30:25 +0000</pubDate>
      <link>https://dev.to/snyderling/twitchio-js-a-better-way-to-interact-with-twitch-services-nk1</link>
      <guid>https://dev.to/snyderling/twitchio-js-a-better-way-to-interact-with-twitch-services-nk1</guid>
      <description>&lt;h2&gt;
  
  
  🤔 What's this all about?
&lt;/h2&gt;

&lt;p&gt;Twitchio.js provides functions that make it easy to interact with Twitch API and other twitch related services including but not limited to the helix API, the Kraken API, the BTTV API, and the FFZ API.&lt;br&gt;
at its most basic Twitchio wraps twitch API credentials with the fetch function so you don't have to pass them in every time, but it also has functions that get data from different API endpoints for you with basic inputs.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚡ Quick and easy implementation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;step 1&lt;/strong&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="c1"&gt;//Install:&lt;/span&gt;
&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="nx"&gt;twitchio&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;

&lt;span class="c1"&gt;//Then, paste this at the top of your JavaScript file:&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TwitchIO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;twitchio-js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// or&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TwitchIO&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;twitchio-js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Use any of the commands explained the &lt;a href="https://github.com/GypsyDangerous/twitchio-js/blob/master/DOCUMENTATION.md"&gt;Documentation&lt;/a&gt; to interact with twitch services however you like.&lt;/p&gt;
&lt;h2&gt;
  
  
  For the Future
&lt;/h2&gt;

&lt;p&gt;If you want to &lt;strong&gt;contribute&lt;/strong&gt; and make this much better for developers, please have a look at &lt;a href="https://github.com/GypsyDangerous/twitchio-js/blob/master/CONTRIBUTING.md"&gt;Contributing Manual&lt;/a&gt; to understand the contribution steps.&lt;/p&gt;

&lt;p&gt;If you can help us with these. Please don't hesitate to open a &lt;a href="https://github.com/gypsydangerous/twitchio-js/pulls"&gt;pull request&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding More functions

&lt;ul&gt;
&lt;li&gt;functions for kraken endpoints&lt;/li&gt;
&lt;li&gt;more functions for helix endpoints &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Improving the documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you created something awesome and want to contribute then feel free to open Please don't hesitate to open an &lt;a href="https://github.com/gypsydangerous/twitchio-js/pulls"&gt;pull request&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://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/GypsyDangerous"&gt;
        GypsyDangerous
      &lt;/a&gt; / &lt;a href="https://github.com/GypsyDangerous/twitchio-js"&gt;
        twitchio-js
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Twitchio.js is a twitch API wrapper that makes it easier to interact with the Twitch API and other twitch related API's
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>npm</category>
      <category>contributorswanted</category>
    </item>
    <item>
      <title>Update 1.4.0 is out</title>
      <dc:creator>David Snyder</dc:creator>
      <pubDate>Sun, 13 Sep 2020 23:14:42 +0000</pubDate>
      <link>https://dev.to/disstreamchat/update-1-4-0-is-out-21cm</link>
      <guid>https://dev.to/disstreamchat/update-1-4-0-is-out-21cm</guid>
      <description>&lt;p&gt;DisStreamChat 1.4.0 is out and I'm excited to share the longest changelog yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug Fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;fixed bug with search bar cursor moving to end&lt;/li&gt;
&lt;li&gt;fixed bug with channel points being caught in subscription search&lt;/li&gt;
&lt;li&gt;fixed bug with the sign-in page when "hide header on unfocus" is true&lt;/li&gt;
&lt;li&gt;fixed bug with unread messages persisting across channels&lt;/li&gt;
&lt;li&gt;fixed performance bug with saving messages in local storage&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Changes
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;improved chatters tab with better styles and basic user cards&lt;/li&gt;
&lt;li&gt;improved reversed mode with a scroll to bottom button and better autoscrolling&lt;/li&gt;
&lt;li&gt;improved autocomplete for emotes and mentions&lt;/li&gt;
&lt;li&gt;added compact channels setting&lt;/li&gt;
&lt;li&gt;added pin button to channel items&lt;/li&gt;
&lt;li&gt;added setting to show a scroll bar when the app is focused&lt;/li&gt;
&lt;li&gt;added streamer is live notifications&lt;/li&gt;
&lt;li&gt;added support for message replies&lt;/li&gt;
&lt;li&gt;added setting for transparent message backgrounds&lt;/li&gt;
&lt;li&gt;added toast notifications for updates&lt;/li&gt;
&lt;li&gt;added a setting to turn on and off storing messages in local storage&lt;/li&gt;
&lt;li&gt;added setting to show automod messages or not&lt;/li&gt;
&lt;li&gt;added follow button&lt;/li&gt;
&lt;li&gt;added a "more tab" to the header with extra channel-specific settings and options&lt;/li&gt;
&lt;li&gt;added support for automod messages (only for channels you moderate for)&lt;/li&gt;
&lt;li&gt;added the ability to easily switch between channels by right-clicking on the home icon&lt;/li&gt;
&lt;li&gt;added user card to messages by right-clicking on the username&lt;/li&gt;
&lt;li&gt;added a setting to change font scaling&lt;/li&gt;
&lt;li&gt;added emote picker for the chatbox&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Modifications
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;modified platform colors setting to affect the compact mode&lt;/li&gt;
&lt;li&gt;modified search bar to hide on unfocus only if it is empty
&lt;/li&gt;
&lt;li&gt;modified to allow you to add any streamer's channel&lt;/li&gt;
&lt;li&gt;modified font change to affect the whole app&lt;/li&gt;
&lt;li&gt;modified the update button from link to next update to auto-# installer&lt;/li&gt;
&lt;li&gt;modified channels button to the home icon&lt;/li&gt;
&lt;li&gt;modified mod and message options into a context menu on messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check it out 👇👇👇&lt;br&gt;
&lt;a href="https://www.disstreamchat.com"&gt;https://www.disstreamchat.com&lt;/a&gt; &lt;br&gt;
&lt;a href="https://www.github.com/disstreamchat"&gt;https://www.github.com/disstreamchat&lt;/a&gt;&lt;/p&gt;

</description>
      <category>electron</category>
      <category>twitch</category>
    </item>
    <item>
      <title>Simple Template for typescript in Node</title>
      <dc:creator>David Snyder</dc:creator>
      <pubDate>Sun, 13 Sep 2020 22:04:00 +0000</pubDate>
      <link>https://dev.to/snyderling/simple-template-for-typescript-in-node-23pn</link>
      <guid>https://dev.to/snyderling/simple-template-for-typescript-in-node-23pn</guid>
      <description>&lt;p&gt;I have found myself copying a lot of files every time I start a new project so I decided to make an easy to use template that you can download and start with little setup. The template has almost everything you could need, a .gitignore, .tsconfig.json, .prettierrc.js, .npmignore, node scripts for transpiling the typescript and testing. The repo for the template is &lt;a href="https://github.com/GypsyDangerous/node-typescript-project-template"&gt;https://github.com/GypsyDangerous/node-typescript-project-template&lt;/a&gt; and you can download it with &lt;code&gt;degit&lt;/code&gt;, &lt;code&gt;npx degit GypsyDangerous/node-typescript-project-template&lt;/code&gt;. I want to improve it by adding more files like an eslintrc so any contributions are greatly appreciated 😀&lt;/p&gt;

</description>
      <category>node</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Make An Accordion Menu in React</title>
      <dc:creator>David Snyder</dc:creator>
      <pubDate>Thu, 18 Jun 2020 01:59:50 +0000</pubDate>
      <link>https://dev.to/snyderling/make-an-accordion-menu-in-react-5ab0</link>
      <guid>https://dev.to/snyderling/make-an-accordion-menu-in-react-5ab0</guid>
      <description>&lt;p&gt;The accordion menu is used on websites to show important links with expanded information .It can be useful in many situations to add information to items in a list. So I am going to show you how to make an accordion menu with React. &lt;/p&gt;

&lt;p&gt;here is an example of the finished product: &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NtpQHov8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.discordapp.com/attachments/699812263670055052/722989876353564743/ezgif.com-crop.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NtpQHov8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.discordapp.com/attachments/699812263670055052/722989876353564743/ezgif.com-crop.gif" alt="" width="208" height="126"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This project will use two custom react components that I will walk through the process of making and explain how they work. These two components will be called &lt;code&gt;AccordionMenu&lt;/code&gt; and &lt;code&gt;AccordionItem&lt;/code&gt;. They will mostly be styled components but they will also wrap a lot functionality and reusability around native JSX elements.&lt;/p&gt;

&lt;p&gt;this is the code for the &lt;code&gt;AccordionMenu&lt;/code&gt; component&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="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;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useCallback&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Accordion.css&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;AccordionMenu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&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;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setChildren&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&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;openItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setOpenItem&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;setChildren&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;children&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="p"&gt;?&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;children&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&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;children&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&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;clickHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&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;setOpenItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&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;id&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;accordion-menu&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elt&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;.&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;open&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;.&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;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;openItem&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;clickHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;elt&lt;/span&gt;&lt;span class="p"&gt;.&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;id&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/elt.type&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="p"&gt;))}&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;AccordionMenu&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;AccordionMenu&lt;/code&gt; component will have one or more children which are all should be &lt;code&gt;AccordionItem&lt;/code&gt;'s. The children of the &lt;code&gt;AccordionMenu&lt;/code&gt; will receive some extra props from their parent. The two extra props are &lt;code&gt;open&lt;/code&gt; which is pretty self explanatory, its a boolean telling if the item is open or not, and &lt;code&gt;onClick&lt;/code&gt; which is a function that will be called whenever an item is pressed and toggle its open status. The &lt;code&gt;openItem&lt;/code&gt; state in the &lt;code&gt;AccordionMenu&lt;/code&gt; will keep track of which item is open and if none are open it will be null. Having an &lt;code&gt;openItem&lt;/code&gt; in the parent and using that to tell each item whether its open or not is what will allow us to have only zero to one items open at a time&lt;/p&gt;

&lt;p&gt;This is the code for the &lt;code&gt;AccordionItem&lt;/code&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&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;AccordionItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&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;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;accordion-item&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;accordion-item--header&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&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;onClick&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="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`accordion-item--body &lt;/span&gt;&lt;span class="p"&gt;${&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;open&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;open&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;{&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;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;AccordionItem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;AccordionItem&lt;/code&gt; has a header and body. It takes in a &lt;code&gt;title&lt;/code&gt; as prop and that title will be displayed in the header. All the children on the &lt;code&gt;AccordionItem&lt;/code&gt; children will be rendered in the body. The header is what takes the &lt;code&gt;onClick&lt;/code&gt; event from the &lt;code&gt;AccordionMenu&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now that we have the js code done all we need is the css to control the expanding of the items. I'll also add in some basic styles but I have intentionally made the styles simple so you can easily add your own styles and give it your own flare.&lt;/p&gt;

&lt;p&gt;this code will go in &lt;code&gt;Accordion.css&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.accordion-menu&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fit-content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.accordion-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fit-content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.accordion-item--header&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;chartreuse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.accordion-item--body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="m"&gt;0.25s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;orangered&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.accordion-item--body.open&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100px&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;And with that you now have reusable components to add an accordion menu to your website&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>css</category>
    </item>
    <item>
      <title>Force create-react-app to use npm</title>
      <dc:creator>David Snyder</dc:creator>
      <pubDate>Thu, 18 Jun 2020 00:39:33 +0000</pubDate>
      <link>https://dev.to/snyderling/force-create-react-app-to-use-npm-398l</link>
      <guid>https://dev.to/snyderling/force-create-react-app-to-use-npm-398l</guid>
      <description>&lt;p&gt;I had to install yarn recently to work on an open source project that used yarn. Now whenever I go to create a react app it default to yarn. create-react-app is a facebook product aswell as yarn, so if it detects yarn on your system it will create a react app with yarn. I don't mind yarn but I prefer npm so I love this flag you can use with create-react-app. if you add &lt;code&gt;--use-npm&lt;/code&gt; to the end the of your create-react-app command it will force it to create the app with npm&lt;/p&gt;

</description>
      <category>react</category>
      <category>yarn</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Basic Git Cheat Sheet</title>
      <dc:creator>David Snyder</dc:creator>
      <pubDate>Wed, 17 Jun 2020 18:37:45 +0000</pubDate>
      <link>https://dev.to/snyderling/basic-git-cheat-sheet-28e</link>
      <guid>https://dev.to/snyderling/basic-git-cheat-sheet-28e</guid>
      <description>&lt;h1&gt;
  
  
  Need to Know git commands
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;git init&lt;/strong&gt; (Initialize git repository)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;git checkout {branchname}&lt;/strong&gt; - change the working branch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;git checkout -b {branchname}&lt;/strong&gt; - create a branch and change the working branch into it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;git status&lt;/strong&gt; - check for untrack and tracked files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;git add .&lt;/strong&gt; - track changes in all files in the working branch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;git add {filename}&lt;/strong&gt; - track changes in one file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;git commit -m “message”&lt;/strong&gt; - save changes to local repository&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;git remote add origin {remote url}&lt;/strong&gt; - connecting to a remote repository&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;git push origin {branchname}&lt;/strong&gt; - push code from local to remote&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;git push -u origin {branchname}&lt;/strong&gt; - push code from local to remote on a branch that doesn't already exist on remote&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;git merge {branchname}&lt;/strong&gt; - merge changes from {branchname} into the current working branch&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Please remember not to work on master branch directly, always create different branches for different purposes.&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
    </item>
  </channel>
</rss>
