DeleteTask feature
This commit is contained in:
1 parent
56964285b9
commit
6336627ef5
6 files changed
+95
-9
No files matched your search
@@ -1,20 +1,27 @@
|
|||||||
import {useState} from 'react';
|
import {useState} from 'react';
|
||||||
import { EventDetailContext } from "./eventDetail.js"
|
import { EventDetailContext } from "./eventDetail.js"
|
||||||
import getEventById from "../../utils/events/getEventById.js";
|
import getEventById from "../../utils/events/getEventById.js";
|
||||||
|
import deleteTaskFunction from "../../utils/tasks/deleteTask.js";
|
||||||
|
|
||||||
export function EventDetailProvider({ children }) {
|
export function EventDetailProvider({ children }) {
|
||||||
|
|
||||||
const [tasks, setTasks] = useState([]);
|
const [tasks, setTasks] = useState([]);
|
||||||
const [eventInfo, setEventInfo] = useState([]);
|
const [eventInfo, setEventInfo] = useState([]);
|
||||||
|
|
||||||
|
|
||||||
const updateEventInfo = async (id) => {
|
const updateEventInfo = async (id) => {
|
||||||
const e = await getEventById(id);
|
const e = await getEventById(id);
|
||||||
setEventInfo(e);
|
setEventInfo(e);
|
||||||
setTasks(e.tasks)
|
setTasks(e.tasks)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const deleteTask = async (id, eventId) => {
|
||||||
|
await deleteTaskFunction(id);
|
||||||
|
await updateEventInfo(eventId);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<EventDetailContext.Provider value={{ tasks, eventInfo, updateEventInfo }}>
|
<EventDetailContext.Provider value={{ tasks, eventInfo, updateEventInfo, deleteTask }}>
|
||||||
{children}
|
{children}
|
||||||
</EventDetailContext.Provider>
|
</EventDetailContext.Provider>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -3,11 +3,15 @@ import { formatDateLetter } from "../../../../utils/date/formatDateLetter.js";
|
|||||||
import Button from "../../../../components/ui/button/button.jsx";
|
import Button from "../../../../components/ui/button/button.jsx";
|
||||||
import assign from "../../../../utils/tasks/assign.js";
|
import assign from "../../../../utils/tasks/assign.js";
|
||||||
import unAssign from "../../../../utils/tasks/unAssign.js";
|
import unAssign from "../../../../utils/tasks/unAssign.js";
|
||||||
import { useEffect, useState } from "react";
|
import { useContext, useEffect, useState } from "react";
|
||||||
import isAssigned from "../../../../utils/tasks/isAssigned.js";
|
import isAssigned from "../../../../utils/tasks/isAssigned.js";
|
||||||
import Modal from "../../../../components/ui/modal/modal.jsx";
|
import Modal from "../../../../components/ui/modal/modal.jsx";
|
||||||
|
import { AuthContext } from "../../../../contexts/auth/AuthContext.js";
|
||||||
|
import DeleteTaskBtn from "../deleteTaskBtn/deleteTaskBtn.jsx";
|
||||||
|
|
||||||
export default function EventTask({ task, index }) {
|
export default function EventTask({ task, index, eventId }) {
|
||||||
|
|
||||||
|
const { user } = useContext(AuthContext)
|
||||||
|
|
||||||
const [assigned, setAssigned] = useState(false);
|
const [assigned, setAssigned] = useState(false);
|
||||||
const [open, setOpen] = useState(false);
|
const [open, setOpen] = useState(false);
|
||||||
@@ -23,6 +27,7 @@ export default function EventTask({ task, index }) {
|
|||||||
checkAssign();
|
checkAssign();
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
|
|
||||||
const handleRegisterBtn = async () => {
|
const handleRegisterBtn = async () => {
|
||||||
const res = await assign(task.id);
|
const res = await assign(task.id);
|
||||||
|
|
||||||
@@ -74,11 +79,14 @@ export default function EventTask({ task, index }) {
|
|||||||
<p className={styles.taskDate}> {formatDateLetter(task.start)} - {formatDateLetter(task.end)} </p>
|
<p className={styles.taskDate}> {formatDateLetter(task.start)} - {formatDateLetter(task.end)} </p>
|
||||||
<p>{task.description}</p>
|
<p>{task.description}</p>
|
||||||
</div>
|
</div>
|
||||||
{assigned ?
|
<div className={styles.manageTaskBtn}>
|
||||||
<Button variant={"danger"} onClick={() => handleUnassign()}> Se désinscrire </Button>
|
{assigned ?
|
||||||
:
|
<Button variant={"danger"} onClick={() => handleUnassign()}> Se désinscrire </Button>
|
||||||
<Button onClick={() => handleRegisterBtn()}> S’inscrire </Button>
|
:
|
||||||
}
|
<Button onClick={() => handleRegisterBtn()}> S’inscrire </Button>
|
||||||
|
}
|
||||||
|
<DeleteTaskBtn eventId={eventId} taskId={task.id} taskName={task.name} />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Modal open={open} onClose={setOpen} title={title}>
|
<Modal open={open} onClose={setOpen} title={title}>
|
||||||
|
|||||||
@@ -9,6 +9,12 @@
|
|||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.manageTaskBtn {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
.content {
|
.content {
|
||||||
margin: 16px 0px 16px 0px;
|
margin: 16px 0px 16px 0px;
|
||||||
padding: 10px 20px 10px 20px;
|
padding: 10px 20px 10px 20px;
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
import { useContext } from "react";
|
||||||
|
import { AuthContext } from "../../../../contexts/auth/AuthContext.js";
|
||||||
|
import { EventDetailContext } from "../../../../contexts/eventDetail/eventDetail.js";
|
||||||
|
import Button from "../../../../components/ui/button/button.jsx";
|
||||||
|
import { useState } from "react";
|
||||||
|
import Modal from "../../../../components/ui/modal/modal.jsx";
|
||||||
|
import styles from "../../eventDetail.module.css";
|
||||||
|
|
||||||
|
export default function DeleteTaskBtn({ taskId, eventId, taskName }) {
|
||||||
|
|
||||||
|
const { user } = useContext(AuthContext)
|
||||||
|
const { deleteTask } = useContext(EventDetailContext)
|
||||||
|
|
||||||
|
const [openModal, setOpenModal] = useState(false);
|
||||||
|
|
||||||
|
if(!user?.isAdmin) return null;
|
||||||
|
|
||||||
|
return <>
|
||||||
|
<Button variant={"danger"} onClick={() => setOpenModal(true)}> Supprimer </Button>
|
||||||
|
|
||||||
|
<Modal open={openModal} onClose={setOpenModal} title={"Suppression"}>
|
||||||
|
<div className={styles.modalContent}>
|
||||||
|
<p className={styles.modalContent}>Etes-vous sur de vouloir supprimer la tâche {taskName} ? </p>
|
||||||
|
<Button variant={"danger"} onClick={() => deleteTask(taskId, eventId)}> Confirmer </Button>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
</>
|
||||||
|
}
|
||||||
@@ -44,7 +44,7 @@ function EventDetail() {
|
|||||||
<h2>Tâches</h2>
|
<h2>Tâches</h2>
|
||||||
<div className={styles.tasks}>
|
<div className={styles.tasks}>
|
||||||
{tasks?.map((task, index) => (
|
{tasks?.map((task, index) => (
|
||||||
<EventTask task={task} key={index}/>
|
<EventTask task={task} key={index} eventId={id} />
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import getXSRFToken from "../getXSRF.js";
|
||||||
|
|
||||||
|
export default async function deleteTask(taskId) {
|
||||||
|
const csrfToken = await getXSRFToken();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(
|
||||||
|
`${import.meta.env.VITE_API_URL}/api/events/tasks/${taskId}`,
|
||||||
|
{
|
||||||
|
method: 'DELETE',
|
||||||
|
credentials: 'include',
|
||||||
|
headers: {
|
||||||
|
'Accept': 'application/json',
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'X-XSRF-TOKEN': csrfToken,
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
task_id: taskId
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const data = await res.json();
|
||||||
|
|
||||||
|
return {
|
||||||
|
status: res.status,
|
||||||
|
message: data?.message ?? null,
|
||||||
|
};
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
console.error("❌ Erreur réseau :", err);
|
||||||
|
return {
|
||||||
|
status: 0,
|
||||||
|
message: "Network error",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user