<?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: Shola Japheth</title>
    <description>The latest articles on DEV Community by Shola Japheth (@sholajapheth).</description>
    <link>https://dev.to/sholajapheth</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%2F1516566%2Fa5d623ef-052a-4a34-9d21-560b9c42d686.jpg</url>
      <title>DEV Community: Shola Japheth</title>
      <link>https://dev.to/sholajapheth</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sholajapheth"/>
    <language>en</language>
    <item>
      <title>using `useSearchParams` in Next.js for Dynamic and Efficient Rendering</title>
      <dc:creator>Shola Japheth</dc:creator>
      <pubDate>Tue, 03 Sep 2024 11:11:56 +0000</pubDate>
      <link>https://dev.to/sholajapheth/using-usesearchparams-in-nextjs-for-dynamic-and-efficient-rendering-2ci1</link>
      <guid>https://dev.to/sholajapheth/using-usesearchparams-in-nextjs-for-dynamic-and-efficient-rendering-2ci1</guid>
      <description>&lt;p&gt;Next.js is renowned for its server-side rendering (SSR) capabilities and static site generation (SSG), but its ability to handle dynamic content through URL search parameters is an often underappreciated feature. Using the &lt;code&gt;useSearchParams&lt;/code&gt; hook in Next.js, developers can create highly dynamic and responsive applications that react to user input directly from the URL. This approach not only improves the user experience by making the application more interactive but also enhances the rendering process, making it more efficient.&lt;/p&gt;

&lt;h4&gt;
  
  
  Understanding &lt;code&gt;useSearchParams&lt;/code&gt; in Next.js
&lt;/h4&gt;

&lt;p&gt;The &lt;code&gt;useSearchParams&lt;/code&gt; hook allows you to access and manipulate the URL's query parameters in a React component. This can be incredibly useful when you want to build components that depend on user input via the URL, such as filtering content, navigating through sections of a page, or managing pagination.&lt;/p&gt;

&lt;p&gt;Here's a basic example of how &lt;code&gt;useSearchParams&lt;/code&gt; can be used:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ExampleComponent&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;searchParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSearchParams&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;registrationNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchParams&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="s2"&gt;registrationNumber&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;section&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchParams&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="s2"&gt;section&lt;/span&gt;&lt;span class="dl"&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Details for Registration Number: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;registrationNumber&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Current Section: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;section&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&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;ExampleComponent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, &lt;code&gt;useSearchParams&lt;/code&gt; is used to extract the &lt;code&gt;registrationNumber&lt;/code&gt; and &lt;code&gt;section&lt;/code&gt; from the URL. This makes the component dynamic, as its content changes based on the URL parameters.&lt;/p&gt;

&lt;h4&gt;
  
  
  Enhancing Application Dynamism and Efficiency
&lt;/h4&gt;

&lt;p&gt;By leveraging &lt;code&gt;useSearchParams&lt;/code&gt;, you can make your Next.js applications more dynamic. Instead of hard-coding content or relying on extensive state management, you can use URL parameters to drive your application's behavior. This approach has several advantages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SEO and Deep Linking&lt;/strong&gt;: Search engines can crawl your application more effectively, and users can share specific states of your application via URLs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduced State Management Overhead&lt;/strong&gt;: Since the URL state drives component behavior, there's less need for complex state management, reducing the chances of bugs and improving maintainability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved User Experience&lt;/strong&gt;: Users can bookmark and return to specific states of your application, leading to a more personalized and seamless experience.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Integrating with Redux for State Management
&lt;/h4&gt;

&lt;p&gt;In larger applications, you might want to synchronize the URL parameters with your global state. This is where Redux comes into play. By dispatching actions based on &lt;code&gt;useSearchParams&lt;/code&gt;, you can ensure that your application's state is always in sync with the URL.&lt;/p&gt;

&lt;p&gt;Here's an example of how you might achieve this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&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="nx"&gt;useSearchParams&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/navigation&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="nx"&gt;useDispatch&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-redux&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="nx"&gt;updateRegistrationNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;updateSection&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;../store/actions&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ExampleComponent&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;searchParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSearchParams&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;registrationNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchParams&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="s2"&gt;registrationNumber&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;section&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;searchParams&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="s2"&gt;section&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;dispatch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useDispatch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;registrationNumber&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;updateRegistrationNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;registrationNumber&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="nx"&gt;section&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;updateSection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;section&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;registrationNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;section&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dispatch&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Details for Registration Number: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;registrationNumber&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Current Section: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;section&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&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;ExampleComponent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, the &lt;code&gt;useEffect&lt;/code&gt; hook is used to dispatch actions to update the Redux store whenever the &lt;code&gt;registrationNumber&lt;/code&gt; or &lt;code&gt;section&lt;/code&gt; search parameters change. This ensures that the global state stays in sync with the URL parameters, allowing other parts of your application to react accordingly.&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;Using &lt;code&gt;useSearchParams&lt;/code&gt; in Next.js is a powerful way to create dynamic, URL-driven applications. It simplifies the rendering process by reducing the need for complex state management and enhances the user experience by allowing for deep linking and easy state sharing. By combining &lt;code&gt;useSearchParams&lt;/code&gt; with Redux, you can build robust applications that are both dynamic and maintainable, with a clear separation of concerns between the UI and the application's state.&lt;/p&gt;

&lt;p&gt;Incorporating this approach into your Next.js applications will not only make them more dynamic and responsive but also improve the overall efficiency of your rendering process, leading to faster load times and a better user experience.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>From PTSD to Productivity: My Journey with Redux Toolkit and TanStack Query</title>
      <dc:creator>Shola Japheth</dc:creator>
      <pubDate>Mon, 02 Sep 2024 10:31:20 +0000</pubDate>
      <link>https://dev.to/sholajapheth/from-ptsd-to-productivity-my-journey-with-redux-toolkit-and-tanstack-query-14ii</link>
      <guid>https://dev.to/sholajapheth/from-ptsd-to-productivity-my-journey-with-redux-toolkit-and-tanstack-query-14ii</guid>
      <description>&lt;p&gt;I'll never forget the project that made me question my sanity. The previous developer had used Redux Toolkit, which I had never worked with before. My past experiences with Redux involved tedious switch cases, leaving me with PTSD. I dreaded dealing with it again.&lt;/p&gt;

&lt;p&gt;When the developer announced their departure, I saw an opportunity to refactor the code to use TanStack Query, a library I was more comfortable with. However, the tight deadline forced me to reconsider. I decided to face my fears and learn Redux Toolkit.&lt;/p&gt;

&lt;p&gt;As I delved into the code, I discovered the strengths of both libraries. Redux Toolkit's organization and TanStack Query's storage features impressed me. I realized that, with the right mindset, I could master both.&lt;/p&gt;

&lt;p&gt;Here's a comparison of common actions in Redux Toolkit and TanStack Query:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Data Fetching&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Redux Toolkit:&lt;/p&gt;

&lt;p&gt;// Create an async thunk&lt;br&gt;
export const fetchUsers = createAsyncThunk(&lt;br&gt;
  'users/fetchUsers',&lt;br&gt;
  async () =&amp;gt; {&lt;br&gt;
    const response = await axios.get('/users');&lt;br&gt;
    return response.data;&lt;br&gt;
  }&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;// Use the thunk in a component&lt;br&gt;
dispatch(fetchUsers());&lt;/p&gt;

&lt;p&gt;TanStack Query:&lt;/p&gt;

&lt;p&gt;// Create a query client&lt;br&gt;
const queryClient = new QueryClient();&lt;/p&gt;

&lt;p&gt;// Fetch data with the useQuery hook&lt;br&gt;
const { data, error, isLoading } = useQuery(&lt;br&gt;
  'users', // key&lt;br&gt;
  async () =&amp;gt; {&lt;br&gt;
    const response = await axios.get('/users');&lt;br&gt;
    return response.data;&lt;br&gt;
  }&lt;br&gt;
);&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Data Caching&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Redux Toolkit:&lt;/p&gt;

&lt;p&gt;// Use the &lt;code&gt;createEntityAdapter&lt;/code&gt; to manage cached data&lt;br&gt;
const usersAdapter = createEntityAdapter();&lt;/p&gt;

&lt;p&gt;const usersSlice = createSlice({&lt;br&gt;
  name: 'users',&lt;br&gt;
  initialState: usersAdapter.getInitialState(),&lt;br&gt;
  reducers: {&lt;br&gt;
    // ...&lt;br&gt;
  },&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;TanStack Query:&lt;/p&gt;

&lt;p&gt;// Use the &lt;code&gt;QueryClient&lt;/code&gt; to cache data&lt;br&gt;
queryClient.setQueryData('users', data);&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Data Updating&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Redux Toolkit:&lt;/p&gt;

&lt;p&gt;// Create an async thunk to update data&lt;br&gt;
export const updateUser = createAsyncThunk(&lt;br&gt;
  'users/updateUser',&lt;br&gt;
  async (userData) =&amp;gt; {&lt;br&gt;
    const response = await axios.put(&lt;code&gt;/users/${(link unavailable)}&lt;/code&gt;, userData);&lt;br&gt;
    return response.data;&lt;br&gt;
  }&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;TanStack Query:&lt;/p&gt;

&lt;p&gt;// Use the &lt;code&gt;useMutation&lt;/code&gt; hook to update data&lt;br&gt;
const { mutate, isLoading } = useMutation(&lt;br&gt;
  async (userData) =&amp;gt; {&lt;br&gt;
    const response = await axios.put(&lt;code&gt;/users/${(link unavailable)}&lt;/code&gt;, userData);&lt;br&gt;
    return response.data;&lt;br&gt;
  }&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;In conclusion, both Redux Toolkit and TanStack Query have their strengths. By embracing both libraries, I transformed my project experience from a nightmare to a success story. Don't be afraid to explore new tools – you never know what you might discover!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
