ToDoApp
ToDoApp
App.js
function App() {
return (
<>
<TaskProvider>
<Navbar />
<Filterbar />
<Tasks />
</TaskProvider>
</>
);
}
index.css
@tailwind base;
@tailwind components;
@tailwind utilities;
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto',
'Oxygen',
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
monospace;
}
index.js
src/Modals/AddTaskModals.jsx
return (
<div className={`modal ${isOpen ? 'block' : 'hidden'} fixed inset-0 z-10
overflow-y-auto`} style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }}>
<div className="modal-container bg-white w-full md:w-1/3 mx-auto mt-20 p-6
rounded shadow-lg">
<div className="modal-header flex justify-between items-center">
<h3 className="text-lg font-semibold">Add New Task</h3>
<button className="text-gray-500 hover:text-gray-800"
onClick={closeModal}>X</button>
</div>
<div className="modal-body mt-4">
<div className="mb-4">
<label className="block text-gray-700 text-sm font-bold mb-2"
htmlFor="title">Title</label>
<input className="border rounded w-full py-2 px-3 text-gray-700 leading-
tight focus:outline-none focus:shadow-outline" id="title" type="text"
value={title} onChange={(e) => setTitle(e.target.value)} />
</div>
<div className="mb-4">
<label className="block text-gray-700 text-sm font-bold mb-2"
htmlFor="description">Description</label>
<input className="border rounded w-full py-2 px-3 text-gray-700 leading-
tight focus:outline-none focus:shadow-outline" id="description" type="text"
value={description} onChange={(e) => setDescription(e.target.value)} />
</div>
<button className="bg-blue-500 hover:bg-blue-600 text-white font-bold py-2
px-4 rounded" onClick={handleSubmit}>Add Task</button>
</div>
</div>
</div>
);
}
src/Modals/DeleteModal.jsx
return (
<div className={`modal ${isOpen ? 'block' : 'hidden'} fixed inset-0 z-10
overflow-y-auto`} style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }}>
<div className="modal-container bg-white w-full md:w-1/3 mx-auto mt-20 p-6
rounded shadow-lg">
<div className="modal-header flex justify-between items-center">
<h3 className="text-lg font-semibold">Confirm Delete</h3>
<button className="text-gray-500 hover:text-gray-800"
onClick={closeModal}>X</button>
</div>
<div className="modal-body mt-4">
<p>Are you sure you want to delete this task?</p>
<div className="flex justify-end mt-4">
<button className="bg-red-500 hover:bg-red-600 text-white font-bold py-2 px-
4 rounded mr-2" onClick={handleDelete}>Delete</button>
<button className="bg-gray-300 hover:bg-gray-400 text-gray-800 font-bold py-
2 px-4 rounded" onClick={closeModal}>Cancel</button>
</div>
</div>
</div>
</div>
);
}
src/Modals/EditModal.jsx
return (
<div className={`modal ${isOpen ? 'block' : 'hidden'} fixed inset-0 z-10
overflow-y-auto`} style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }}>
<div className="modal-container bg-white w-full md:w-1/3 mx-auto mt-20 p-6
rounded shadow-lg">
<div className="modal-header flex justify-between items-center">
<h3 className="text-lg font-semibold">Edit Task</h3>
<button className="text-gray-500 hover:text-gray-800"
onClick={closeModal}>X</button>
</div>
<div className="modal-body mt-4">
<div className="mb-4">
<label className="block text-gray-700 text-sm font-bold mb-2"
htmlFor="title">Title</label>
<input className="border rounded w-full py-2 px-3 text-gray-700 leading-
tight focus:outline-none focus:shadow-outline" id="title" type="text"
value={title} onChange={(e) => setTitle(e.target.value)} />
</div>
<div className="flex justify-end mt-4">
<button className="bg-blue-500 hover:bg-blue-600 text-white font-bold py-2
px-4 rounded mr-2" onClick={handleSubmit}>Save</button>
<button className="bg-gray-300 hover:bg-gray-400 text-gray-800 font-bold py-
2 px-4 rounded" onClick={closeModal}>Cancel</button>
</div>
</div>
</div>
</div>
);
}
src/Context/TaskContent.js
useEffect(() => {
fetchData();
}, [totalTasks]);
return (
<TaskContext.Provider value={{ filteredTasks, totalTasks, completedTasks,
todoTasks, handleFilterClick, addTask, deleteTask, editTask,
updateTaskStatus }}>
{children}
</TaskContext.Provider>
);
};
src/Components/Filter.jsx
function Filterbar() {
const { handleFilterClick } = useTaskContext();
return (
<div className="flex justify-center mt-8">
<button
className="filter-button bg-blue-500 hover:bg-blue-600 text-white font-bold
py-2 px-4 rounded-l"
onClick={() => handleFilterClick('all')}
>
All
</button>
<button
className="filter-button bg-blue-500 hover:bg-blue-600 text-white font-bold
py-2 px-4"
onClick={() => handleFilterClick('completed')}
>
Completed
</button>
<button
className="filter-button bg-blue-500 hover:bg-blue-600 text-white font-bold
py-2 px-4 rounded-r"
onClick={() => handleFilterClick('todo')}
>
To Do
</button>
</div>
);
}
src/Components/Navbar.jsx
function Navbar() {
const [isModalOpen, setIsModalOpen] = useState(false);
return (
<nav className="bg-gray-800 py-4">
<div className="max-w-7xl mx-auto px-4 flex justify-between items-center">
<div>
<span className="text-white text-lg font-bold">Task Manager</span>
</div>
<div>
<button className="bg-blue-500 hover:bg-blue-600 text-white font-bold py-2
px-4 rounded" onClick={openModal}>
Add
</button>
</div>
</div>
<AddTaskModal isOpen={isModalOpen} closeModal={closeModal} />
</nav>
);
}
src/Components/TaskList.jsx
import React, { useState } from 'react';
import { useTaskContext } from '../Context/TaskContext';
import DeleteModal from '../Modals/DeleteModal';
import EditModal from '../Modals/EditModal';
function TaskList() {
const { filteredTasks, updateTaskStatus } = useTaskContext();
const [taskId, setTaskId] = useState('');
const [taskTitle, setTaskTitle] = useState('');
const [taskDescription, setTaskDescription] = useState('');
const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
const [isEditModalOpen, setIsEditModalOpen] = useState(false);
const [openDropdownId, setOpenDropdownId] = useState(null);