diff --git a/src/components/Calendar.jsx b/src/components/Calendar.jsx index d3cb662abf9ef553020978b99b3f3a88dc4cb528..b77029cfa04875c4f9472a0988b68dcb3352062c 100644 --- a/src/components/Calendar.jsx +++ b/src/components/Calendar.jsx @@ -3,9 +3,8 @@ import { format, addMonths, subMonths, startOfMonth, endOfMonth, eachDayOfInterv import { enUS } from 'date-fns/locale'; import { ChevronLeft, ChevronRight } from 'lucide-react'; -const Calendar = () => { +const Calendar = ({ selectedDate, setSelectedDate }) => { const [currentDate, setCurrentDate] = useState(new Date()); - const [selectedDate, setSelectedDate] = useState(new Date()); const nextMonth = () => setCurrentDate(addMonths(currentDate, 1)); const prevMonth = () => setCurrentDate(subMonths(currentDate, 1)); @@ -15,61 +14,61 @@ const Calendar = () => { end: endOfMonth(currentDate), }); - const startDay = getDay(startOfMonth(currentDate)); + const startDay = getDay(startOfMonth(currentDate)); return ( - <div className="space-y-6"> - <div className="bg-violet-100 rounded-2xl p-6"> - <div className="flex items-center justify-between mb-4"> - <h2 className="text-lg font-semibold text-violet-900"> - {format(currentDate, 'MMMM yyyy', { locale: enUS })} - </h2> - <div className="flex gap-2"> - <button onClick={prevMonth} className="p-1 hover:bg-violet-200 rounded"> - <ChevronLeft className="w-5 h-5 text-violet-700" /> - </button> - <button onClick={nextMonth} className="p-1 hover:bg-violet-200 rounded"> - <ChevronRight className="w-5 h-5 text-violet-700" /> - </button> + <div className="space-y-6"> + <div className="bg-violet-100 rounded-2xl p-6"> + <div className="flex items-center justify-between mb-4"> + <h2 className="text-lg font-semibold text-violet-900"> + {format(currentDate, 'MMMM yyyy', { locale: enUS })} + </h2> + <div className="flex gap-2"> + <button onClick={prevMonth} className="p-1 hover:bg-violet-200 rounded"> + <ChevronLeft className="w-5 h-5 text-violet-700" /> + </button> + <button onClick={nextMonth} className="p-1 hover:bg-violet-200 rounded"> + <ChevronRight className="w-5 h-5 text-violet-700" /> + </button> + </div> </div> - </div> - <div className="grid grid-cols-7 gap-2 text-center mb-2"> - {['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].map(day => ( - <div key={day} className="text-sm font-medium text-violet-800"> - {day} - </div> - ))} - </div> + <div className="grid grid-cols-7 gap-2 text-center mb-2"> + {['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'].map(day => ( + <div key={day} className="text-sm font-medium text-violet-800"> + {day} + </div> + ))} + </div> + + <div className="grid grid-cols-7 gap-2"> + {[...Array(startDay)].map((_, index) => ( + <div key={`empty-${index}`} className="p-2"></div> + ))} + + {days.map(day => { + const isSelected = isSameDay(day, selectedDate); - <div className="grid grid-cols-7 gap-2"> - {[...Array(startDay)].map((_, index) => ( - <div key={`empty-${index}`} className="p-2"></div> - ))} - - {days.map(day => { - const isSelected = isSameDay(day, selectedDate); - - return ( - <button - key={day.toString()} - onClick={() => setSelectedDate(day)} - className={` + return ( + <button + key={day.toString()} + onClick={() => setSelectedDate(day)} + className={` p-2 rounded-full text-sm - ${isSelected - ? 'bg-violet-500 text-white' - : 'text-violet-800 hover:bg-violet-100' - } + ${isSelected + ? 'bg-violet-500 text-white' + : 'text-violet-800 hover:bg-violet-100' + } `} - > - {format(day, 'd')} - </button> - ); - })} + > + {format(day, 'd')} + </button> + ); + })} + </div> </div> </div> - </div> ); }; -export default Calendar; \ No newline at end of file +export default Calendar; diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx index c5221de5db78b9e1bdb599b22378fdecfe328d2d..42a952e5afdb2433ee1052a799386d3a1c88c7e9 100644 --- a/src/components/Navbar.jsx +++ b/src/components/Navbar.jsx @@ -7,24 +7,24 @@ const Navbar = () => { const navigate = useNavigate(); useEffect(() => { - // Écouter les changements sur `localStorage` + const handleStorageChange = () => { setIsAuthenticated(!!localStorage.getItem("user")); }; - // Ajouter un écouteur d'événement sur `storage` + window.addEventListener("storage", handleStorageChange); return () => { - // Nettoyer l'écouteur quand le composant est démonté + window.removeEventListener("storage", handleStorageChange); }; }, []); const handleLogout = () => { - localStorage.removeItem("user"); // Supprimer l'utilisateur + localStorage.removeItem("user"); setIsAuthenticated(false); - navigate("/signin"); // Rediriger vers la page de connexion + navigate("/signin"); }; return ( @@ -53,7 +53,7 @@ const Navbar = () => { </Link> <div className="flex items-center gap-2"> {isAuthenticated ? ( - // Bouton Logout si l'utilisateur est connecté + <button onClick={handleLogout} className="bg-red-500 text-white hover:bg-red-600 px-4 py-2 rounded-md text-sm font-medium" @@ -61,7 +61,7 @@ const Navbar = () => { Logout </button> ) : ( - // Boutons Login & Signup si l'utilisateur N'EST PAS connecté + <> <Link to="/signin" diff --git a/src/pages/Home.jsx b/src/pages/Home.jsx index a879a324a5a76a4e07f76977d6057e20d4129cfd..6fb02c41317b6cd1abcac18df29347ca088bc9dc 100644 --- a/src/pages/Home.jsx +++ b/src/pages/Home.jsx @@ -1,41 +1,78 @@ -import React from "react"; +import React, { useState } from "react"; import TaskStats from "@components/dashboard/TaskStats"; import TasksStatPercent from "@components/dashboard/TasksStatPercent.jsx"; -import { useNavigate } from "react-router-dom"; +import { useTasks } from "@context/TasksContext"; import Calendar from "@components/Calendar"; +import TaskList from "@components/todolist/TaskList"; +import AddTaskButton from "@components/todolist/AddTaskButton"; +import Modal from "@components/todolist/Modal"; + const Home = () => { - const navigate = useNavigate(); - return ( - <div> - <div className="p-6 bg-gray"> - <TaskStats /> - </div> - <div className="min-h-screen bg-gray-100 p-8"> - <div className="grid grid-cols-2 gap-6"> + const { tasks, setTasks } = useTasks(); + const [selectedDate, setSelectedDate] = useState(new Date()); + const [isModalOpen, setIsModalOpen] = useState(false); + + const openModal = () => setIsModalOpen(true); + const closeModal = () => setIsModalOpen(false); + + // Fonction pour ajouter une nouvelle tâche + const saveTask = (task) => { + const newTask = { + ...task, + dueDate: task.dueDate || selectedDate.toISOString().split("T")[0], // Ajouter une dueDate par défaut + }; + setTasks([...tasks, newTask]); + }; + + // Filtrer les tâches en fonction de leur dueDate + const filteredTasks = tasks.filter(task => { + if (!task.dueDate) return false; // Vérifie si une tâche a bien une date + const taskDate = new Date(task.dueDate); // Convertir en objet Date + return taskDate.toDateString() === selectedDate.toDateString(); // Comparer avec la date sélectionnée + }); + + return ( + <div> + <div className="p-6 bg-gray"> + <TaskStats /> + </div> + <div className="min-h-screen bg-gray-100 p-8"> + <div className="grid grid-cols-2 gap-6"> + - <div className="bg-white rounded-lg shadow-md p-6 min-h-[300px]"> + <div className="bg-white rounded-lg shadow-md p-6 min-h-[300px]"> + <h3 className="text-lg font-semibold mb-4"> + Tasks for {selectedDate.toDateString()} + </h3> - </div> + <AddTaskButton onClick={openModal} /> + {filteredTasks.length > 0 ? ( + <TaskList tasks={filteredTasks} /> + ) : ( + <p className="text-gray-500 mt-4">No tasks for this day</p> + )} + </div> - <div className="bg-white rounded-lg shadow-md p-6 min-h-[300px]"> - <Calendar /> - </div> + <div className="bg-white rounded-lg shadow-md p-6 min-h-[300px]"> + <Calendar selectedDate={selectedDate} setSelectedDate={setSelectedDate} /> + </div> - <div className="bg-white rounded-lg shadow-md p-6 min-h-[300px]"> + <div className="bg-white rounded-lg shadow-md p-6 min-h-[300px]"> + </div> - </div> + <div className="bg-white rounded-lg shadow-md p-6 min-h-[300px]"> + <TasksStatPercent /> + </div> + </div> + </div> - <div className="bg-white rounded-lg shadow-md p-6 min-h-[300px]"> - <TasksStatPercent/> - </div> - </div> - </div> - </div> - ); + <Modal isOpen={isModalOpen} closeModal={closeModal} saveTask={saveTask} /> + </div> + ); }; export default Home; diff --git a/src/pages/Todolist.jsx b/src/pages/Todolist.jsx index 343f0201df39cf4879c173d0f4b5d8860a3cdfbb..1a648e75ca731d5f9830e9ac092bada9106b6082 100644 --- a/src/pages/Todolist.jsx +++ b/src/pages/Todolist.jsx @@ -7,8 +7,13 @@ import { useTasks } from "@context/TasksContext"; export default function Todolist() { const { tasks, setTasks } = useTasks() const saveTask = (task) => { - setTasks([...tasks, task]) - } + const newTask = { + ...task, + dueDate: task.dueDate || new Date().toISOString().split("T")[0], + }; + setTasks([...tasks, newTask]); + }; + const [isModalOpen, setIsModalOpen] = useState(false); const openModal = () => setIsModalOpen(true);