From 5df1b3f94571a2fb905c6948db70400470874593 Mon Sep 17 00:00:00 2001
From: Anas OUKASSOU <anas.oukassou@etu.univ-amu.fr>
Date: Mon, 10 Mar 2025 14:51:01 +0100
Subject: [PATCH] Refactor Modal

---
 src/components/todolist/Modal.jsx | 141 ++++++++++++++++--------------
 src/pages/Todolist.jsx            |  12 ++-
 2 files changed, 86 insertions(+), 67 deletions(-)

diff --git a/src/components/todolist/Modal.jsx b/src/components/todolist/Modal.jsx
index ef53a57..6eb49fe 100644
--- a/src/components/todolist/Modal.jsx
+++ b/src/components/todolist/Modal.jsx
@@ -2,79 +2,88 @@ import { useState } from "react";
 import DatePicker from "react-datepicker";
 import "react-datepicker/dist/react-datepicker.css";
 
-export default function Modal({ isOpen, closeModal, saveTask }) {
+export default function Modal({task, isOpen, closeModal, saveTask }) {
     if (!isOpen) return null;
 
-    const [taskName, setTaskName] = useState("");
-    const [dueDate, setDueDate] = useState(new Date());
+    const [editedTask, setEditedTask] = useState({...task});
 
-    const createTask = () => {
-        return {
-            id: crypto.randomUUID(),
-            name: taskName,
-            isCompleted: false,
-            dueDate: dueDate
-        }
-    }
-
-    const handleSaveTask = () => {
-        const task = createTask()
-        saveTask(task)
+    const handleSave = () => {
+        saveTask(editedTask)
         closeModal()
     }
 
-    const handleInputChange = (e) => {
-        setTaskName(e.target.value);
-      };
-
-  return (
-    <div
-  className="absolute top-0 left-0 right-0 bottom-0 flex justify-center items-center z-50"
-  style={{ pointerEvents: 'none' }}
->
-  <div
-    className="absolute inset-0 bg-gray-500 bg-opacity-50"
-    style={{ pointerEvents: 'none' }}
-  ></div>
+    const handleChange = (e) => {
+      const { name, value, type, checked } = e.target;
+      setEditedTask({
+        ...editedTask,
+        [name]: type === 'checkbox' ? checked : value
+      });
+    };
 
-  <div
-    className="relative bg-white p-6 rounded-lg shadow-lg w-1/3 z-10"
-    style={{ pointerEvents: 'auto' }}
-  >
-    <h2 className="text-xl mb-4">Add a New Task</h2>
-    <p className="mb-4">Enter the task details below:</p>
 
-    <input
-      type="text"
-      className="w-full p-2 mb-4 border border-gray-300 rounded-md"
-      placeholder="Task Name"
-      value={taskName}
-      onChange={handleInputChange}
-    />
-
-    <div>
-    <DatePicker
-      showIcon
-      selected={dueDate}
-      onChange={(date) => setDueDate(date)}
-    />
-    </div>
-
-    <div className="flex justify-between">
-      <button
-        onClick={closeModal}
-        className="px-4 py-2 bg-red-500 text-white rounded-md"
-      >
-        Close
-      </button>
-      <button
-        className="px-4 py-2 bg-blue-500 text-white rounded-md"
-        onClick={handleSaveTask}
-      >
-        Save Task
-      </button>
-    </div>
-  </div>
-</div>
+  return (
+    <div className="fixed inset-0 bg-black bg-opacity-25 flex items-center justify-center z-50">
+          <div 
+            className="bg-white rounded-lg shadow-xl p-6 w-full max-w-md mx-4"
+          >
+            <div className="flex justify-between items-center mb-4">
+              <h3 className="text-lg font-medium">Edit Task</h3>
+              <button 
+                onClick={closeModal}
+                className="text-gray-400 hover:text-gray-500"
+              >
+                <svg className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
+                  <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
+                </svg>
+              </button>
+            </div>
+            
+            <div className="space-y-4">
+              <div>
+                <label htmlFor="name" className="block text-sm font-medium text-gray-700 mb-1">
+                  Task Name
+                </label>
+                <input
+                  id="name"
+                  name="name"
+                  className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-indigo-500 focus:border-indigo-500"
+                  value={editedTask.name}
+                  onChange={handleChange}
+                />
+              </div>
+              
+              <div>
+                <label htmlFor="dueDate" className="block text-sm font-medium text-gray-700 mb-1">
+                  Due Date
+                </label>
+                <input
+                  id="dueDate"
+                  name="dueDate"
+                  type="date"
+                  className="w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-1 focus:ring-indigo-500 focus:border-indigo-500"
+                  value={editedTask.dueDate}
+                  onChange={handleChange}
+                />
+              </div>
+            </div>
+            
+            <div className="mt-6 flex justify-end space-x-3">
+              <button
+                type="button"
+                className="px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
+                onClick={closeModal}
+              >
+                Cancel
+              </button>
+              <button
+                type="button"
+                className="px-4 py-2 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500"
+                onClick={handleSave}
+              >
+                Save
+              </button>
+            </div>
+          </div>
+        </div>
   );
 }
\ No newline at end of file
diff --git a/src/pages/Todolist.jsx b/src/pages/Todolist.jsx
index 1a648e7..b74fb81 100644
--- a/src/pages/Todolist.jsx
+++ b/src/pages/Todolist.jsx
@@ -6,6 +6,16 @@ import { useTasks } from "@context/TasksContext";
 
 export default function Todolist() {
     const { tasks, setTasks } = useTasks()
+
+    const newTask = () => {
+        return {
+            id: crypto.randomUUID(),
+            name: "",
+            isCompleted: false,
+            dueDate: ""
+        }
+    }
+
     const saveTask = (task) => {
         const newTask = {
             ...task,
@@ -36,7 +46,7 @@ export default function Todolist() {
         </div>
       </div>
 
-      <Modal isOpen={isModalOpen} closeModal={closeModal} saveTask={saveTask}/>
+      <Modal task={newTask()} isOpen={isModalOpen} closeModal={closeModal} saveTask={saveTask}/>
     </div>
     )
 }
\ No newline at end of file
-- 
GitLab