<?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: Kyle</title>
    <description>The latest articles on DEV Community by Kyle (@kyleortiz).</description>
    <link>https://dev.to/kyleortiz</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%2F765235%2Fe623f220-6d53-45dd-8a6f-9682f9b4156a.jpeg</url>
      <title>DEV Community: Kyle</title>
      <link>https://dev.to/kyleortiz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kyleortiz"/>
    <language>en</language>
    <item>
      <title>Using acts_as_list for easy ordering of items</title>
      <dc:creator>Kyle</dc:creator>
      <pubDate>Mon, 03 Jan 2022 11:08:35 +0000</pubDate>
      <link>https://dev.to/kyleortiz/using-actsaslist-for-easy-ordering-of-items-1gm0</link>
      <guid>https://dev.to/kyleortiz/using-actsaslist-for-easy-ordering-of-items-1gm0</guid>
      <description>&lt;h2&gt;
  
  
  &lt;code&gt;acts_as_list&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;acts as list is a ruby gem designed for easy ordering and reordering of object contained in a list. I have recently become a little familiar with this gem while working on a project management board application. &lt;/p&gt;

&lt;h2&gt;
  
  
  Set up
&lt;/h2&gt;

&lt;p&gt;This tutorial/guide assumes you already know some basics of using ruby on rails like setting up a database, creating migrations and resources, etc.. &lt;/p&gt;

&lt;p&gt;The first thing that needs to be done is installing the gem. This can be done by adding &lt;code&gt;gem acts_as_list&lt;/code&gt; to your gemfile within your RoR application and running &lt;code&gt;bundle&lt;/code&gt; in the command line. &lt;/p&gt;

&lt;p&gt;Once finished with the installation, you are going to need a special column of "position" on any resource you want to be organized like a list. If you are creating a resource from scratch, be sure to have a column called position that takes in an integer datatype. To add this to existing resources, create a new migration for adding this column to a resource and run the migration(this code from the official docs):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rails g migration AddPositionToTodoItem position:integer
rake db:migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After adding this column to a resource, you then need to go into the model for that resource and add the &lt;code&gt;acts_as_list&lt;/code&gt; method inside the model. You can also set the scope of this method to relate to another resource. Here is an example from my code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Card &amp;lt; ApplicationRecord
  acts_as_list scope: :list
  belongs_to :list
end

class List &amp;lt; ApplicationRecord
     acts_as_list scope: :project_id
     has_many :cards, -&amp;gt;{ order(position: :asc) }, dependent: :destroy
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here I have set up a has_many -&amp;gt; belongs_to relationship with Cards and Lists. I then have the scope of acts_as_list set to the lists so the position of the cards is tracked only within a single list.&lt;/p&gt;

&lt;p&gt;After this, you're pretty much good to start creating instances of your resources and using other methods that come with this gem. Keeping with the example I have, if I create a new card with a reference to a list, the position column is populated automatically starting with position of "1". If I create more cards with the same list as reference, it will increment the position for each card on its own. &lt;/p&gt;

&lt;p&gt;Once you have a few things with their position created, you can use various methods to change/ manipulate the position. Here is a list of methods from the documentation: &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%2Fcqkd8zml6ky2zzbyb06s.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%2Fcqkd8zml6ky2zzbyb06s.png" alt="Image description" width="800" height="708"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you use &lt;code&gt;move_higher&lt;/code&gt; on an Object, it will decrease its position(moving it higher in the list) and will subsequently move all others it moved above lower (increasing their position in response). This makes it effortless to update your lists order server-side, as well as display information about your lists to the user with the attribute returning methods. &lt;/p&gt;

&lt;p&gt;Hopefully you find this useful, there are a ton of possibilities with this simple but powerful gem. &lt;/p&gt;

&lt;p&gt;Sources: &lt;br&gt;
&lt;a href="https://github.com/brendon/acts_as_list" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rails</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Getting Started with "React-beautiful-dnd" using functional components</title>
      <dc:creator>Kyle</dc:creator>
      <pubDate>Sun, 02 Jan 2022 23:12:16 +0000</pubDate>
      <link>https://dev.to/kyleortiz/getting-started-with-react-beautiful-dnd-using-functional-components-50d0</link>
      <guid>https://dev.to/kyleortiz/getting-started-with-react-beautiful-dnd-using-functional-components-50d0</guid>
      <description>&lt;h2&gt;
  
  
  What is "react-beautiful-dnd" ?
&lt;/h2&gt;

&lt;p&gt;react-beautiful-dnd is a drag and drop library for react, created by Atlassian. It was designed for the focused purpose of handling drag and drop for lists, between lists, and other list related features. They make it clear in the documentation that this was designed for a more specific purpose than other drag and drop libraries that might fit your needs better. Be sure that react-beautiful-dnd meets your needs before moving forward without looking at others such as "react-dnd". &lt;/p&gt;

&lt;h2&gt;
  
  
  Installing "react-beautiful-dnd":
&lt;/h2&gt;

&lt;p&gt;All you need to do, assuming you have yarn or npm installed, go into the terminal and enter the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# yarn
yarn add react-beautiful-dnd

# npm
npm install react-beautiful-dnd --save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will need a react app to use this library, if you need help on getting started with react please refer to the react docs installation guide here: &lt;a href="https://beta.reactjs.org/learn/installation" rel="noopener noreferrer"&gt;Installing React&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started once you have it installed:
&lt;/h2&gt;

&lt;p&gt;To start giving your application the ability to drag and drop elements, you need to wrap the components you want to give drag and drop in &lt;code&gt;&amp;lt;DragDropContext /&amp;gt;&lt;/code&gt;. The documentation recommends that you wrap your entire app in &lt;code&gt;&amp;lt;DragDropContext /&amp;gt;&lt;/code&gt;, so let's take a look at that: &lt;br&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%2Fi2kn1far3typudva4hjs.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%2Fi2kn1far3typudva4hjs.png" alt="Image description" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This can work inside of your &lt;code&gt;App.js&lt;/code&gt; file or inside of the &lt;code&gt;index.js&lt;/code&gt; file. I chose the &lt;code&gt;index.js&lt;/code&gt; file because it keeps the App component cleaner as you might add things to your application.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;Droppable /&amp;gt;&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The next thing you need to create will be the component(s) where the draggable items can be dropped into. To do this, you will need to import &lt;code&gt;&amp;lt;Droppable /&amp;gt;&lt;/code&gt; and them wrap the area you want to accept draggables inside of it: &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%2Fodlkvoz7iyyytfxgew9t.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%2Fodlkvoz7iyyytfxgew9t.png" alt="Image description" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is kind of a lot going on here so let's break it down : &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;droppableId&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
  This is the only &lt;em&gt;required&lt;/em&gt; prop for &lt;code&gt;&amp;lt;Droppable /&amp;gt;&lt;/code&gt;. It &lt;br&gt;
  takes a &lt;strong&gt;unique&lt;/strong&gt; string for each &lt;code&gt;&amp;lt;Droppable /&amp;gt;&lt;/code&gt; you have.&lt;/p&gt;

&lt;h5&gt;
  
  
  Droppable Children
&lt;/h5&gt;

&lt;p&gt;Any children you placed inside a &lt;code&gt;&amp;lt;Droppable /&amp;gt;&lt;/code&gt; must be wrapped in a callback function with the arguments "provided" and "snapshot" given.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;provided&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;the provided argument used in the callback function is essentially an object of provided pieces of information that are necessary or helpful in getting the droppable to work. The following are used in this example: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;provided.innerRef&lt;/code&gt;&lt;/strong&gt;- This must be attached to the outer most DOM element you have. &lt;em&gt;required&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;provided.droppableProps&lt;/code&gt;&lt;/strong&gt;- This is an Object within the provided argument that contains information the library uses to function. Belongs on the same element you added &lt;code&gt;innerRef&lt;/code&gt; &lt;em&gt;required&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;provided.placeholder&lt;/code&gt;&lt;/strong&gt;- This is used to tell the droppable not to shrink down when you are dragging things around, from my understanding. Place this inside of the element you attached &lt;code&gt;innerRef&lt;/code&gt; to&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;snapshot&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;This argument gives you the ability to access the &lt;em&gt;drag state&lt;/em&gt; of your elements that can be used for styling and other things&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;&amp;lt;Draggable /&amp;gt;&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;&amp;lt;Draggable /&amp;gt;&lt;/code&gt; is used to drag things onto and off of &lt;code&gt;&amp;lt;Droppable /&amp;gt;&lt;/code&gt;s. Every &lt;code&gt;&amp;lt;Draggable /&amp;gt;&lt;/code&gt; needs to be inside a &lt;code&gt;&amp;lt;Droppable /&amp;gt;&lt;/code&gt;. In order for the user to interact with a &lt;code&gt;&amp;lt;Draggable /&amp;gt;&lt;/code&gt;, each one needs a &lt;em&gt;Drag Handle&lt;/em&gt;. On top of each one needing a unique &lt;code&gt;draggableId&lt;/code&gt;, each one needs an index to show its position in the list. Additionally, any children of a &lt;code&gt;&amp;lt;Draggable /&amp;gt;&lt;/code&gt; is wrapped in a callback function, same as the &lt;code&gt;&amp;lt;Droppable /&amp;gt;&lt;/code&gt;. Here is an example implementation: &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%2Fxb9c2fpx0n7ztmymi5pc.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%2Fxb9c2fpx0n7ztmymi5pc.png" alt="Image description" width="800" height="1084"&gt;&lt;/a&gt;&lt;br&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%2Frpa2dgm8i44orsg7gzcu.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%2Frpa2dgm8i44orsg7gzcu.png" alt="Image description" width="800" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is probably similar to how you would want to implement draggables. Here I have an array of objects representing my data that I want to become draggables. I then created a function to map over this array and create a &lt;code&gt;&amp;lt;Draggable /&amp;gt;&lt;/code&gt; for each object with its own information, index, and &lt;code&gt;draggableId&lt;/code&gt;. I then import this function into my &lt;code&gt;App.js&lt;/code&gt; and place it inside of my &lt;code&gt;&amp;lt;Droppable /&amp;gt;&lt;/code&gt;'s callback function: &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%2Fg6vtf0lz5vrq7jasrto3.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%2Fg6vtf0lz5vrq7jasrto3.png" alt="Image description" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This results in a working drag and drop within our app! &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%2Fo0meu5u8rdnop5kqxu88.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%2Fo0meu5u8rdnop5kqxu88.gif" alt="Image description" width="399" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, however, when we drag something to a new position in the list, it snaps back to its original position after we are done dragging. This is because we have not yet given our &lt;code&gt;&amp;lt;DragDropContext /&amp;gt;&lt;/code&gt; a &lt;code&gt;onDragEnd&lt;/code&gt; function. This function will handle reordering the list when you drag items to a new position. When you drag something, you get a &lt;code&gt;result&lt;/code&gt; object returned, we can pass this &lt;code&gt;result&lt;/code&gt; to our own drag end function to make it work. First of all, since we are needing to re-render the list after draggables have been moved, we need to set our list to state: &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%2F2pqhjua0sgwe4mzngpsb.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%2F2pqhjua0sgwe4mzngpsb.png" alt="Image description" width="800" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Side Note&lt;/strong&gt; &lt;br&gt;
I have restructured my data in this example to better model what your data might look like for practical purposes, here is what it looks like now(the items are nested in a column object, so that you can have multiple columns supported): &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%2Flvha8acx6rxjw16mvjjx.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%2Flvha8acx6rxjw16mvjjx.png" alt="New Data to support having more than one Column" width="724" height="1394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With this new data structure, we can create a &lt;code&gt;onDragEnd&lt;/code&gt; function that looks like this: &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%2Frj0bhuze5yzc1dw7qf4u.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%2Frj0bhuze5yzc1dw7qf4u.png" alt="Image description" width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For reference here is our &lt;code&gt;result&lt;/code&gt; object: &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%2F6my3ny7cv5xqsp5ojia3.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%2F6my3ny7cv5xqsp5ojia3.png" alt="Image description" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The steps in the &lt;code&gt;onDragEnd&lt;/code&gt; function we have made is as follows: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;create the function and pass in three arguments(result, column, setColumn)&lt;/li&gt;
&lt;li&gt;A conditional statement checking the destination value, if it is null(draggable was dragged outside of droppable) return out of the function.&lt;/li&gt;
&lt;li&gt;create variables for the source and destination from our result object (using object destructuring)&lt;/li&gt;
&lt;li&gt;set a column variable equal to the current column we are working in&lt;/li&gt;
&lt;li&gt;copy the items for that column into a new variable&lt;/li&gt;
&lt;li&gt;splice out the dragged item from the original set of items&lt;/li&gt;
&lt;li&gt;splice that item into our copied item list and the destination index&lt;/li&gt;
&lt;li&gt;set the columns state back to what it was, only changing the items list to the new copy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, it should be fully functional! &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%2Fzol73i0kbaxd31upiwk1.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%2Fzol73i0kbaxd31upiwk1.gif" alt="Image description" width="600" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you found this post helpful to your coding journey. This is meant to serve as a truncated version of documentation and youtube so that you might be able to get up and running on your application faster than normal. Thanks for reading! &lt;/p&gt;

&lt;p&gt;Sources: &lt;br&gt;
&lt;a href="https://github.com/atlassian/react-beautiful-dnd" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=Vqa9NMzF3wc" rel="noopener noreferrer"&gt;Youtube Video&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
