<?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: Deepak Singh Kushwah</title>
    <description>The latest articles on DEV Community by Deepak Singh Kushwah (@deepaksinghkushwah).</description>
    <link>https://dev.to/deepaksinghkushwah</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%2F770124%2Fabbb1508-476e-4df6-8bb6-fce5b2335913.jpg</url>
      <title>DEV Community: Deepak Singh Kushwah</title>
      <link>https://dev.to/deepaksinghkushwah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deepaksinghkushwah"/>
    <language>en</language>
    <item>
      <title>React Protected Routes - Role based</title>
      <dc:creator>Deepak Singh Kushwah</dc:creator>
      <pubDate>Thu, 07 Dec 2023 15:41:56 +0000</pubDate>
      <link>https://dev.to/deepaksinghkushwah/react-protected-routes-role-based-51g</link>
      <guid>https://dev.to/deepaksinghkushwah/react-protected-routes-role-based-51g</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hi developers, in this tutorial, we will go through how to created protected routes in ReactJs. For this, I have create Node+Express+MongoDB server for user login/registration. You can use any other backend stack like PHP/Python or any other. For frontend state management I have used Zustand, you can choose any other library you prefer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;p&gt;You should have basic understanding of ReactJS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Setup
&lt;/h2&gt;

&lt;p&gt;npm create vite@latest&lt;br&gt;
after above command, you will see wizard, choose react and javascript&lt;/p&gt;

&lt;p&gt;For CSS and styling, I have used tailwindcss. I assume you know how to include tailwindcss in react projects. If not, please follow instruction on tailwindcss site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependencies
&lt;/h2&gt;

&lt;p&gt;npm i react-router-dom axios prop-types zustand&lt;/p&gt;

&lt;h2&gt;
  
  
  Code and Explanation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;App.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import "./App.css";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Home from "./pages/Home";
import About from "./pages/About";
import Error from "./pages/Error";
import Layout1 from "./components/Layouts/Layout1";
import ProtectedRoute from "./components/Auth/ProtectedRoute";
import Dashboard from "./pages/member-pages/Dashboard";
import Login from "./pages/Login";
import Unauthorized from "./pages/Unauthorized";
function App() {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;BrowserRouter&amp;gt;
        &amp;lt;Routes&amp;gt;
          &amp;lt;Route path="/" element={&amp;lt;Layout1 /&amp;gt;}&amp;gt;
            &amp;lt;Route path="/" element={&amp;lt;Home /&amp;gt;} /&amp;gt;
            &amp;lt;Route path="/about" element={&amp;lt;About /&amp;gt;} /&amp;gt;
            &amp;lt;Route path="/login" element={&amp;lt;Login /&amp;gt;} /&amp;gt;
            &amp;lt;Route path="/unauthorized" element={&amp;lt;Unauthorized /&amp;gt;} /&amp;gt;
            &amp;lt;Route path="*" element={&amp;lt;Error /&amp;gt;} /&amp;gt;
            &amp;lt;Route element={&amp;lt;ProtectedRoute allowedRoles={['registered']}/&amp;gt;}&amp;gt;
              &amp;lt;Route path="/dashboard" element={&amp;lt;Dashboard/&amp;gt;}/&amp;gt;
            &amp;lt;/Route&amp;gt;
          &amp;lt;/Route&amp;gt;
        &amp;lt;/Routes&amp;gt;
      &amp;lt;/BrowserRouter&amp;gt;
    &amp;lt;/&amp;gt;
  );
}

export default App;

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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Auth/ProtectedRoute.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Navigate, Outlet, useLocation } from "react-router-dom";
import { useUserStore } from "../../store/useStore";
import PropTypes from "prop-types";
const ProtectedRoute = (props) =&amp;gt; {
  const user = useUserStore((state) =&amp;gt; state.user);
  const location = useLocation();
  return props.allowedRoles.includes(user?.role)
  ? &amp;lt;Outlet /&amp;gt; 
  : user ? &amp;lt;Navigate to="/unauthorized" state={{from: location}} replace /&amp;gt; 
  : &amp;lt;Navigate to="/login" state={{ from: location }} replace /&amp;gt;

};

ProtectedRoute.propTypes = {
  allowedRoles: PropTypes.array,
};

export default ProtectedRoute;

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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Layouts/Layout1.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Outlet } from "react-router-dom";
import Footer from "../page-parts/Footer";
import Header from "../page-parts/Header";

const Layout1 = () =&amp;gt; {
  return (
    &amp;lt;&amp;gt;
      &amp;lt;div className="m-auto max-w-5xl border border-black bg-blue-950 text-white my-10 rounded-xl"&amp;gt;
        &amp;lt;Header /&amp;gt;
        &amp;lt;div className="p-10"&amp;gt;
          &amp;lt;Outlet /&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;Footer /&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/&amp;gt;
  );
};

export default Layout1;

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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;page-parts/Header.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Link } from "react-router-dom";
import { useUserStore } from "../../store/useStore";

const Header = () =&amp;gt; {
  const user = useUserStore((state) =&amp;gt; state.user);
  const signOut = useUserStore((state) =&amp;gt; state.signOut);
  return (
    &amp;lt;div className="bg-gray-300 text-black rounded-t-xl"&amp;gt;
      &amp;lt;nav className="flex justify-between"&amp;gt;
        &amp;lt;img src="https://picsum.photos/100/50.jpg" /&amp;gt;
        &amp;lt;ul className="flex gap-5 p-3"&amp;gt;
          &amp;lt;li&amp;gt;
            &amp;lt;Link to="/"&amp;gt;Home&amp;lt;/Link&amp;gt;
          &amp;lt;/li&amp;gt;
          &amp;lt;li&amp;gt;
            &amp;lt;Link to="/about"&amp;gt;About&amp;lt;/Link&amp;gt;
          &amp;lt;/li&amp;gt;
          &amp;lt;li&amp;gt;
            &amp;lt;Link to="/contact"&amp;gt;Contact&amp;lt;/Link&amp;gt;
          &amp;lt;/li&amp;gt;
          &amp;lt;li&amp;gt;
            &amp;lt;Link to="/services"&amp;gt;Services&amp;lt;/Link&amp;gt;
          &amp;lt;/li&amp;gt;

          {user ? (
            &amp;lt;&amp;gt;
              &amp;lt;li&amp;gt;
                &amp;lt;Link to="/dashboard"&amp;gt;Dashboard&amp;lt;/Link&amp;gt;
              &amp;lt;/li&amp;gt;
              &amp;lt;li&amp;gt;
                &amp;lt;button onClick={() =&amp;gt; signOut()}&amp;gt;Logout&amp;lt;/button&amp;gt;
              &amp;lt;/li&amp;gt;
            &amp;lt;/&amp;gt;
          ) : (
            &amp;lt;li&amp;gt;
              &amp;lt;Link to="/login"&amp;gt;Login&amp;lt;/Link&amp;gt;
            &amp;lt;/li&amp;gt;
          )}
        &amp;lt;/ul&amp;gt;
      &amp;lt;/nav&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Header;

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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;page-parts/Footer.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Footer = () =&amp;gt; {
  return (
    &amp;lt;div className="text-white w-full "&amp;gt;
      &amp;lt;div className="flex items-center justify-center"&amp;gt;Copyright &amp;amp;copy; 2023&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Footer;

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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;pages/Home.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Home = () =&amp;gt; {
  return (
    &amp;lt;div className="text-justify"&amp;gt;
      &amp;lt;h1 className="text-4xl"&amp;gt;Welcome to Home Page&amp;lt;/h1&amp;gt;      
    &amp;lt;/div&amp;gt;
  )
}

export default Home
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;pages/About.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const About = () =&amp;gt; {
  return (
    &amp;lt;div&amp;gt;About&amp;lt;/div&amp;gt;
  )
}

export default About
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;pages/Error.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Error = () =&amp;gt; {
  return (
    &amp;lt;div&amp;gt;404 - not found&amp;lt;/div&amp;gt;
  )
}

export default Error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;pages/Login.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState } from "react";
import { useUserStore } from "../store/useStore";
import { useNavigate } from "react-router-dom";

const Login = () =&amp;gt; {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  const signin = useUserStore((state) =&amp;gt; state.signIn);
  const navigate = useNavigate();
  const handleLogin = async() =&amp;gt; {
    const status = await signin(email, password);
    if (status) {
      navigate("/dashboard");
    }
  };
  return (
    &amp;lt;&amp;gt;
      &amp;lt;h3 className="text-2xl text-center"&amp;gt;Login&amp;lt;/h3&amp;gt;
      &amp;lt;hr className="headingHr" /&amp;gt;
      &amp;lt;div className="m-auto w-[400px] rounded p-3 flex flex-row justify-center bg-slate-400"&amp;gt;
        &amp;lt;table className=""&amp;gt;
          &amp;lt;tbody&amp;gt;
            &amp;lt;tr&amp;gt;
              &amp;lt;td&amp;gt;
                &amp;lt;label htmlFor="email"&amp;gt;Email&amp;lt;/label&amp;gt;
              &amp;lt;/td&amp;gt;
              &amp;lt;td&amp;gt;
                &amp;lt;input
                  type="email"
                  value={email}
                  onChange={(e) =&amp;gt; setEmail(e.target.value)}
                  name=""
                  id="email"
                /&amp;gt;
              &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;

            &amp;lt;tr&amp;gt;
              &amp;lt;td&amp;gt;
                &amp;lt;label htmlFor="password"&amp;gt;Password&amp;lt;/label&amp;gt;
              &amp;lt;/td&amp;gt;
              &amp;lt;td&amp;gt;
                &amp;lt;input
                  type="password"
                  value={password}
                  onChange={(e) =&amp;gt; setPassword(e.target.value)}
                  name=""
                  id="password"
                /&amp;gt;
              &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;

            &amp;lt;tr&amp;gt;
              &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;
              &amp;lt;td&amp;gt;
                &amp;lt;button onClick={() =&amp;gt; handleLogin()} className="button"&amp;gt;
                  Login
                &amp;lt;/button&amp;gt;
              &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
          &amp;lt;/tbody&amp;gt;
        &amp;lt;/table&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/&amp;gt;
  );
};

export default Login;

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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;pages/Unauthorized.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useUserStore } from "../store/useStore"

const Unauthorized = () =&amp;gt; {
  const user = useUserStore(state =&amp;gt; state.user);
  console.log(user);
  return (
    &amp;lt;div&amp;gt;You are not allowed to do this action!!!&amp;lt;/div&amp;gt;
  )
}

export default Unauthorized
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;pages/member-pages/dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const Dashboard = () =&amp;gt; {
  return (
    &amp;lt;div&amp;gt;Dashboard&amp;lt;/div&amp;gt;
  )
}

export default Dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;store/axiosHTTP.js&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import axios from "axios";

const axiosHttp = axios.create({
  baseURL: 'http://localhost:3000'
});

export default axiosHttp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;store/BaseSlice.js&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export const BaseSlice = (set) =&amp;gt; ({
  name: 'Base Slice',
  loading: false,
  setLoading: (stat) =&amp;gt; {
    set((state) =&amp;gt; ({
      ...stat,
      loading: state
    }))
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;store/UserSlice.js&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import axiosHttp from "./axiosHttp";

export const UserSlice = (set) =&amp;gt; ({
  name: 'User',
  user: null,
  token: null,
  setUser: async(user) =&amp;gt; {
    set({user: user});
  },

  getUser: async(id) =&amp;gt; {
    const json = await axiosHttp.get(`/user/${id}`);
    return await json.data;
  },
  signIn: async (email, password) =&amp;gt; {
    try {
      //await timeout(2000);
      const json = await axiosHttp.post(`${import.meta.env.VITE_SERVER_URL}/api/v1/auth/signin`, { email, password });
      const data = await json.data;
      //console.log(data.user);
      set(() =&amp;gt; ({
        user: data.user,
        token: data.token,
      }));
      return true;
    } catch (error) {
      return null;
    }
  },
  signUp: async (form) =&amp;gt; {
    try {
      const json = await axiosHttp.post("/register", form);
      const data = await json.data;
      set(() =&amp;gt; ({
        user: data.user,
        token: data.accessToken,
      }));
      return {token: data.accessToken, error: null, message: 'User registered'}
    } catch (error) {      
      const errMsg = await error.response;
      console.log(errMsg.data);
      return {message: errMsg.data, error: true, token: null};
    }
  },
  signOut: () =&amp;gt; {
    set({
      user: null,
      token: null,
    });
  },

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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;store/useStore.js&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { create } from "zustand";
import { createJSONStorage, persist } from "zustand/middleware"
import { BaseSlice } from "./BaseSlice";
import { UserSlice } from "./UserSlice";
import { SongSlice } from "./SongSlice";
export const useBaseStore = create((set, get) =&amp;gt; ({
  ...BaseSlice(set, get)
}));

export const useUserStore = create(
  persist((set, get) =&amp;gt; ({
    ...UserSlice(set, get)
}),{name: 'userStore',storage: createJSONStorage(() =&amp;gt; sessionStorage)}
));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;From backend API, we need following format response at time of login.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F3rsdshrtxwaudzqfrkv6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F3rsdshrtxwaudzqfrkv6.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you completed these steps, check your website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fkgttteghp07g57ubfht5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fkgttteghp07g57ubfht5.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fjdzmea7bvjccna4bjs5b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fjdzmea7bvjccna4bjs5b.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy Coding.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to use multiple layouts in ReactJS app</title>
      <dc:creator>Deepak Singh Kushwah</dc:creator>
      <pubDate>Tue, 14 Mar 2023 16:17:07 +0000</pubDate>
      <link>https://dev.to/deepaksinghkushwah/how-to-use-multiple-layouts-in-reactjs-app-gpa</link>
      <guid>https://dev.to/deepaksinghkushwah/how-to-use-multiple-layouts-in-reactjs-app-gpa</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hello Developers&lt;/p&gt;

&lt;p&gt;Today we are going to see how we can use multile layouts in ReactJS app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;p&gt;This example is for beginners. I hope you know how to setup react project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependencies
&lt;/h2&gt;

&lt;p&gt;Only "react-router-dom" required for page urls. No other dependencies are required.&lt;/p&gt;

&lt;p&gt;So lets start with create new project.&lt;br&gt;
&lt;code&gt;npx create-react-app multiple-layouts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now we have basic project setup. Install 'react-router-dom' for routes.&lt;br&gt;
&lt;code&gt;npm install react-router-dom&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now setup and install tailwindcss.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

npm install -D tailwindcss

npx tailwindcss init

=&amp;gt; Now update the tailwind.config.js file with following code.

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./src/**/*.{js,jsx,ts,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}


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

&lt;/div&gt;

&lt;p&gt;Once setup complete, we are ready to update our files in project. So create/update files as follows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;App.js&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import { Route, Routes } from "react-router-dom";
import Frontend from "./components/frontend/Frontend";
import Backend from "./components/backend/Backend";
import Home from "./components/Home";
import Admin from "./components/Admin";
import About from "./components/About";
import Error from "./components/Error";

function App() {
  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;Routes&amp;gt;
        &amp;lt;Route path="/" element={&amp;lt;Frontend /&amp;gt;}&amp;gt;
          &amp;lt;Route index element={&amp;lt;Home /&amp;gt;} /&amp;gt;
          &amp;lt;Route path="about" element={&amp;lt;About /&amp;gt;} /&amp;gt;
        &amp;lt;/Route&amp;gt;

        &amp;lt;Route path="/admin" element={&amp;lt;Backend /&amp;gt;}&amp;gt;
          &amp;lt;Route index element={&amp;lt;Admin /&amp;gt;} /&amp;gt;
        &amp;lt;/Route&amp;gt;
        &amp;lt;Route path="*" element={&amp;lt;Error/&amp;gt;}/&amp;gt;
      &amp;lt;/Routes&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;



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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;index.css&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

@tailwind base;
@tailwind components;
@tailwind utilities;


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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;components/About.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React from 'react'

function About() {
  return (
    &amp;lt;div&amp;gt;
      Lorem ipsum dolor sit amet consectetur adipisicing elit. Facere aspernatur sit quidem dignissimos ipsum, rerum rem neque perspiciatis, molestias porro sed molestiae aperiam ratione. \.
    &amp;lt;/div&amp;gt;
  )
}

export default About


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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;components/Admin.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React from 'react'

function Admin() {
  return (
    &amp;lt;div className='text-left'&amp;gt;
      &amp;lt;h1&amp;gt;Admin Page&amp;lt;/h1&amp;gt;
      &amp;lt;p className=' leading-loose'&amp;gt;Lorem ipsum dolor sit amet consectetur adipisicing elit. Nemo excepturi, eligendi quos, id mollitia cum doloremque qui ipsum maiores suscipit optio?  fugiat.&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;Lorem ipsum dolor sit, amet consectetur adipisicing elit. Cumque dolor ipsam molestias sunt architecto totam facere quo, porro saepe quod autem corporis amet magnam quis, possimus minima fugiat eius numquam praesentium? &amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}

export default Admin


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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;components/Error.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React from 'react'

function Error() {
  return (
    &amp;lt;div&amp;gt;Page Not Found&amp;lt;/div&amp;gt;
  )
}

export default Error


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

&lt;/div&gt;

&lt;p&gt;We creating above file so we can show error page if route not found.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;components/Home.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React from 'react'

function Home() {
  return (
    &amp;lt;div&amp;gt;Lorem ipsum dolor sit amet consectetur adipisicing elit. Quidem inventore incidunt, at nostrum ab quas voluptatem iure, iste assumenda, rerum architecto esse fuga! Voluptatibus necessitatibus accusamus aut libero fugiat laudantium, ea exercitationem. Deleniti illum esse iure eligendi eos accusamus !&amp;lt;/div&amp;gt;
  )
}

export default Home


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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Layout files&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;components/backend/Backend.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React from "react";
import { Outlet } from "react-router-dom";
import LeftMenu from "./LeftMenu";

function Backend() {
  return (
    &amp;lt;div className="flex items-start gap-3"&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;LeftMenu /&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;Outlet /&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default Backend;



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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;components/backend/LeftMenu.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React from 'react'
import { Link } from 'react-router-dom'

function LeftMenu() {
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1 className='text-2xl'&amp;gt;Admin Layout&amp;lt;/h1&amp;gt;
      &amp;lt;ul className='flex flex-col gap-3 px-4 py-2 '&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;Link to="/"&amp;gt;Home&amp;lt;/Link&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;Link to="/about"&amp;gt;About&amp;lt;/Link&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;Link to="/admin"&amp;gt;Admin&amp;lt;/Link&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}

export default LeftMenu


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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;components/frontend/Footer.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React from 'react'

function Footer() {
  return (
    &amp;lt;div className='flex gap-3 justify-center bg-blue-300 px-4 py-2 rounded'&amp;gt;
      &amp;amp;copy; 2023, Author: Deepak Singh Kushwah
    &amp;lt;/div&amp;gt;
  )
}

export default Footer


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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;components/frontend/Frontend.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React from 'react'
import { Outlet } from 'react-router-dom'
import Footer from './Footer'
import Header from './Header'

function Frontend() {
  return (
    &amp;lt;div&amp;gt;
        &amp;lt;Header/&amp;gt;
            &amp;lt;Outlet/&amp;gt;
        &amp;lt;Footer/&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}

export default Frontend


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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;components/frontend/Header.jsx&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import React from 'react'
import { Link } from 'react-router-dom'

function Header() {
  return (
    &amp;lt;div&amp;gt;
        &amp;lt;ul className='flex gap-3 bg-blue-300 px-4 py-2 rounded'&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;Link to="/"&amp;gt;Home&amp;lt;/Link&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;Link to="/about"&amp;gt;About&amp;lt;/Link&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;&amp;lt;Link to="/admin"&amp;gt;Admin&amp;lt;/Link&amp;gt;&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}

export default Header


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

&lt;/div&gt;

&lt;p&gt;Okay, if you have followed, I hope your application will run same as mine. Run following command from your prompt.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;br&gt;
&lt;code&gt;npm start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you see menu with multiple layout, congratulations, you have implemented multiple layouts in your react app. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fj3p89r5dua6us9iwjvo3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fj3p89r5dua6us9iwjvo3.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F5vkiztjsf4ho8ujze6zx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F5vkiztjsf4ho8ujze6zx.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you enjoyed it. Full code can be access here.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://bitbucket.org/deepaksinghkushwah/dev-to-projects/src/main/multiple-layouts/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Happy Coding&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>tailwindcss</category>
    </item>
    <item>
      <title>Get started with Zustand</title>
      <dc:creator>Deepak Singh Kushwah</dc:creator>
      <pubDate>Sat, 25 Feb 2023 19:18:07 +0000</pubDate>
      <link>https://dev.to/deepaksinghkushwah/get-started-with-zustand-4f75</link>
      <guid>https://dev.to/deepaksinghkushwah/get-started-with-zustand-4f75</guid>
      <description>&lt;p&gt;Hello Developers&lt;/p&gt;

&lt;p&gt;Today we are going to see how to use Zustand state manager with react.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;You should have some knowledge of ReactJS &lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;React is a great tool to create frontend apps. There are lots of tools available to manage state like Jotai, Redux, Recoil etc. There is one tool I like much is Zustand. It require minimum setup to get started. It follow very simple approach and today we are going through this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup New Project
&lt;/h2&gt;

&lt;p&gt;I am using PNPM &amp;amp; VITE to create and setup new project. You can use npm.&lt;br&gt;
&lt;code&gt;pnpm create vite@latest&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;Above command ask you to choose framework. Choose React and JavaScript in next step. Now we need to add zustand and other dependencies to our React app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm add zustand uuid react-icons
pnpm add -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will add Zustand to your project and install all dependencies.&lt;/p&gt;

&lt;p&gt;Our file structure will be 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%2Fvg5ebgwl1uce18kk79jd.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%2Fvg5ebgwl1uce18kk79jd.png" alt=" " width="240" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Very first, we will update the App.jsx file with following code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import TodoForm from "./components/TodoForm";
import TodoList from "./components/TodoList";

function App() {
  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;div className="flex"&amp;gt;
        &amp;lt;div className="w-1/2"&amp;gt;
          &amp;lt;TodoForm /&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div className="w-1/2"&amp;gt;
          &amp;lt;TodoList /&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now next part is to create store for our react app. Create new file in new "/store/todoStore.js" and put following code in file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { create } from "zustand";
import { v4 as uuidv4 } from "uuid";
const todoStore =(set, get) =&amp;gt; ({
  todos: [],
  addTodo: (title) =&amp;gt; {
    const newTodo = {
      title,
      id: uuidv4(),
      markDone: false,
    };
    set((state) =&amp;gt; ({
      todos: [...state.todos, newTodo],
    }));
  },
  markTodoDone: (id, checked) =&amp;gt; {
    let newTodos;
    if (checked === true) {
      newTodos = get().todos.map((todo) =&amp;gt; {
        return todo.id === id ? { ...todo, markDone: true } : {...todo};
      });
    } else {
      newTodos = get().todos.map((todo) =&amp;gt; {
        return todo.id === id ? { ...todo, markDone: false } : {...todo};
      });
    }

    set((state) =&amp;gt; ({
      todos: newTodos,
    }));
  },
  removeTodo: (id) =&amp;gt; {
    const newTodos = get().todos.filter((todo) =&amp;gt; todo.id !== id);
    set(state =&amp;gt; ({
      todos: newTodos
    }))
  },
});
const useTodoStore = create(todoStore);
export default useTodoStore;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So we have created our store, now we use this store to manage our todos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;/components/TodoForm.jsx&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import { useState } from "react";
import useTodoStore from "../store/todoStore";
const TodoForm = () =&amp;gt; {
  const [title, setTitle] = useState("");
  const addTodo = useTodoStore((state) =&amp;gt; state.addTodo);
  const handleAddTodo = () =&amp;gt; {
    addTodo(title);
    setTitle("");
  };
  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;Todo Form&amp;lt;/h1&amp;gt;
      &amp;lt;table className="border-2 w-full"&amp;gt;
        &amp;lt;tbody&amp;gt;
          &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;
              &amp;lt;label htmlFor="todo"&amp;gt;Todo&amp;lt;/label&amp;gt;
            &amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;
              &amp;lt;input
                placeholder="Todo Text"
                type="text"
                className="border-red-500 border-2"
                name="todo"
                id="todo"
                onChange={(e) =&amp;gt; setTitle(e.target.value)}
              /&amp;gt;
            &amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
          &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;
            &amp;lt;td&amp;gt;
              &amp;lt;button
                type="button"
                onClick={handleAddTodo}
                className="btn btn-primary"
              &amp;gt;
                Add Todo
              &amp;lt;/button&amp;gt;
            &amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
        &amp;lt;/tbody&amp;gt;
      &amp;lt;/table&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default TodoForm;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;/components/TodoList.jsx&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from "react";
import {BsTrash} from "react-icons/bs";
import useTodoStore from "../store/todoStore";
const TodoList = () =&amp;gt; {
  const todos = useTodoStore((state) =&amp;gt; state.todos);
  const markTodoDone = useTodoStore(state =&amp;gt; state.markTodoDone);
  const removeTodo = useTodoStore(state =&amp;gt; state.removeTodo);
  return (
    &amp;lt;div className="px-3"&amp;gt;
      &amp;lt;h1&amp;gt;Todos&amp;lt;/h1&amp;gt;
      {todos?.map((todo) =&amp;gt; (
        &amp;lt;div className="flex justify-start items-center" key={todo.id}&amp;gt;
          &amp;lt;div className="w-auto"&amp;gt;
            &amp;lt;input type="checkbox" name="markDone" onClick={(e) =&amp;gt; markTodoDone(todo.id, e.target.checked)} id="" /&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;div className="px-3"&amp;gt;&amp;lt;BsTrash title="Remove Todo" className="cursor-pointer" onClick={() =&amp;gt; removeTodo(todo.id)}/&amp;gt;&amp;lt;/div&amp;gt;
          &amp;lt;div className={`px-1 w-full ${todo.markDone === true ? 'line-through text-red-700' : ''}`}&amp;gt;{todo.title}&amp;lt;/div&amp;gt;

        &amp;lt;/div&amp;gt;
      ))}
    &amp;lt;/div&amp;gt;
  );
};

export default TodoList;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;/index.css&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@tailwind base;
@tailwind components;
@tailwind utilities;

.btn {
  @apply border-blue-500 bg-blue-800 text-white px-4 py-1 rounded-md;
}

input[type="text"]{
  @apply w-full px-4 py-1 rounded-md;
}
table {
  @apply border-2 border-red-300 shadow-lg w-full;
}
table td{
  @apply px-3 py-2; 
}

table tr:nth-child(even){
  @apply bg-gray-200;
}


table tr:nth-child(odd){
  @apply bg-white;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;/tailwindcss.config.cjs&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}

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

&lt;/div&gt;



&lt;p&gt;Now you can run the project. You will see same screen if you have followed it here.&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%2Fc774zvcjj1zbtigsby0s.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%2Fc774zvcjj1zbtigsby0s.png" alt=" " width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can check the code on this link with using of persist middle-ware.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://bitbucket.org/deepaksinghkushwah/dev-to-projects/src/main/react-zustand-example/" rel="noopener noreferrer"&gt;https://bitbucket.org/deepaksinghkushwah/dev-to-projects/src/main/react-zustand-example/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Happy Coding &lt;/p&gt;

</description>
      <category>flutter</category>
      <category>solidprinciples</category>
      <category>cleancode</category>
      <category>architecture</category>
    </item>
    <item>
      <title>React todo app using useState</title>
      <dc:creator>Deepak Singh Kushwah</dc:creator>
      <pubDate>Thu, 09 Feb 2023 08:53:27 +0000</pubDate>
      <link>https://dev.to/deepaksinghkushwah/react-todo-app-using-usestate-22aa</link>
      <guid>https://dev.to/deepaksinghkushwah/react-todo-app-using-usestate-22aa</guid>
      <description>&lt;p&gt;Hello Developers&lt;/p&gt;

&lt;p&gt;Today we are going to create a simple to-do app with add/edit and delete feature using react.&lt;/p&gt;

&lt;p&gt;I have used pnpm for dependencies instead of npm. Bootstrap, react-bootstrap for CSS. UUID for unique ids. Here is the folder structure for project.&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%2F2jpl52o38kxaqiu2odq9.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%2F2jpl52o38kxaqiu2odq9.png" alt="Image description" width="195" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First we need to create project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm create vite@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Above command will show options to create react app. Select for react js app and crete new folder. Then goto new created folder and run "pnpm install" and "pnpm add react react-bootstrap uuid" commands. New project setup and ready to use for next changes.&lt;/p&gt;

&lt;p&gt;Next, in app.js, update it with following code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useState } from 'react'
import './App.css'
import 'bootstrap/dist/css/bootstrap.min.css'
import Todo from './components/todo/Todo'
import { Container } from 'react-bootstrap'

function App() {
  const [count, setCount] = useState(0)

  return (
    &amp;lt;div className="App mt-3"&amp;gt;

      &amp;lt;Container&amp;gt;
      &amp;lt;h1&amp;gt;Add/Edit/Delete todo example using state&amp;lt;/h1&amp;gt;
      &amp;lt;Todo/&amp;gt;      
      &amp;lt;/Container&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}

export default App
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next we need to create new folder/files as per folder structure image. In components/todo folder, create Todo.jsx with following code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react'
import TodoForm from './TodoForm'
import TodoList from './TodoList'
import { Row, Col } from 'react-bootstrap'
import { useEffect } from 'react';
import { useState } from 'react'
import {v4 as uuidv4} from "uuid";
const Todo = () =&amp;gt; {
    const items = [
        { id:uuidv4(), title: 'Item 1' },
        { id: uuidv4(), title: 'Item 2' }
    ];

    const [todos, setTodo] = useState([]);
    const [editItem, setEditItem] = useState(null);
    useEffect(() =&amp;gt; {        
        setTodo(items);
    },[]);
    const handleRemoveTodo = (id) =&amp;gt; {
        /*const itemToDelete = todos.findIndex(element =&amp;gt; {
            return element.id === id;
        });
        const newItems = todos.splice(itemToDelete, 1);*/

        const newItems = todos.filter(item =&amp;gt; item.id !== id);
        setTodo([...newItems]);
        //console.log(todos);
    }

    const handleAddTodo = (form) =&amp;gt; {        
        setTodo([...todos, {id: uuidv4(), title:form.title}]);        
    }

    const handleEditTodo = (item) =&amp;gt; {
        setEditItem(item);
    }

    const handleSubmitEditForm = (form) =&amp;gt; {
        const indexItemToUpdate = todos.findIndex(item =&amp;gt;  item.id == form.id);
        //console.log(indexItemToUpdate);
        const newArr = todos.map(item =&amp;gt; {
            if(item.id == form.id){
                item.title = form.title;
            }
            return item;
        });
        setTodo([...newArr]);
        setEditItem(null);
    }
    return (
        &amp;lt;div className=''&amp;gt;
            &amp;lt;Row&amp;gt;
                &amp;lt;Col xs={4}&amp;gt;
                    &amp;lt;TodoForm editItem={editItem}
                    handleAddTodo={handleAddTodo}
                    handleEditTodo={handleEditTodo}
                    handleSubmitEditForm={handleSubmitEditForm}
                    /&amp;gt;
                &amp;lt;/Col&amp;gt;
                &amp;lt;Col&amp;gt;
                    &amp;lt;TodoList
                        todos={todos}                        
                        handleRemoveTodo={handleRemoveTodo}
                        handleEditTodo={handleEditTodo}
                         /&amp;gt;
                &amp;lt;/Col&amp;gt;
            &amp;lt;/Row&amp;gt;


        &amp;lt;/div&amp;gt;
    )
}

export default Todo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next we need to create todo list components. Create new file in components/todo folder named TodoList.jsx and add following code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react'
import { Row, Col } from 'react-bootstrap'
import { Button } from 'react-bootstrap'

const TodoList = ({ todos, handleRemoveTodo, handleEditTodo }) =&amp;gt; {
    return (
        &amp;lt;div className='card'&amp;gt;
            &amp;lt;div className='card-body'&amp;gt;
                {todos?.length &amp;gt; 0 ? (
                    &amp;lt;&amp;gt;
                        {todos.map(item =&amp;gt; (
                            &amp;lt;div className='row mb-1'&amp;gt;
                                &amp;lt;div className='col-8'&amp;gt;
                                    {item.title}
                                &amp;lt;/div&amp;gt;
                                &amp;lt;div className='col-1'&amp;gt;
                                    &amp;lt;Button onClick={() =&amp;gt; handleEditTodo(item)}&amp;gt;edit&amp;lt;/Button&amp;gt;
                                &amp;lt;/div&amp;gt;
                                &amp;lt;div className='col-2'&amp;gt;
                                    &amp;lt;Button className="ms-2" onClick={() =&amp;gt; handleRemoveTodo(item.id)}&amp;gt;x&amp;lt;/Button&amp;gt;
                                &amp;lt;/div&amp;gt;
                            &amp;lt;/div&amp;gt;
                        ))}
                    &amp;lt;/&amp;gt;
                ) : 'No todo to display'}
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    )
}

export default TodoList
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So we have created list for todo component, next we need to create form component where we can add/edit todos. Create new file in components/todo named TodoForm.jsx with following code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react'
import { useEffect } from 'react';
import { useState } from 'react'

const TodoForm = ({ editItem, handleAddTodo, handleEditTodo, handleSubmitEditForm }) =&amp;gt; {
  const [form, setForm] = useState({
    id: null,
    title: ""
  });
  useEffect(() =&amp;gt; {
    if (editItem !== null) {
      setForm({ id: editItem.id, title: editItem.title });
    }
  }, [editItem])
  const handleSubmitForm = () =&amp;gt; {
    if (form.id !== null) {
      handleSubmitEditForm(form);
    } else {
      handleAddTodo(form);
    }
    setForm(prev =&amp;gt; ({ title: "", id: null }));
  }

  const handleFormChange = (e) =&amp;gt; {
    setForm({
      ...form,
      [e.target.id]: e.target.value
    });
  }
  return (
    &amp;lt;div className='card'&amp;gt;
            &amp;lt;div className='card-body'&amp;gt;
      {editItem !== null ?
        &amp;lt;div className='row'&amp;gt;
          &amp;lt;div className='col-12'&amp;gt;
            &amp;lt;input className='form-control' placeholder='Title' id="title" type="text" value={form.title} onChange={(e) =&amp;gt; handleFormChange(e)} /&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;div className='col-12 mt-1'&amp;gt;
            &amp;lt;button className='btn btn-primary' onClick={() =&amp;gt; handleSubmitForm(form)}&amp;gt;Save&amp;lt;/button&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        :
        &amp;lt;div className='row'&amp;gt;
          &amp;lt;div className='col-12'&amp;gt;
            &amp;lt;input className='form-control' placeholder='Title' id="title" type="text" value={form.title} onChange={(e) =&amp;gt; handleFormChange(e)} /&amp;gt;
          &amp;lt;/div&amp;gt;
          &amp;lt;div className='col-12 mt-1'&amp;gt;
            &amp;lt;button className='btn btn-primary' onClick={() =&amp;gt; handleSubmitForm(form)}&amp;gt;Add&amp;lt;/button&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
      }

    &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  )
}

export default TodoForm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Our todo app is ready to use. Start your server and see it in action.&lt;/p&gt;

&lt;p&gt;Happy Coding :)&lt;/p&gt;

</description>
      <category>gratitude</category>
    </item>
    <item>
      <title>React+Express (node)+MongoDB Login/Registration Sample App</title>
      <dc:creator>Deepak Singh Kushwah</dc:creator>
      <pubDate>Tue, 15 Mar 2022 14:33:23 +0000</pubDate>
      <link>https://dev.to/deepaksinghkushwah/reactexpress-nodemongodb-loginregistration-sample-app-44ol</link>
      <guid>https://dev.to/deepaksinghkushwah/reactexpress-nodemongodb-loginregistration-sample-app-44ol</guid>
      <description>&lt;p&gt;Hello Developers&lt;/p&gt;

&lt;p&gt;Today I am sharing an example application for user login/registration and secure pages like member area for profile and other sections.&lt;/p&gt;

&lt;p&gt;You can find this application full source code at following url...&lt;br&gt;
&lt;a href="https://bitbucket.org/deepaksinghkushwah/react-express-login/src/master/" rel="noopener noreferrer"&gt;https://bitbucket.org/deepaksinghkushwah/react-express-login/src/master/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Application is divided in 2 parts, frontend is create in react app using "npx create-react-app" and contain login/registration/member area pages. I have used localStorage for handling login session.&lt;/p&gt;

&lt;p&gt;Backend is created using NodeJS+Express+MongoDB. All get started information is added in readme file. This application is example application for new developers who want to learn react/express and want a ready to use sample application. &lt;/p&gt;

&lt;p&gt;You need to create .env file in react frontend application with following content...&lt;br&gt;
REACT_APP_SERVER_HOST="&lt;a href="http://localhost:5000/api/v1" rel="noopener noreferrer"&gt;http://localhost:5000/api/v1&lt;/a&gt;"&lt;/p&gt;

&lt;p&gt;This is api url. You can change it in backend and set it in .env file at backend.&lt;/p&gt;

&lt;p&gt;There is a seeder for mongodb to populate user table. You can use it with "node seeder.js -i" to import sample data or "node seeder.js -d" to delete user data. Users will be created with "test&amp;lt;1-100&amp;gt;&lt;a class="mentioned-user" href="https://dev.to/localhost"&gt;@localhost&lt;/a&gt;.com" and password will be "123456". Or you can update seeder as per your need.&lt;/p&gt;

&lt;p&gt;Few screenshots....&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Home Page&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtlgxr8xra0u6m1kqqhm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtlgxr8xra0u6m1kqqhm.png" alt="Image description" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After Login&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6z74sed3rpuyrnmdyg7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6z74sed3rpuyrnmdyg7.png" alt="Image description" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Registration Page&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp89qh3tpt42019utq9vz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp89qh3tpt42019utq9vz.png" alt="Image description" width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This may contain bugs so do not use it for production. It's just for showing how login/registration work with react and how to maintain session. &lt;/p&gt;

&lt;p&gt;Hope you like it. Happy Coding.&lt;/p&gt;

</description>
      <category>react</category>
      <category>mongodb</category>
      <category>expres</category>
      <category>node</category>
    </item>
    <item>
      <title>Setup nginx + multiple php-fpm on Q4OS(Debian10)</title>
      <dc:creator>Deepak Singh Kushwah</dc:creator>
      <pubDate>Fri, 25 Feb 2022 12:33:55 +0000</pubDate>
      <link>https://dev.to/deepaksinghkushwah/setup-nginx-multiple-php-fpm-on-q4osdebian10-4obn</link>
      <guid>https://dev.to/deepaksinghkushwah/setup-nginx-multiple-php-fpm-on-q4osdebian10-4obn</guid>
      <description>&lt;p&gt;Hello Developers,&lt;/p&gt;

&lt;p&gt;Recentely I have used multiple php versions on single installation. Today we are going to see how we can setup full linux + nginx + php on Q4OS(Debian 10) (I am using Q4OS 3, it's based on debian).&lt;/p&gt;

&lt;p&gt;First of all we need to setup php repo which provide php verions...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wget https://packages.sury.org/php/apt.gpg
sudo apt-key add apt.gpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now add repo to your source list...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php7.list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So first we need to install nginx... &lt;br&gt;
sudo apt install nginx-full -y&lt;/p&gt;

&lt;p&gt;Now nignx is installed, we need to setup multiple PHP-FPM verions...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install php7.3-fpm php7.3-cli php7.3-curl php7.3-mysql php7.3-xml php7.3-zip php7.3-mbstring php7.3-zip -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install php7.0 php7.0-fpm php7.0-mysql libapache2-mod-php7.0 libapache2-mod-fcgid -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install php7.4-fpm php7.4-cli php7.4-json php7.4-common php7.4-mysql php7.4-zip php7.4-gd php7.4-mbstring php7.4-curl php7.4-xml php7.4-bcmath -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install php8.0-fpm php8.0-cli php8.0-json php8.0-common php8.0-mysql php8.0-zip php8.0-gd php8.0-mbstring php8.0-curl php8.0-xml php8.0-bcmath -y

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

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install php8.1-fpm php8.1-cli php8.1-json php8.1-common php8.1-mysql php8.1-zip php8.1-gd php8.1-mbstring php8.1-curl php8.1-xml php8.1-bcmath -y

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

&lt;/div&gt;



&lt;p&gt;You can choose other modules for selected php verions as mention above.&lt;/p&gt;

&lt;p&gt;Now execute follwing command to check and enable nginx status...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl enable nginx
sudo sustemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now configure nginx to create new virtual host for your site, I am using test.lcoal as new vhost&lt;/p&gt;

&lt;p&gt;First create new directory&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir -p /var/www/test.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now create index.php in /var/www/test.local dir and add following content in it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php
phpinfo();

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

&lt;/div&gt;



&lt;p&gt;Next we create new file /etc/nginx/sites-available/test.local.conf and add following content to it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {
    listen 80;
    listen [::]:80;

    server_name mydomain.com www.mydomain.com;
    root /var/www/mydomain.com;
    index index.html index.php;
    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Similarly, you can choose any installed php version instead of php7.0-fpm&lt;/p&gt;

&lt;p&gt;Next create symlink&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/test.local.conf /etc/nginx/sites-enabled/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add entry in /etc/hosts file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1    test.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save file and test it&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nginx -t
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will show you ok if everything correct in nginx config.&lt;/p&gt;

&lt;p&gt;Restart nginx to take effect.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now it's time to check our virtual host "test.local" in browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://test.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Something you need to switch PHP on CLI if you are using multiple PHP versions and want to install dependencies (using composer).  So to switch PHP, use 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;sudo update-alternatives --config php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will show you list of installed php versions, you can pick and press enter to choose default one.&lt;/p&gt;

&lt;p&gt;Hope you like this post.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Currency Converter + Rates</title>
      <dc:creator>Deepak Singh Kushwah</dc:creator>
      <pubDate>Fri, 18 Feb 2022 03:24:24 +0000</pubDate>
      <link>https://dev.to/deepaksinghkushwah/currency-converter-rates-1379</link>
      <guid>https://dev.to/deepaksinghkushwah/currency-converter-rates-1379</guid>
      <description>&lt;p&gt;Hello Developers, &lt;/p&gt;

&lt;p&gt;This app is my new react project to learn about state + axios + routes in react js. It shows the exchage rates and convert currency value from one to other. I have used following packages to create this app...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Axios&lt;/li&gt;
&lt;li&gt;React Router Dom&lt;/li&gt;
&lt;li&gt;React Bootstrap + Bootstrap&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Use npm install and npm start to run this project&lt;/p&gt;

&lt;p&gt;So to create this app, I have used following code.&lt;/p&gt;

&lt;p&gt;App.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import "bootstrap/dist/css/bootstrap.min.css";
import "./App.css";
import Navigation from "./components/shared/Navigation";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import CurrencyConverter from "./pages/CurrencyConverter";
import CurrencyRates from "./pages/CurrencyRates";
function App() {
  return (
    &amp;lt;div className="App"&amp;gt;
      &amp;lt;Router&amp;gt;
        &amp;lt;Navigation /&amp;gt;
        &amp;lt;div className="container"&amp;gt;
          &amp;lt;Routes&amp;gt;
            &amp;lt;Route path="/" element={&amp;lt;CurrencyRates /&amp;gt;} /&amp;gt;
            &amp;lt;Route path="/currency-converter" element={&amp;lt;CurrencyConverter /&amp;gt;} /&amp;gt;
          &amp;lt;/Routes&amp;gt;
        &amp;lt;/div&amp;gt;
      &amp;lt;/Router&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;

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

&lt;/div&gt;



&lt;p&gt;To style loader in this app, update App.css to following...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.loadingSpinnerContainer {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    background-color: rgba(0, 0, 0, 0.5);
    z-index: 5000;
    display: flex;
    justify-content: center;
    align-items: center;
  }

  .loadingSpinner {
    width: 64px;
    height: 64px;
    border: 8px solid;
    border-color: #00cc66 transparent #00cc66 transparent;
    border-radius: 50%;
    animation: spin 1.2s linear infinite;
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we need to created pages to load currency exchange rates and converter. So i created pages folder in src. Add following files in pages folder.&lt;/p&gt;

&lt;p&gt;pages/CurrencyConverter.jsx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect, useState } from 'react'
import http from '../components/CustomAxios'
import Spinner from '../components/shared/Spinner';
function CurrencyConverter() {
  const [symbols, setSymbols] = useState([]);
  const [loading, setLoading] = useState(false);

  const [fromCurrency, setFromCurrency] = useState('');
  const [toCurrency, setToCurrency] = useState('');
  const [amount, setAmount] = useState(0);
  const [convertedAmount, setConvertedAmount] = useState(null);
  useEffect(() =&amp;gt; {
    setLoading(true);
    const getSymbols = async () =&amp;gt; {
      const sys = await http.get("/symbols");
      const data = await sys.data;
      let arr = Array.from(Object.keys(data.symbols), k =&amp;gt; [`${k}`, data.symbols[k]]);
      setSymbols(arr);
      setLoading(false);
    };

    getSymbols();
  }, []);



  const handleSubmit = async (e) =&amp;gt; {
    e.preventDefault();
    setLoading(true);

    const res = await http.get('/convert?from=' + fromCurrency + '&amp;amp;to=' + toCurrency + "&amp;amp;amount=" + amount + "&amp;amp;places=2");
    const data = await res.data;
    //console.log(data);
    setConvertedAmount(data.result);
    setLoading(false);
  }

  const handleSelectChange = (e) =&amp;gt; {
    setConvertedAmount(null);
    if(e.target.id === 'toCurrency'){
      setToCurrency(e.target.value);
    }

    if(e.target.id === 'fromCurrency'){
      setFromCurrency(e.target.value);
    }
  }

  if (loading) {
    return &amp;lt;Spinner /&amp;gt;
  }
  return (
    &amp;lt;&amp;gt;
      &amp;lt;h1&amp;gt;Convert Currency&amp;lt;/h1&amp;gt;
      &amp;lt;form onSubmit={handleSubmit}&amp;gt;
        &amp;lt;table className='table table-borderless table-hover'&amp;gt;
          &amp;lt;tbody&amp;gt;
            &amp;lt;tr&amp;gt;
              &amp;lt;td width="30%"&amp;gt;From Currency&amp;lt;/td&amp;gt;
              &amp;lt;td width="70%"&amp;gt;
                &amp;lt;select className='form-control' id="fromCurrency" onChange={handleSelectChange}&amp;gt;
                  {symbols.length &amp;gt; 0 &amp;amp;&amp;amp; symbols.map((item) =&amp;gt; (
                    &amp;lt;option value={item[0]} key={item[1].code}&amp;gt;{item[1].code} - {item[1].description}&amp;lt;/option&amp;gt;
                  ))}
                &amp;lt;/select&amp;gt;
              &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
              &amp;lt;td&amp;gt;To Currency&amp;lt;/td&amp;gt;
              &amp;lt;td&amp;gt;
                &amp;lt;select className='form-control' id="toCurrency" onChange={handleSelectChange}&amp;gt;
                  {symbols.length &amp;gt; 0 &amp;amp;&amp;amp; symbols.map((item) =&amp;gt; (
                    &amp;lt;option value={item[0]} key={item[1].code}&amp;gt;{item[1].code} - {item[1].description}&amp;lt;/option&amp;gt;
                  ))}
                &amp;lt;/select&amp;gt;
              &amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            &amp;lt;tr&amp;gt;
              &amp;lt;td&amp;gt;Amount&amp;lt;/td&amp;gt;
              &amp;lt;td&amp;gt;&amp;lt;input className='form-control' type="number" onChange={(e) =&amp;gt; setAmount(e.target.value)} /&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
          &amp;lt;/tbody&amp;gt;
          &amp;lt;tfoot&amp;gt;
            &amp;lt;tr&amp;gt;
              &amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;
              &amp;lt;td&amp;gt;&amp;lt;button className='btn btn-primary' type="submit"&amp;gt;Convert&amp;lt;/button&amp;gt;&amp;lt;/td&amp;gt;
            &amp;lt;/tr&amp;gt;
            {convertedAmount !== null &amp;amp;&amp;amp;
              &amp;lt;tr&amp;gt;
                &amp;lt;td&amp;gt;Converted Amount&amp;lt;/td&amp;gt;
                &amp;lt;td&amp;gt;{toCurrency} {convertedAmount}&amp;lt;/td&amp;gt;
              &amp;lt;/tr&amp;gt;
            }
          &amp;lt;/tfoot&amp;gt;

        &amp;lt;/table&amp;gt;
      &amp;lt;/form&amp;gt;
    &amp;lt;/&amp;gt;
  )
}

export default CurrencyConverter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;pages/CurrencyRates.jsx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect, useState } from 'react'
import ExchangeRate from '../components/ExchangeRate'
import http from '../components/CustomAxios'
function CurrencyRates() {
  const [rates, setRates] = useState([]);
  const [baseCurrency, setBaseCurrency] = useState('Eur');
  const [loading, setLoading] = useState(true);
  const [exchangeDate, setExchangeDate] = useState('');
  useEffect(() =&amp;gt; {
    const getRates = async () =&amp;gt; {

      const response = await http.get('/latest?places=2');
      const data = await response.data;
      //console.log(data);
      let arr = Array.from(Object.keys(data.rates), k =&amp;gt; [`${k}`, data.rates[k]]);
      //console.log(arr);
      setRates(arr);
      setLoading(false);
      setBaseCurrency(data.base);
      setExchangeDate(data.date);
    }
    getRates();

  }, [])
  return (
    &amp;lt;&amp;gt;
      &amp;lt;h1&amp;gt;Daily Exchange Rates&amp;lt;/h1&amp;gt;
      &amp;lt;div className='text-bold'&amp;gt;
        &amp;lt;span className='float-start'&amp;gt;&amp;lt;strong&amp;gt;Base Currency: {baseCurrency}&amp;lt;/strong&amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;span className='float-end'&amp;gt;&amp;lt;strong&amp;gt;Date: {exchangeDate}&amp;lt;/strong&amp;gt;&amp;lt;/span&amp;gt;
        &amp;lt;br /&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;ExchangeRate rates={rates} loading={loading} /&amp;gt;
    &amp;lt;/&amp;gt;

  )
}

export default CurrencyRates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we create some components in src/components folder. First is to initlize the axios with base url. I am using "exchangerate.host" website API's for currency services app.&lt;/p&gt;

&lt;p&gt;components/CustomAxios.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import axios from "axios";
const http = axios.create({
    baseURL: 'https://api.exchangerate.host'
});

export default http;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next we create ExchangeRate.jsx file to show all rates from api.&lt;/p&gt;

&lt;p&gt;components/ExchangeRate.jsx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react'
import Spinner from './shared/Spinner';

function ExchangeRate({ rates, loading }) {
    if (loading) {
        return &amp;lt;Spinner/&amp;gt;;
    }
    const listing = rates.length &amp;gt; 0 &amp;amp;&amp;amp; (
        &amp;lt;div className="row row-cols-5 mt-3"&amp;gt;
            {rates.map(item =&amp;gt; (
                &amp;lt;div className="col mt-3 mb-1" key={item[0]}&amp;gt;
                    &amp;lt;div className="card bg-dark"&amp;gt;
                        &amp;lt;div className="card-body"&amp;gt;
                            &amp;lt;div className="card-text text-white"&amp;gt;
                                {item[0]} - {item[1]}
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            ))}
        &amp;lt;/div&amp;gt;
    )
    return (
        &amp;lt;&amp;gt;

            {listing}
        &amp;lt;/&amp;gt;
    );

}

export default ExchangeRate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now to load navigation and spinner, create new folder in src/components named "shared" and in src named src/assets. For loader image, you can use any image name in src/assets folder. I've used 'loadeing.gif' name. Update your image name in spinner component&lt;/p&gt;

&lt;p&gt;components/shared/Spinner.jsx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react'
import spinner from "../../assets/loading.gif";
function Spinner() {
    return (
        &amp;lt;div className='loadingSpinnerContainer'&amp;gt;
            &amp;lt;img src={spinner} alt="Loading..." width="200px" height="200px" /&amp;gt;
        &amp;lt;/div&amp;gt;
    )
}

export default Spinner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;components/shared/Navigation.jsx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React from 'react'
import { Container, Nav, Navbar, NavDropdown } from 'react-bootstrap'
import { NavLink } from 'react-router-dom'

function Navigation() {
    return (
        &amp;lt;Navbar bg="dark"  variant="dark" expand="lg"&amp;gt;
            &amp;lt;Container&amp;gt;
                &amp;lt;Navbar.Brand href="#home"&amp;gt;Currency Services&amp;lt;/Navbar.Brand&amp;gt;
                &amp;lt;Navbar.Toggle aria-controls="basic-navbar-nav" /&amp;gt;
                &amp;lt;Navbar.Collapse id="basic-navbar-nav"&amp;gt;
                    &amp;lt;Nav className="me-auto"&amp;gt;
                        &amp;lt;NavLink className="nav-link" to="/"&amp;gt;Home&amp;lt;/NavLink&amp;gt;
                        &amp;lt;NavLink className="nav-link" to="/currency-converter"&amp;gt;Currency Converter&amp;lt;/NavLink&amp;gt;
                        {/**
                        &amp;lt;NavDropdown title="Dropdown" id="basic-nav-dropdown"&amp;gt;
                            &amp;lt;NavDropdown.Item href="#action/3.1"&amp;gt;Action&amp;lt;/NavDropdown.Item&amp;gt;
                            &amp;lt;NavDropdown.Item href="#action/3.2"&amp;gt;Another action&amp;lt;/NavDropdown.Item&amp;gt;
                            &amp;lt;NavDropdown.Item href="#action/3.3"&amp;gt;Something&amp;lt;/NavDropdown.Item&amp;gt;
                            &amp;lt;NavDropdown.Divider /&amp;gt;
                            &amp;lt;NavDropdown.Item href="#action/3.4"&amp;gt;Separated link&amp;lt;/NavDropdown.Item&amp;gt;
                        &amp;lt;/NavDropdown&amp;gt; 
                        */}
                    &amp;lt;/Nav&amp;gt;
                &amp;lt;/Navbar.Collapse&amp;gt;
            &amp;lt;/Container&amp;gt;
        &amp;lt;/Navbar&amp;gt;

    )
}

export default Navigation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can get the full source code at following location.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bitbucket.org/deepaksinghkushwah/currencyservices/src/master/" rel="noopener noreferrer"&gt;https://bitbucket.org/deepaksinghkushwah/currencyservices/src/master/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hope you like this app.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>axios</category>
      <category>json</category>
    </item>
    <item>
      <title>Expense monitor App</title>
      <dc:creator>Deepak Singh Kushwah</dc:creator>
      <pubDate>Tue, 15 Feb 2022 11:08:31 +0000</pubDate>
      <link>https://dev.to/deepaksinghkushwah/expense-monitor-app-3g3a</link>
      <guid>https://dev.to/deepaksinghkushwah/expense-monitor-app-3g3a</guid>
      <description>&lt;p&gt;Hello Devs, recently I have learned ReactJS and I am creating apps to learn more. I've create an app "Expense Monitor" which can store expense and income entries in json file and show them as list. It's a beginners project and hope help it will others who are learning ReactJS. Full source code is available at following url. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://bitbucket.org/deepaksinghkushwah/expense-monitor/src/master/" rel="noopener noreferrer"&gt;https://bitbucket.org/deepaksinghkushwah/expense-monitor/src/master/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have used following packages...&lt;br&gt;
axios, bootstrap,concurrently, json-server, moment, react-bootstrap, react-icons, react-modal, react-moment, react-toastify&lt;/p&gt;

&lt;p&gt;Lets start this with updateing App.js file....&lt;/p&gt;

&lt;p&gt;App.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { ToastContainer } from "react-toastify";
import "react-toastify/dist/ReactToastify.css";
import "./App.css";
import "bootstrap/dist/css/bootstrap.min.css";
import EntryForm from "./components/EntryForm";
import { EntryProider } from "./context/entries/EntryContext";
import EntryList from "./components/EntryList";
import Modal from "react-modal";
import { useState } from "react";

function App() {
  // set app element to root
  Modal.setAppElement("#root");

  // set state for open and close modal
  const [modelIsOpen, setModelIsOpen] = useState(false);

  // open modal function
  const openModal = () =&amp;gt; {
    setModelIsOpen(true);
  };

  // close modal function
  const closeModal = () =&amp;gt; {
    setModelIsOpen(false);
  };

  return (
    &amp;lt;div className="App"&amp;gt;
      {/** Entry provider for entry context */}
      &amp;lt;EntryProider&amp;gt;
        {/** Modal config start */}
        &amp;lt;Modal
          isOpen={modelIsOpen}
          onRequestClose={closeModal}
          className="customModal mt-5 p-2"
        &amp;gt;
          &amp;lt;button
            onClick={closeModal}
            className="btn btn-sm btn-danger float-end"
          &amp;gt;
            close
          &amp;lt;/button&amp;gt;
          &amp;lt;EntryForm /&amp;gt;
        &amp;lt;/Modal&amp;gt;
        &amp;lt;h1 className="mt-3 ms-3"&amp;gt;
          Expense Monitor
          &amp;lt;span className="float-end me-3"&amp;gt;
            &amp;lt;button
              type="button"
              className="btn btn-primary btn-sm"
              onClick={openModal}
            &amp;gt;
              Add Entry
            &amp;lt;/button&amp;gt;
          &amp;lt;/span&amp;gt;
        &amp;lt;/h1&amp;gt;

        {/** Expense entries module */}
        &amp;lt;EntryList /&amp;gt;

        {/** Toast container to show toast notifications */}
        &amp;lt;ToastContainer /&amp;gt;
      &amp;lt;/EntryProider&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;

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

&lt;/div&gt;



&lt;p&gt;Now update the App.css&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.App{    
    width: 800px;
    margin: auto;
    padding: auto;    
}
.customModal{
    top: 50%;
    left: 50%;
    margin: auto;
    width: 400px;
    height: 350px;
    background-color: burlywood;
    text-align: center;    
}


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

&lt;/div&gt;



&lt;p&gt;Next create folder name "components" and create following files with code.&lt;br&gt;
compomnents/EntryForm.jsx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useContext, useState } from 'react'
import { toast } from 'react-toastify'
import { addEntry, getEntries } from '../context/entries/EntryAction';
import EntryContext from '../context/entries/EntryContext';

function EntryForm() {
  /** set states for form */
  const [title, setTitle] = useState("");
  const [amount, setAmount] = useState(0);
  const [item_type, setItemType] = useState("income");

  /** using entry context dispatch */
  const { dispatch } = useContext(EntryContext);


  /** handle form submit function */
  const handleSubmit = async(e) =&amp;gt; {
    e.preventDefault();
    dispatch({ type: 'SET_LOADING' });
    if (title === "" || amount === "") {
      toast.error("You must provide the title and amount");
      return false;
    }
    await addEntry(title, amount, item_type);
    toast.success("Entry added");
    setTitle("");
    setAmount("");
    setItemType("income");


    const allEntries = await getEntries();
    dispatch({ type: 'GET_ENTRIES', payload: allEntries });

  }
  return (
    &amp;lt;form onSubmit={handleSubmit}&amp;gt;
      &amp;lt;table className="table table-bordered"&amp;gt;
        &amp;lt;tbody&amp;gt;
          &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;input type="text" className='form-control' id="title" name="title" value={title} placeholder="Title" onChange={(e) =&amp;gt; setTitle(e.target.value)} /&amp;gt;&amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
          &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;&amp;lt;input type="number" step=".1" min="0" className='form-control' id="amount" name="amount" value={amount} placeholder="Amount" onChange={(e) =&amp;gt; setAmount(e.target.value)} /&amp;gt;&amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
          &amp;lt;tr&amp;gt;
            &amp;lt;td&amp;gt;
              &amp;lt;select name="item_type" className='form-control' value={item_type} id="item_type" onChange={(e) =&amp;gt; setItemType(e.target.value)}&amp;gt;
                &amp;lt;option value="income"&amp;gt;Income&amp;lt;/option&amp;gt;
                &amp;lt;option value="expense"&amp;gt;Expense&amp;lt;/option&amp;gt;
              &amp;lt;/select&amp;gt;
            &amp;lt;/td&amp;gt;
          &amp;lt;/tr&amp;gt;
        &amp;lt;/tbody&amp;gt;
      &amp;lt;/table&amp;gt;
      &amp;lt;button className='btn btn-primary' type="submit"&amp;gt;Send&amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  )
}

export default EntryForm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;components/EntryList.jsx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useEffect } from 'react'
import { useContext } from 'react';
import { getEntries, removeEntry } from '../context/entries/EntryAction';
import EntryContext from "../context/entries/EntryContext";
import { FaTrash } from 'react-icons/fa';
import { toast } from 'react-toastify';
import moment from "moment";
function EntryList() {
    /** use entry context to get fields */
    const { entries, dispatch, totalIncome, totalExpense, loading } = useContext(EntryContext);

    useEffect(() =&amp;gt; {
        dispatch({ type: 'SET_LOADING' });
        const fetchEntries = async () =&amp;gt; {
            const r = await getEntries();
            dispatch({ type: 'GET_ENTRIES', payload: r });

        }
        fetchEntries();

    }, [dispatch]);

    /** handle delete event */
    const handleDelete = async (id) =&amp;gt; {
        if (window.confirm("Are you sure want to remove this entry?")) {
            dispatch({ type: 'SET_LOADING' });
            await removeEntry(id);
            toast.success("Item deleted");
            const r = await getEntries();
            dispatch({ type: 'GET_ENTRIES', payload: r });
        }


    }

    if (loading) {
        return "Loading...";
    }
    return (
        &amp;lt;&amp;gt;
            {/** return entries if entries have rows */}
            {entries &amp;amp;&amp;amp; entries.length &amp;gt; 0 ? (
                &amp;lt;table className='table table-hover table-small'&amp;gt;
                    &amp;lt;thead&amp;gt;
                        &amp;lt;tr&amp;gt;
                            &amp;lt;th&amp;gt;Item&amp;lt;/th&amp;gt;
                            &amp;lt;th&amp;gt;Amount&amp;lt;/th&amp;gt;
                            &amp;lt;th&amp;gt;Date&amp;lt;/th&amp;gt;
                            &amp;lt;th&amp;gt;Action&amp;lt;/th&amp;gt;
                        &amp;lt;/tr&amp;gt;
                    &amp;lt;/thead&amp;gt;
                    &amp;lt;tbody&amp;gt;
                        {entries.map((item) =&amp;gt; (
                            &amp;lt;tr key={item.id} className={item.item_type === 'expense' ? "table-danger" : "table-primary"} title={item.item_type}&amp;gt;
                                &amp;lt;td&amp;gt;
                                    {item.title}
                                &amp;lt;/td&amp;gt;
                                &amp;lt;td&amp;gt;
                                    ${item.amount}
                                &amp;lt;/td&amp;gt;
                                &amp;lt;td&amp;gt;{moment(item.date).format("MMMM Do YYYY, h:mm:ss a")}&amp;lt;/td&amp;gt;
                                &amp;lt;td&amp;gt;
                                    &amp;lt;span className='float-end pe-3' onClick={() =&amp;gt; handleDelete(item.id)}&amp;gt;&amp;lt;FaTrash /&amp;gt;&amp;lt;/span&amp;gt;
                                &amp;lt;/td&amp;gt;
                            &amp;lt;/tr&amp;gt;
                        ))}
                    &amp;lt;/tbody&amp;gt;
                    &amp;lt;tfoot className='table-secondary'&amp;gt;
                        &amp;lt;tr&amp;gt;
                            &amp;lt;th&amp;gt;Total Income&amp;lt;/th&amp;gt;
                            &amp;lt;th&amp;gt;${totalIncome}&amp;lt;/th&amp;gt;
                            &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;
                            &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;
                        &amp;lt;/tr&amp;gt;
                        &amp;lt;tr&amp;gt;
                            &amp;lt;th&amp;gt;Total Expense&amp;lt;/th&amp;gt;
                            &amp;lt;th&amp;gt;${totalExpense}&amp;lt;/th&amp;gt;
                            &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;
                            &amp;lt;th&amp;gt;&amp;lt;/th&amp;gt;
                        &amp;lt;/tr&amp;gt;

                    &amp;lt;/tfoot&amp;gt;
                &amp;lt;/table&amp;gt;

            ) : 'No entries found'}
        &amp;lt;/&amp;gt;

    )
}

export default EntryList
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we move to context. Create context folder in src folder and write these files...&lt;br&gt;
context/entries/EntryAction.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import axios from "axios"
import moment from "moment";
const http = axios.create({
    baseURL: 'http://localhost:5000'
}); 

export const addEntry = async(title, amount, item_type) =&amp;gt; {
    const date = moment().format('LLLL');    
    const params = new URLSearchParams({title, amount, item_type, date });
    const response = await http.post('/entries',params);
    const data = await response.data;
    return data;
}

export const getEntries = async() =&amp;gt; {
    const r = await http.get('/entries');
    const data = await r.data;
    return data;
}

export const removeEntry = async(id) =&amp;gt; {
    const response = await http.delete(`/entries/${id}`)
    const data = await response.data;
    return data;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;EntryContext.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { createContext, useReducer } from "react";
import EntryReducter from "./EntryReducer";

const EntryContext = createContext();

export const EntryProider = ({children}) =&amp;gt; {
    const initalState = {
        entries: [],
        totalExpense: 0,
        totalIncome: 0,
        loading: true,
    }
    const [state, dispatch] = useReducer(EntryReducter, initalState);
    return &amp;lt;EntryContext.Provider value={{
        ...state,
        dispatch
    }}&amp;gt;
        {children}
    &amp;lt;/EntryContext.Provider&amp;gt;
}

export default EntryContext;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;EntryReducer.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const EntryReducter = (state, action) =&amp;gt; {
    let expense = 0;
    let income = 0;
    switch(action.type){
        case 'GET_ENTRIES':
            expense = setTotal('expense', action.payload);
            income = setTotal('income', action.payload)
            return {                
                entries: action.payload,
                loading: false,
                totalExpense: expense,
                totalIncome: income
            }

        case 'SET_LOADING':
            return {
                loading: true
            }
        default:
            return state;
    }
}

function setTotal(type, entries){
    let total = 0.00;
    console.log(entries);
    entries.map((item) =&amp;gt; {
        if(item.item_type === type){
            total += parseFloat(item.amount);
        }
    })
    return total;    

}

export default EntryReducter;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>react</category>
      <category>app</category>
      <category>programming</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
