25
loading...
This website collects cookies to deliver better user experience
npm i axios react-router-dom
{
"name": "client",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^11.2.7",
"@testing-library/user-event": "^12.8.3",
"axios": "^0.24.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-router-dom": "^5.3.0",
"react-scripts": "4.0.3",
"web-vitals": "^1.1.2"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
// components/DisplayTodo.js
import { useState, useEffect } from "react";
import axios from "axios";
import { Link } from "react-router-dom";
import TodoLists from "../TodoLists";
const DisplayTodo = () => {
const [infoTodo, setInfoTodo] = useState([]);
useEffect(() => {
axios
.get("http://localhost:4000/api/todoapp")
.then((res) => {
console.log(res.data);
setInfoTodo(res.data);
})
.catch((err) => {
console.log(err);
});
}, []);
const deleteHandler = (e) => {
axios.delete(`http://localhost:4000/api/todoapp/${e.target.name}`);
setInfoTodo((data) => {
return data.filter((todo) => todo._id !== e.target.name);
});
};
return (
<section className="todo-container">
<Link to="/add-todo" className="todo-btn-new">
<button className="todo-btn">Add new todo</button>
</Link>
<section className="todo-data">
<h1></h1>
<ul className="todo-list-block">
{infoTodo.map((data) => (
<TodoCard data={data} deleteHandler={deleteHandler} />
))}
</ul>
</section>
</section>
);
};
export default DisplayTodo;
// components/TodoList.js
import React from "react";
const TodoList = ({ todoInfos, deleteHandler }) => {
const { _id, tilte, description } = todoInfos;
return (
<li key={_id}>
<div className="title-description">
<h3>{title}</h3>
<p>{description}</p>
</div>
<div className="button-container">
<button name={_id} className="button">
🖊️
</button>
<button name={_id} className="button" onClick={deleteHandler}>
🗑️
</button>
</div>
</li>
);
};
"description": "", "title": ""
// components/CreateTodo.js
import { useState } from "react";
import axios from "axios";
const CreateTodo = () => {
const [todoInfo, setTodoInfo] = useState({ title: "", description: "" });
function handleChange(e) {
setTodoInfo((data) => ({ ...data, [e.target.name]: e.target.value }));
}
function handleSubmit(e) {
e.preventDefault();
axios
.post("http://localhost:4000/api/todoapp", todoInfo)
.then((res) => {
setTodoInfo({ title: "", description: "" });
console.log(res.data.message);
})
.catch((err) => {
console.log("Error couldn't create TODO");
console.log(err.message);
});
}
return (
<section className="container">
<button type="button" className="todo-btn todo-btn-back">
🔙 back
</button>
<section className="todo-data">
<form onSubmit={handleSubmit} className="form-container" noValidate>
<label className="label" htmlFor="title">
Todo Title
</label>
<input
type="text"
name="title"
value={todoInfo.title}
onChange={handleChange}
className="input"
/>
<label className="label" htmlFor="description">
Describe it !
</label>
<input
type="textarea"
name="description"
value={todoInfo.description}
onChange={handleChange}
className="input"
/>
<button type="submit" className="todo-btn">
➕ create todo
</button>
</form>
</section>
</section>
);
};
export default CreateTodo;
//components/DisplayTodo.js
import { useState, useEffect } from "react";
import axios from "axios";
import TodoLists from "../TodoLists";
const DisplayTodo = () => {
const [infoTodo, setInfoTodo] = useState([]);
const [id, setId] = useState("");
const [update, setUpdate] = useState(false);
const [infoTodo, setInfoTodo] = useState([]);
const [modal, setModal] = useState(false);
useEffect(() => {
axios
.get("http://localhost:8000/api/todo")
.then((res) => {
console.log(res.data);
setInfoTodo(res.data);
})
.catch((err) => {
console.log(err);
});
}, []);
const updateHandler = () => {
setUpdate(!update);
};
const closeHandler = () => {
setId("");
setModal(false);
};
const deleteHandler = (e) => {
axios.delete(`http://localhost:8000/api/todo/${e.target.name}`);
setInfoTodo((data) => {
return data.filter((todo) => todo._id !== e.target.name);
});
};
return (
<section className="container">
<button className="todo-btn">➕ Add new todo</button>
<section className="todo-data">
<h1></h1>
<ul className="todo-list-block">
{infoTodo.map((todoInfo, index) => (
<TodoLists
key={index}
todoInfos={todoInfo}
deleteHandler={deleteHandler}
/>
))}
</ul>
</section>
{modal ? (
<section className="update-container">
<div className="update-todo-data">
<p onClick={closeHandler} className="close">
×
</p>
</div>
</section>
) : (
""
)}
</section>
);
};
export default DisplayTodo;
// components/TodoList.js
import React from "react";
const TodoLists = ({ todoInfos }) => {
const { _id, title, description } = todoInfos;
return (
<li key={_id}>
<div className="title-description">
<h2>{title}</h2>
<h1></h1>
<p>{description}</p>
</div>
<h1></h1>
<div className="todo-btn-container">
<button className="todo-btn" name={_id}>
🖊️
</button>
<button className="todo-btn" name={_id}>
🗑️
</button>
</div>
</li>
);
};
export default TodoLists;\
// App.js
import { BrowserRouter, Route } from "react-router-dom";
import DisplayTodo from "./components/DisplayTodo";
import CreateTodo from "./components/CreateTodo";
import "./App.css";
function App() {
return (
<div className="todo-Container">
<BrowserRouter>
<Route exact path="/" component={DisplayTodo} />
<Route path="/add-list" component={CreateTodo} />
</BrowserRouter>
</div>
);
}
export default App;
// components/DisplayTodo.js
import { useState, useEffect } from "react";
import axios from "axios";
import { Link } from "react-router-dom";
import TodoLists from "../TodoLists";
export function DisplayTodo() {
const [id, setId] = useState("");
const [update, setUpdate] = useState(false);
const [infoTodo, setInfoTodo] = useState([]);
const [modal, setModal] = useState(false);
useEffect(
function () {
axios
.get("http://localhost:4000/api/todoapp")
.then((res) => {
setInfoTodo(res.data);
})
.catch((err) => {
console.log(err.message);
});
},
[update]
);
const editHandler = (e) => {
setId(e.target.name);
setModal(true);
};
const updateHandler = () => {
setUpdate(!update);
};
const deleteHandler = (e) => {
axios.delete(`http://localhost:4000/api/todoapp/${e.target.name}`);
setInfoTodo((data) => {
return data.filter((todo) => todo._id !== e.target.name);
});
};
const closeHandler = () => {
setId("");
setModal(false);
};
return (
<section className="container">
<Link to="/add-list" className="button-new">
<button className="todo-btn">➕ Add new todo</button>
</Link>
<section className="todo-data">
<h1></h1>
<ul className="todo-list-block">
{infoTodo.map((todoInfo, index) => (
<TodoLists
key={index}
todoInfos={todoInfo}
editHandler={editHandler}
deleteHandler={deleteHandler}
/>
))}
</ul>
</section>
{modal ? (
<section className="update-container">
<div className="update-todo-data">
<p onClick={closeHandler} className="close">
×
</p>
</div>
</section>
) : (
""
)}
</section>
);
}
export default DisplayTodo;
// components/CreateTodo.js
import { useState } from "react";
import { Link } from "react-router-dom";
import axios from "axios";
const CreateTodo = () => {
const [todoInfo, setTodoInfo] = useState({ title: "", description: "" });
function handleChange(e) {
setTodoInfo((data) => ({ ...data, [e.target.name]: e.target.value }));
}
function handleSubmit(e) {
e.preventDefault();
axios
.post("http://localhost:4000/api/todoapp", todoInfo)
.then((res) => {
setTodoInfo({ title: "", description: "" });
console.log(res.data.message);
})
.catch((err) => {
console.log("Error couldn't create TODO");
console.log(err.message);
});
}
return (
<section className="container">
<Link to="/">
<button type="button" className="todo-btn todo-btn-back">
🔙 back
</button>
</Link>
<section className="todo-data">
<form onSubmit={handleSubmit} className="form-container" noValidate>
<label className="label" htmlFor="title">
Todo Title
</label>
<input
type="text"
name="title"
value={todoInfo.title}
onChange={handleChange}
className="input"
/>
<label className="label" htmlFor="description">
Describe it !
</label>
<input
type="textarea"
name="description"
value={todoInfo.description}
onChange={handleChange}
className="input"
/>
<button type="submit" className="todo-btn">
➕ create todo
</button>
</form>
</section>
</section>
);
};
export default CreateTodo;
//components/UpdateTodo.js
import { useState } from "react";
import axios from "axios";
function UpdateTodo({ _id, closeHandler, updateHandler }) {
const [todoInfo, setTodoInfo] = useState({ title: "", description: "" });
const handleChange = (e) => {
setTodoInfo((data) => ({ ...data, [e.target.name]: e.target.value }));
};
const submitHanlder = (e) => {
e.preventDefault();
axios
.put(`http://localhost:4000/api/todoapp/${_id}`, todoInfo)
.then((res) => {
setTodoInfo({ title: "", description: "" });
})
.catch((err) => {
console.error(err);
});
};
return (
<form
className="form-container"
onSubmit={(e) => {
submitHanlder(e);
updateHandler();
closeHandler();
}}
>
<label htmlFor="title" className="label">
Todo Title
</label>
<input
type="text"
name="title"
className="input"
onChange={handleChange}
/>
<label htmlFor="description" className="label">
Todo Description
</label>
<input
type="textarea"
name="description"
className="input"
onChange={handleChange}
/>
<button type="submit" className="todo-btn">
➕ Add
</button>
</form>
);
}
export default UpdateTodo;
//components/DisplayTodo.js
import { useState, useEffect } from "react";
import axios from "axios";
import { Link } from "react-router-dom";
import UpdateTodo from "../UpdateTodo";
import TodoLists from "../TodoLists";
export function DisplayTodo() {
const [id, setId] = useState("");
const [update, setUpdate] = useState(false);
const [infoTodo, setInfoTodo] = useState([]);
const [modal, setModal] = useState(false);
useEffect(
function () {
axios
.get("http://localhost:4000/api/todoapp")
.then((res) => {
setInfoTodo(res.data);
})
.catch((err) => {
console.log(err.message);
});
},
[update]
);
const editHandler = (e) => {
setId(e.target.name);
setModal(true);
};
const updateHandler = () => {
setUpdate(!update);
};
const deleteHandler = (e) => {
axios.delete(`http://localhost:4000/api/todoapp/${e.target.name}`);
setInfoTodo((data) => {
return data.filter((todo) => todo._id !== e.target.name);
});
};
const closeHandler = () => {
setId("");
setModal(false);
};
return (
<section className="container">
<Link to="/add-list" className="button-new">
<button className="todo-btn">➕ Add new todo</button>
</Link>
<section className="todo-data">
<h1></h1>
<ul className="todo-list-block">
{infoTodo.map((todoInfo, index) => (
<TodoLists
key={index}
todoInfos={todoInfo}
editHandler={editHandler}
deleteHandler={deleteHandler}
/>
))}
</ul>
</section>
{modal ? (
<section className="update-container">
<div className="update-todo-data">
<p onClick={closeHandler} className="close">
×
</p>
<UpdateTodo
_id={id}
closeHandler={closeHandler}
updateHandler={updateHandler}
/>
</div>
</section>
) : (
""
)}
</section>
);
}
export default DisplayTodo;
//components/TodoList.js
import React from "react";
const TodoLists = ({ todoInfos, editHandler, deleteHandler }) => {
const { _id, title, description } = todoInfos;
return (
<li key={_id}>
<div className="title-description">
<h2>{title}</h2>
<h1></h1>
<p>{description}</p>
</div>
<h1></h1>
<div className="todo-btn-container">
<button className="todo-btn" name={_id} onClick={editHandler}>
🖊️
</button>
<button className="todo-btn" name={_id} onClick={deleteHandler}>
🗑️
</button>
</div>
</li>
);
};
export default TodoLists;
npm init -y
npm install cors express dotenv mongoose nodemon
{
"name": "server",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "nodemon main.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"cors": "^2.8.5",
"dotenv": "^10.0.0",
"express": "^4.17.1",
"mongoose": "^6.0.12",
"nodemon": "^2.0.14"
}
}
configurations : Make a file called database.js in the config folder. The necessary code for connecting to the MongoDB database will be contained in this file.
controllers : The files in the controllers’ folder will contain the methods for the endpoints to interface with the database.
models : The files that specify the MongoDB schema will be found in the model’s folder.
routers : The files with the endpoints will be found in the routers folder.
const express = require("express");
const cors = require("cors");
const dotenv = require("dotenv");
dotenv.config();
const app = express();
const PORT = process.env.PORT || 5000;
// listen
app.listen(PORT, () =>
console.log(`Server is running on http://localhost:${PORT}`)
);
PORT=4000
npm start
PORT=4000
DATABASE_URL=mongodb+srv://pramit:<password>@cluster0.qjvl6.mongodb.net/myFirstDatabase?retryWrites=true&w=majority
//database.js
const mongoose = require('mongoose');
const dotenv = require('dotenv');
dotenv.config();
const databaseURL = process.env.DATABASE_URL;
const databaseConfiguration = async () => {
try {
await mongoose.connect(databaseURL, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
console.log('Database connected');
} catch (err) {
console.log(err);
process.exit(1);
}
};
module.exports = databaseConfiguration;
// main.js
const express = require('express');
const cors = require('cors');
const databaseConfiguration = require('./configurations/database.js');
const dotenv = require('dotenv');
dotenv.config();
const app = express();
const PORT = process.env.PORT || 5000;
//connecting to the mongodb database
databaseConfiguration();
// add the middlewares
app.use(express.json({ extended: false }));
app.get('/', (req, res) => res.send('<h1>Server is up and running</h1>'));
// listen
app.listen(PORT, () =>
console.log(`Server is running on http://localhost:${PORT}`)
);
// models.js
const mongoose = require('mongoose');
const TodoListSchema = new mongoose.Schema({
title: {
type: String,
required: true,
},
description: {
type: String,
},
date: {
type: Date,
default: Date.now,
},
});
const Todo = mongoose.model('todo', TodoListSchema);
module.exports = Todo;
//todo.routes.js
const express = require("express");
const router = express.Router();
const {
listAllTodo,
createOneTodo,
updateOneTodo,
deleteTodo,
} = require("../controllers/todo.controller.js");
router.get("/", listAllTodo);
router.post("/", createOneTodo);
router.put("/:id", updateOneTodo);
router.delete("/:id", deleteTodo);
module.exports = router;
//controllers.js
const AppTodo = require("../models/models.js");
exports.createOneTodo = (req, res) => {
AppTodo.create(req.body)
.then((todo) => {
console.log({ todo });
res.json({
message: "Cheers!! You have successfully added TODO",
todo,
});
})
.catch((err) => {
res.status(404).json({
message: "Sorry your todo list cannot be added",
error: err.message,
});
});
};
exports.listAllTodo = (req, res) => {
AppTodo.find()
.then((todo) => {
console.log({ todo });
res.json(todo);
})
.catch((err) => {
res
.status(404)
.json({ message: "There isnt any todo available", error: err.message });
});
};
exports.updateOneTodo = (req, res) => {
AppTodo.findByIdAndUpdate(req.params.id, req.body)
.then((todo) => {
console.log({ todo });
return res.json({
message: "Cheers!! You have successfully updated TODO",
todo,
});
})
.catch((err) => {
res.status(404).json({
message: "Sorry your todo list cannot be updated",
error: err.message,
});
});
};
exports.deleteTodo = (req, res) => {
AppTodo.findByIdAndRemove(req.params.id, req.body)
.then((todo) => {
console.log({ todo });
res.json({
message: "Cheers!! You have successfully deleted your TODO",
todo,
});
})
.catch((err) => {
res.status(404).json({
message: "Sorry your todo is not there",
error: err.message,
});
});
};
//main.js
const express = require("express");
const cors = require("cors");
const databaseConfiguration = require("./configurations/database.js");
const todo = require("./routes/todo.routes.js");
const dotenv = require("dotenv");
dotenv.config();
const app = express();
const PORT = process.env.PORT || 5000;
//connecting to mongodb
databaseConfiguration();
//adding cors
app.use(cors({ origin: true, credentials: true }));
// adding middlewares
app.use(express.json({ extended: false }));
app.get("/", (req, res) =>
res.send("Hello there!! Cheers !! The server is up and running")
);
// using the todo routes
app.use("/api/todoapp", todo);
// listen
app.listen(PORT, () =>
console.log(`Server is running on http://localhost:${PORT}`)
);