<?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: Chytra K R</title>
    <description>The latest articles on DEV Community by Chytra K R (@chytrakr).</description>
    <link>https://dev.to/chytrakr</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%2F651596%2F97446e98-2240-4198-9fac-752f3a664bf6.jpeg</url>
      <title>DEV Community: Chytra K R</title>
      <link>https://dev.to/chytrakr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chytrakr"/>
    <language>en</language>
    <item>
      <title>Steps to Create A To-Do App With MERN stack</title>
      <dc:creator>Chytra K R</dc:creator>
      <pubDate>Fri, 18 Jun 2021 10:54:10 +0000</pubDate>
      <link>https://dev.to/chytrakr/steps-to-create-a-to-do-app-with-mern-stack-4912</link>
      <guid>https://dev.to/chytrakr/steps-to-create-a-to-do-app-with-mern-stack-4912</guid>
      <description>&lt;h2&gt;
  
  
  Tools You Will Need
&lt;/h2&gt;

&lt;p&gt;Make sure Node and NPM are installed on your computer. You can download both at nodejs.org (NPM is included in your Node installation)&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/en/" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;&lt;br&gt;
&lt;a href="https://expressjs.com/en/starter/installing.html" rel="noopener noreferrer"&gt;Express.js&lt;/a&gt;&lt;br&gt;
 &lt;a href="https://www.mongodb.com/cloud" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;&lt;br&gt;
&lt;a href="https://reactjs.org/docs/getting-started.html" rel="noopener noreferrer"&gt;React.js&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Dependencies for Node.js
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/body-parser" rel="noopener noreferrer"&gt;body-parser&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/mongoose" rel="noopener noreferrer"&gt;mongoose&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/mongoose-auto-increment" rel="noopener noreferrer"&gt;mongoose-auto-increment&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Create your Node (Express) Backend
&lt;/h2&gt;

&lt;p&gt;First create a folder for your project, called to-do-node (for example).&lt;br&gt;
Then, open that folder in your code editor.&lt;br&gt;
To create our Node project, run the following command in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm init -y&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;This will create a package.json file that will allow us to keep track of all our app scripts and manage any dependencies our Node app needs.&lt;/p&gt;

&lt;p&gt;We'll use Express to create a simple web server for us that runs on port 3000.&lt;/p&gt;

&lt;p&gt;So let's create an index file where our app starts to run with the name of &lt;code&gt;index.js&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const express = require('express')
const app = express()
const bodyParser = require('body-parser');

//import router
const router = require('./app/index.js');

// body parser
app.use(bodyParser.urlencoded({ limit: '100mb', extended: true }))
app.use(bodyParser.json({ limit: '100mb', extended: true }))

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");

  if ('OPTIONS' === req.method) {
    //respond with 200
    res.send(200);
  }
  else {
    //move on
    next();
  }
});

app.get('/', (req, res) =&amp;gt; {
  res.send("incorrect route");
})

//add routes
const base = '/api/v1/';
app.use(base, router);

app.listen(process.env.PORT || 3000, () =&amp;gt; console.log('Running on port 3000!'));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in our terminal, we will install dependencies which we need:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm I express mongoose body-parser nodemon mongoose-auto-increment&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Create a folder called &lt;code&gt;app&lt;/code&gt; inside the project folder and add &lt;code&gt;index.js&lt;/code&gt; file to defines routes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const express = require('express');

// Routes Import
const toDo = require("./toDo/index.js");

const router = express.Router();

// Adding Routes
router.use('/to-do', toDo);

module.exports = router;

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

&lt;/div&gt;



&lt;p&gt;Create folder name called config and add &lt;code&gt;db.js&lt;/code&gt; file to that.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;db.js&lt;/code&gt; file will have the following configurations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const mongoose = require('mongoose');
mongoose.connect('mongodb+srv://&amp;lt;mongodb_username&amp;gt;:&amp;lt;cluster_password&amp;gt;@cluster0.nxcni.mongodb.net/toDo?retryWrites=true&amp;amp;w=majority', { useNewUrlParser: true });
module.exports = mongoose.connection;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Let's write APIs now.
&lt;/h2&gt;

&lt;p&gt;Create a folder called toDo and &lt;code&gt;model.js&lt;/code&gt;, &lt;code&gt;index.js&lt;/code&gt;, and &lt;code&gt;router.js&lt;/code&gt; files in that.&lt;/p&gt;

&lt;h3&gt;
  
  
  index.js
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = require("./router");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  model.js
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const mongoose = require('mongoose'); 
const autoIncrement = require('mongoose-auto-increment');
const db = require('../config/db.js');

autoIncrement.initialize(db);

const schema = new config.mongoose.Schema({
  toDos: [
    {
      toDo: String,
      tag: String,
      tagColor: String,
      done: Boolean
    }
  ],
  createdAt: {
    type: Date,
    default: Date.now
  },
  updatedAt: {
    type: Date,
    default: Date.now
  },
  status: {
    type: Boolean,
    default: true
  }
}, {
  strict: true
});

var toDo = mongoose.model('toDos', schema);
module.exports = toDo;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  router.js
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const config = require('../config/routes.js');
const router = config.express.Router();
const collection = require('./model.js');

// @route GET api/v1/to-do/list
// @desc get users list with pagination
// @access Public
router.get('/list', function (req, res) {
    if(!req.query.id) {
          res.status(200).send({data: []});
        return false;
    }
    getToDosList(req.query.tag ? req.query.tag : '', req.query.id).then(resp =&amp;gt; {
          res.status(200).send(resp[0]);
    }, err =&amp;gt; {
          res.status(500).send({message: "Something went wrong, please try after sometime"});
    })
});

// @route CREATE api/v1/to-do/add
// @desc add to-do
// @access Public
router.post('/add', function(req, res) {
    if(!req.query.id) {
        collection.create({toDos: [{toDo: req.body.text, done: false, tag: req.body.tag, tagColor: req.body.tagColor}]}, function (err, toDo) {
            if (!err) {
                return res.status(200).json({error: false, data: toDo, message: 'success'})
            } else {
                  return res.status(500).send({error: true, message: 'Error adding to-do'})
            }
        });
    } else {
            let updateData = {
            $push: {
                "toDos": {toDo: req.body.text, done: false, tag: req.body.tag, tagColor: req.body.tagColor}
            }
        };
            updateToDo({_id: req.query.id}, updateData).then(toDo =&amp;gt; {
              return res.status(200).json({error: false, data: toDo, message: 'success'})
            }, err =&amp;gt; {
            return res.status(500).send({error: true, message: 'Error adding to-do'})
            })
    }
});

// @route UPDATE api/v1/to-do/done
// @desc update toDo status
// @access Public
router.put('/done/:userId/:toDoId', function(req, res) {
    let updateData = {
        $set: {
            "toDos.$.done": req.body.done
        }
    };
    updateToDo({_id: req.params.userId, "toDos._id": req.params.toDoId}, updateData).then((toDo) =&amp;gt; {
        return res.status(200).json({error: false, message: 'Updated successfully'})
    }, err =&amp;gt; {
        return res.status(500).send({error: true, message: err})
    })
});

// @route UPDATE api/v1/to-do/delete
// @desc delete toDo
// @access Public
router.put('/delete/:userId/:toDoId', function(req, res) {
    let updateData = { "$pull": { "toDos": { "_id": req.params.toDoId } } }
    updateToDo({_id: req.params.userId, "toDos._id": req.params.toDoId}, updateData).then((toDo) =&amp;gt; {
        return res.status(200).json({error: false, message: 'Updated successfully'})
    }, err =&amp;gt; {
        return res.status(500).send({error: true, message: err})
    })
});

// function to get to-dos list with tag filter
function getToDosList(tag, id) {
    return new Promise(function(resolve, reject) {
        let agg = [
            {
                "$unwind": "$toDos"
            }, {
                "$match": {
                    $or: [{"_id": id}, {"toDos.tag": {$regex: `${tag}.*`, $options: "i" }}]
                }
            }, {
                "$group": {
                    _id: null,
                    data: {$push: "$toDos"}
                }
            }
        ]
        collection.aggregate(agg, function(err, response) {
          if(err) return reject({message: "Something went wrong"})
          if(!response) return reject({message: "Error while getting remitters data"})
          return resolve(response)
        })
    })
}

//function to update to-do
function updateToDo(query, updateData) {
    return new Promise(function(resolve, reject) {
        collection.findOneAndUpdate(query, updateData, {new: true},
            function (err, resp) {
                    if (err) return reject({error: 1, message: "There was a problem while updating data"});
                    return resolve(resp);
            }
        );
    })
}

function getToDos(query) {
    return new Promise(function(resolve, reject) {
        collection.find(query,
            function (err, resp) {
                    if (err) return reject({error: 1, message: "There was a problem while updating data"});
                    return resolve(resp);
            }
        );
    })
}


module.exports = router

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

&lt;/div&gt;



&lt;p&gt;Finally, we can run our app by running &lt;code&gt;nodemon index.js&lt;/code&gt; in our terminal and we should see that app is running on port 3000.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependencies for React.js
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/bootstrap" rel="noopener noreferrer"&gt;bootstrap&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/react-bootstrap" rel="noopener noreferrer"&gt;react-bootstrap&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/react-icons" rel="noopener noreferrer"&gt;react-icons&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Create your React Frontend
&lt;/h2&gt;

&lt;p&gt;After creating our backend, let's move to the frontend.&lt;/p&gt;

&lt;p&gt;Open another terminal tab and use create-react-app to create a new React project with the name to-do-react (for example):&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx create-react-app to-do-react&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;After that, we will have a React app with all of its dependencies installed.&lt;/p&gt;

&lt;p&gt;Now, go to the folder&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd to-do-react&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Change directory to src and run the below commands:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd src&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rm *&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now create index.js file by running below command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;touch index.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This file will render our app to an HTML file which is in the public folder. Also, create a folder name &lt;code&gt;components&lt;/code&gt; with the file name &lt;code&gt;app.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mkdir components &amp;amp;&amp;amp; cd components &amp;amp;&amp;amp; touch app.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;app.js will contain our To-Do app.&lt;/p&gt;

&lt;p&gt;Edit &lt;code&gt;index.js&lt;/code&gt; file in src:&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 ReactDOM from 'react-dom';
import App from './components/app';
import 'bootstrap/dist/css/bootstrap.min.css';

ReactDOM.render(&amp;lt;App/&amp;gt;, document.getElementById('root'));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a folder with the name of &lt;code&gt;api&lt;/code&gt; and add the file with name of &lt;code&gt;to-do.js&lt;/code&gt; and write API calls in that file as below:&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';

let base = 'http://localhost:3000/api/v1/';

export default function api(url, method='GET', data={}) {
    return new Promise(function(resolve, reject) {
        const requestOptions = {
            url: base + url,
            method: method,
            headers: {
                'Content-Type': 'application/json'
            },
            data
        };
        axios(requestOptions)
        .then(function (response) {
            resolve(response.data);
        })
        .catch(function (error) {
            reject(error);
        });
    });
}

export function AddToDoAPI(data) {
    return new Promise(function(resolve, reject) {
        api(`to-do/add?id=${localStorage.userId ? localStorage.userId : ''}`, 'POST', data)
        .then((resp) =&amp;gt; {
            return resolve(resp);
        }, (error) =&amp;gt; {
            return reject(error.response.data.message);
        })
    })
}

export function GetToDoListAPI(tag='') {
    return new Promise(function(resolve, reject) {
        api(`to-do/list?id=${localStorage.userId ? localStorage.userId : ''}&amp;amp;tag=${tag}`)
        .then((resp) =&amp;gt; {
            return resolve(resp);
        }, (error) =&amp;gt; {
            console.log(error)
            debugger
            return reject(error.response.data.message);
        })
    })
}

export function UpdateToDoAPI(data, toDoId) {
    return new Promise(function(resolve, reject) {
        api(`to-do/done/${localStorage.userId}/${toDoId}`, 'PUT', data)
        .then((resp) =&amp;gt; {
            return resolve(resp);
        }, (error) =&amp;gt; {
            return reject(error.response.data.message);
        })
    })
}

export function DeleteToDoAPI(toDoId) {
    return new Promise(function(resolve, reject) {
        api(`to-do/delete/${localStorage.userId}/${toDoId}`, 'PUT', {})
        .then((resp) =&amp;gt; {
            return resolve(resp);
        }, (error) =&amp;gt; {
            return reject(error.response.data.message);
        })
    })
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edit &lt;code&gt;app.js&lt;/code&gt; in components:&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, {Component} from 'react';

// Bootstrap for react
import Container from 'react-bootstrap/Container';
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';
import Button from 'react-bootstrap/Button';
import InputGroup from 'react-bootstrap/InputGroup';
import FormControl from 'react-bootstrap/FormControl';
import ListGroup from 'react-bootstrap/ListGroup';
import Form from 'react-bootstrap/Form'
import Dropdown from 'react-bootstrap/Dropdown'
import DropdownButton from 'react-bootstrap/DropdownButton'
import {AddToDoAPI, GetToDoListAPI, UpdateToDoAPI, DeleteToDoAPI} from '../api/to-do'
import { BsStop, BsX } from 'react-icons/bs';
import {Badge} from "react-bootstrap";

class AppComponent extends Component {
    constructor(props) {
        super(props);

        // Setting up state
        this.state = {
            userInput : "",
            list:[],
            selectedTag: "Other",
            selectedTagColor: "grey",
            tags: [
                {tagName: 'Other', color: 'grey'},
                {tagName: 'Work', color: 'red'},
                {tagName: 'Personal', color: 'green'}
            ]
        }
    }
    componentDidMount() {
        this.getItems()
    }

    // Set a user input value
    updateInput(value){
        this.setState({
            userInput: value,
        });
    }

    // Set a selected tag value
    updateTag(value){
        this.setState({
            selectedTag: value.split(" ")[0],
            selectedTagColor: value.split(" ")[1]
        });
    }

    // Add item if user input in not empty
    addItem(event){
        if(event.code === 'Enter') {
            AddToDoAPI({text: this.state.userInput, tag: this.state.selectedTag, tagColor: this.state.selectedTagColor}).then(resp =&amp;gt; {
                if(!localStorage.userId) {
                    localStorage.setItem('userId', resp.data._id);
                }
                this.getItems()
            })
        }
    }

    //Get to-do list
    getItems(tag='') {
        GetToDoListAPI(tag).then(resp =&amp;gt; {
            // Update list
            const list = [...resp ? resp.data : []];
            // reset state
            this.setState({
                list,
                userInput: ""
            });
        })
    }

    UpdateToDo(val, id) {
        UpdateToDoAPI({done: val}, id).then(resp =&amp;gt; {
            this.getItems()
        })
    }

    // Function to delete item from list use id to delete
    deleteItem(id) {
        DeleteToDoAPI(id).then(resp =&amp;gt; {
            this.getItems()
        })
    }

    render(){
        return(
        &amp;lt;Container&amp;gt;

            &amp;lt;Row style={{
                display: "flex",
                justifyContent: "center",
                alignItems: "center",
                fontSize: '3rem',
                fontWeight: 'bolder',
                fontFamily: 'DejaVu Sans Mono, monospace',
                paddingTop: 2
                }}
                &amp;gt;TODO LIST
            &amp;lt;/Row&amp;gt;
            &amp;lt;hr style={{marginTop: 0}}/&amp;gt;
            &amp;lt;Row&amp;gt;
                &amp;lt;Col md={{ span: 5, offset: 4 }}&amp;gt;
                    &amp;lt;InputGroup className="mb-3"&amp;gt;
                        &amp;lt;DropdownButton
                            variant="outline-secondary"
                            id="input-group-dropdown-2"
                            title={this.state.selectedTag}
                            align="end"
                            size="lg"
                            style={{backgroundColor: 'white'}}
                            onSelect = {e =&amp;gt; this.updateTag(e)}
                            &amp;gt;
                                {this.state.tags.map(tag =&amp;gt; (
                                    &amp;lt;span style={{display: 'flex'}}&amp;gt;&amp;lt;BsStop style={{fontSize: 30, marginTop: 1, color: tag.color}}/&amp;gt;&amp;lt;Dropdown.Item key={tag.tagName} eventKey={tag.tagName + ' ' + tag.color}&amp;gt;{tag.tagName}&amp;lt;/Dropdown.Item&amp;gt;&amp;lt;/span&amp;gt;
                                ))}
                        &amp;lt;/DropdownButton&amp;gt;
                        &amp;lt;FormControl
                            placeholder="add item . . . "
                            size="lg"
                            value = {this.state.userInput}
                            onChange = {item =&amp;gt; this.updateInput(item.target.value)}
                            onKeyPress = {e =&amp;gt; this.addItem(e)}
                            aria-label="add something"
                            aria-describedby="basic-addon2"
                        /&amp;gt;
                    &amp;lt;/InputGroup&amp;gt;
                &amp;lt;/Col&amp;gt;
            &amp;lt;/Row&amp;gt;
            {this.state.list.length ? 
                &amp;lt;Row&amp;gt;
                    &amp;lt;Col md={{ span: 5, offset: 4 }} style={{paddingBottom: 18}}&amp;gt;
                        &amp;lt;Button variant="primary" style={{paddingTop: 0, paddingBottom: 0}} onClick={e =&amp;gt; this.getItems('')} size="sm"&amp;gt;All&amp;lt;/Button&amp;gt;{' '}
                        &amp;lt;Button variant="secondary" style={{paddingTop: 0, paddingBottom: 0}} onClick={e =&amp;gt; this.getItems('Other')} size="sm"&amp;gt;Other&amp;lt;/Button&amp;gt;{' '}
                        &amp;lt;Button variant="danger" style={{paddingTop: 0, paddingBottom: 0}} onClick={e =&amp;gt; this.getItems('Work')} size="sm"&amp;gt;Work&amp;lt;/Button&amp;gt;{' '}
                        &amp;lt;Button variant="success" style={{paddingTop: 0, paddingBottom: 0}} onClick={e =&amp;gt; this.getItems('Personal')} size="sm"&amp;gt;Personal&amp;lt;/Button&amp;gt;{' '}
                    &amp;lt;/Col&amp;gt;
                &amp;lt;/Row&amp;gt; : null
            }
            &amp;lt;Row&amp;gt;
                &amp;lt;Col md={{ span: 5, offset: 4 }}&amp;gt;
                    &amp;lt;ListGroup&amp;gt;
                    {/* map over and print items */}
                    {this.state.list.map(item =&amp;gt; {return(

                        &amp;lt;ListGroup.Item variant="white" action
                             key={item._id}&amp;gt;
                            &amp;lt;Form.Group id="formGridCheckbox" style={{display: 'flex'}}&amp;gt;
                            &amp;lt;Form.Check type="checkbox" style={{width: 10}} className="my-1 mr-sm-2" onChange={e =&amp;gt; this.UpdateToDo(!item.done, item._id)} checked={item.done}/&amp;gt;
                            {item.done ? &amp;lt;span style={{textDecoration: 'line-through', marginTop: 5, width: 380}}&amp;gt;{item.toDo}&amp;lt;/span&amp;gt; : &amp;lt;span style={{marginTop: 5, width: 380}}&amp;gt;{item.toDo}&amp;lt;/span&amp;gt;}
                            &amp;lt;BsStop style={{fontSize: 25, marginTop: 1, color: item.tagColor, float: 'right', width: 30}}/&amp;gt;
                            &amp;lt;BsX
                                onClick = { () =&amp;gt; this.deleteItem(item._id) }
                                style={{float: 'right', fontSize: 25, marginLeft: 'auto', width: 30}}
                            /&amp;gt;
                            &amp;lt;/Form.Group&amp;gt;
                        &amp;lt;/ListGroup.Item&amp;gt;
                    )})}
                    &amp;lt;/ListGroup&amp;gt;
                &amp;lt;/Col&amp;gt;
            &amp;lt;/Row&amp;gt;
        &amp;lt;/Container&amp;gt;
        );
    }
}

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

&lt;/div&gt;



&lt;p&gt;Start the server by typing the following command in the terminal:&lt;/p&gt;

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

&lt;p&gt;Output: Open &lt;code&gt;http://localhost:3000&lt;/code&gt; in browser:&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%2Fm41f3clondcm2830obv1.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%2Fm41f3clondcm2830obv1.png" alt="To-Do app"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, Apply filters and see the personalized to-dos:&lt;br&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%2Falt66asdpvbp1l4pq5mw.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%2Falt66asdpvbp1l4pq5mw.png" alt="To-Do app"&gt;&lt;/a&gt;&lt;/p&gt;

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