diff --git a/src/pages/EventDetail/EventDetailPage.jsx b/src/pages/EventDetail/EventDetailPage.jsx deleted file mode 100644 index ee31c39..0000000 --- a/src/pages/EventDetail/EventDetailPage.jsx +++ /dev/null @@ -1,55 +0,0 @@ -import {useEffect, useContext} from "react"; -import styles from "./EventDetailPage.module.css"; -import {useParams} from "react-router"; -import {formatDateLetter} from "../../utils/date/formatDateLetter.js"; -import EventTask from "./components/EventTask/EventTask.jsx"; -import {AuthContext} from "../../contexts/Auth/AuthContext.js"; -import {EventDetailContext} from "../../contexts/EventDetail/EventDetailContext.js"; -import CreateTaskBtn from "./components/CreateTaskBtn/CreateTaskBtn.jsx"; -import DeleteEventBtn from "./components/DeleteEventBtn/DeleteEventBtn.jsx"; - - -function EventDetailPage() { - - const params = useParams(); - const id = params.id; - const {user} = useContext(AuthContext) - const {tasks, updateEventInfo, eventInfo} = useContext(EventDetailContext) - - useEffect(() => { - updateEventInfo(id); - }, []) - - - return ( -
-
-
- Illustration événement -
-

{eventInfo?.name}

-
-
-

{eventInfo && formatDateLetter(eventInfo.start)}

-

{eventInfo?.description}

-
- {user?.isAdmin &&
- - -
} -
-
-
- -

Tâches

-
- {tasks?.map((task, index) => ( - - ))} -
-
-
- ); -} - -export default EventDetailPage; \ No newline at end of file diff --git a/src/pages/EventDetail/EventDetailPage.tsx b/src/pages/EventDetail/EventDetailPage.tsx new file mode 100644 index 0000000..9c76e8e --- /dev/null +++ b/src/pages/EventDetail/EventDetailPage.tsx @@ -0,0 +1,65 @@ +import { useEffect, useContext } from "react"; +import styles from "./EventDetailPage.module.css"; +import { useParams } from "react-router"; +import { formatDateLetter } from "../../utils/date/formatDateLetter"; +import EventTask from "./components/EventTask/EventTask"; +import { AuthContext } from "../../contexts/Auth/AuthContext"; +import { EventDetailContext } from "../../contexts/EventDetail/EventDetailContext"; +import CreateTaskBtn from "./components/CreateTaskBtn/CreateTaskBtn"; +import DeleteEventBtn from "./components/DeleteEventBtn/DeleteEventBtn"; + +function EventDetailPage() { + const params = useParams(); + const id = params.id as string; + + const { user } = useContext(AuthContext) as any; + const { tasks, updateEventInfo, eventInfo } = useContext(EventDetailContext) as any; + + useEffect(() => { + if (id) { + updateEventInfo(id); + } + }, []); + + return ( +
+
+
+ Illustration événement + +
+

{eventInfo?.name}

+ +
+
+

{eventInfo && formatDateLetter(eventInfo.start)}

+

{eventInfo?.description}

+
+ + {user?.isAdmin && ( +
+ + +
+ )} +
+
+
+ +

Tâches

+ +
+ {tasks?.map((task: any, index: number) => ( + + ))} +
+
+
+ ); +} + +export default EventDetailPage; \ No newline at end of file diff --git a/src/pages/EventDetail/components/CreateTaskBtn/CreateTaskBtn.jsx b/src/pages/EventDetail/components/CreateTaskBtn/CreateTaskBtn.jsx deleted file mode 100644 index 4a0f47b..0000000 --- a/src/pages/EventDetail/components/CreateTaskBtn/CreateTaskBtn.jsx +++ /dev/null @@ -1,116 +0,0 @@ -import styles from "../../EventDetailPage.module.css"; -import Button from "../../../../components/ui/Button/Button"; -import {useContext, useState} from "react"; -import TextInput from "../../../../components/ui/Input/Input"; -import Modal from "../../../../components/ui/Modal/Modal"; -import createTaskApi from "../../../../utils/tasks/createTask.js"; -import {EventDetailContext} from "../../../../contexts/EventDetail/EventDetailContext.js"; - -export default function CreateTaskBtn({ id }) { - - const [openTaskModal, setOpenTaskModal] = useState(false); - - const [taskName, setTaskName] = useState(""); - const [taskDescription, setTaskDescription] = useState(""); - const [taskLocation, setTaskLocation] = useState(""); - const [maxParticipants, setMaxParticipants] = useState(""); - const [startTime, setStartTime] = useState(""); - const [endTime, setEndTime] = useState(""); - - const { updateEventInfo } = useContext(EventDetailContext) - - const createTask = async () => { - const data = await createTaskApi({ - eventId: id, - name: taskName, - description: taskDescription, - start: startTime, - end: endTime, - location: taskLocation, - maxParticipants, - }); - - if (data?.status === 200) { - setOpenTaskModal(false); - setTaskName(""); - setTaskDescription(""); - setTaskLocation(""); - setMaxParticipants(""); - setStartTime(""); - setEndTime(""); - - updateEventInfo(id) - } else { - console.log("⚠️ Échec de la création de la task"); - } - }; - - return <> - - - - setOpenTaskModal(false)} title={"Créer tâche"}> -
- -
-

Nom de la tâche

- setTaskName(e.target.value)} - placeholder="Nom de la tâche" - /> -
- -
-

Description

- setTaskDescription(e.target.value)} - placeholder="Description de la tâche" - /> -
- -
-

Lieu

- setTaskLocation(e.target.value)} - placeholder="Lieu" - /> -
- -
-

Nombre maximum de participants

- setMaxParticipants(e.target.value)} - placeholder="Participants max" - /> -
- -
-

Heure de début

- setStartTime(e.target.value)} - /> -
- -
-

Heure de fin

- setEndTime(e.target.value)} - /> -
- - - -
-
- - -} \ No newline at end of file diff --git a/src/pages/EventDetail/components/CreateTaskBtn/CreateTaskBtn.tsx b/src/pages/EventDetail/components/CreateTaskBtn/CreateTaskBtn.tsx new file mode 100644 index 0000000..9b228c3 --- /dev/null +++ b/src/pages/EventDetail/components/CreateTaskBtn/CreateTaskBtn.tsx @@ -0,0 +1,129 @@ +import styles from "../../EventDetailPage.module.css"; +import Button from "../../../../components/ui/Button/Button"; +import { useContext, useState } from "react"; +import TextInput from "../../../../components/ui/Input/Input"; +import Modal from "../../../../components/ui/Modal/Modal"; +import createTaskApi from "../../../../utils/tasks/createTask"; +import { EventDetailContext } from "../../../../contexts/EventDetail/EventDetailContext"; + +type CreateTaskBtnProps = { + id: string | number; +}; + +export default function CreateTaskBtn({ id }: CreateTaskBtnProps) { + const [openTaskModal, setOpenTaskModal] = useState(false); + + const [taskName, setTaskName] = useState(""); + const [taskDescription, setTaskDescription] = useState(""); + const [taskLocation, setTaskLocation] = useState(""); + const [maxParticipants, setMaxParticipants] = useState(""); + const [startTime, setStartTime] = useState(""); + const [endTime, setEndTime] = useState(""); + + const { updateEventInfo } = useContext(EventDetailContext) as any; + + const createTask = async () => { + const data = await createTaskApi({ + eventId: id, + name: taskName, + description: taskDescription, + start: startTime, + end: endTime, + location: taskLocation, + maxParticipants, + }); + + if (data?.status === 200) { + setOpenTaskModal(false); + setTaskName(""); + setTaskDescription(""); + setTaskLocation(""); + setMaxParticipants(""); + setStartTime(""); + setEndTime(""); + + updateEventInfo(id); + } else { + console.log("⚠️ Échec de la création de la task"); + } + }; + + return ( + <> + + + setOpenTaskModal(false)} + title={"Créer tâche"} + > +
+
+

Nom de la tâche

+ setTaskName(e.target.value)} + placeholder="Nom de la tâche" + /> +
+ +
+

Description

+ setTaskDescription(e.target.value)} + placeholder="Description de la tâche" + /> +
+ +
+

Lieu

+ setTaskLocation(e.target.value)} + placeholder="Lieu" + /> +
+ +
+

Nombre maximum de participants

+ setMaxParticipants(e.target.value)} + placeholder="Participants max" + /> +
+ +
+

Heure de début

+ setStartTime(e.target.value)} + /> +
+ +
+

Heure de fin

+ setEndTime(e.target.value)} + /> +
+ + +
+
+ + ); +} \ No newline at end of file diff --git a/src/pages/EventDetail/components/DeleteEventBtn/DeleteEventBtn.jsx b/src/pages/EventDetail/components/DeleteEventBtn/DeleteEventBtn.jsx deleted file mode 100644 index 5309450..0000000 --- a/src/pages/EventDetail/components/DeleteEventBtn/DeleteEventBtn.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import styles from "../../EventDetailPage.module.css"; -import Button from "../../../../components/ui/Button/Button"; -import Modal from "../../../../components/ui/Modal/Modal"; -import { useContext, useState } from "react"; -import { EventDetailContext } from "../../../../contexts/EventDetail/EventDetailContext.js"; -import { EventContext } from "../../../../contexts/Events/EventContext.js"; -import { useNavigate } from "react-router"; - -export default function DeleteEventBtn({ id }) { - - const { eventInfo } = useContext(EventDetailContext) - const { removeEvent } = useContext(EventContext) - const [open, setOpen] = useState(false); - const navigate = useNavigate(); - - const handleDelete = () => { - setOpen(true); - } - - const delEvent = async () => { - const result = await removeEvent(id); - - if (result.status === 200 || result.status === 204) { - setOpen(false); - navigate("/events"); - } - } - - return <> - - - - setOpen(false)} title={"Suppression"}> -
-

Etes-vous sur de vouloir supprimer l'événement {eventInfo?.name} ?

- - -
-
- - -} \ No newline at end of file diff --git a/src/pages/EventDetail/components/DeleteEventBtn/DeleteEventBtn.tsx b/src/pages/EventDetail/components/DeleteEventBtn/DeleteEventBtn.tsx new file mode 100644 index 0000000..9a79467 --- /dev/null +++ b/src/pages/EventDetail/components/DeleteEventBtn/DeleteEventBtn.tsx @@ -0,0 +1,56 @@ +import styles from "../../EventDetailPage.module.css"; +import Button from "../../../../components/ui/Button/Button"; +import Modal from "../../../../components/ui/Modal/Modal"; +import { useContext, useState } from "react"; +import { EventDetailContext } from "../../../../contexts/EventDetail/EventDetailContext"; +import { EventContext } from "../../../../contexts/Events/EventContext"; +import { useNavigate } from "react-router"; + +type DeleteEventBtnProps = { + id: string | number; +}; + +export default function DeleteEventBtn({ id }: DeleteEventBtnProps) { + const { eventInfo } = useContext(EventDetailContext) as any; + const { removeEvent } = useContext(EventContext) as any; + + const [open, setOpen] = useState(false); + const navigate = useNavigate(); + + const handleDelete = () => { + setOpen(true); + }; + + const delEvent = async () => { + const result = await removeEvent(id); + + if (result.status === 200 || result.status === 204) { + setOpen(false); + navigate("/events"); + } + }; + + return ( + <> + + + setOpen(false)} title={"Suppression"}> +
+

+ Etes-vous sur de vouloir supprimer l'événement {eventInfo?.name} ? +

+ + +
+
+ + ); +} \ No newline at end of file diff --git a/src/pages/EventDetail/components/DeleteTaskBtn/DeleteTaskBtn.jsx b/src/pages/EventDetail/components/DeleteTaskBtn/DeleteTaskBtn.jsx deleted file mode 100644 index af6e3d0..0000000 --- a/src/pages/EventDetail/components/DeleteTaskBtn/DeleteTaskBtn.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import { useContext } from "react"; -import { AuthContext } from "../../../../contexts/Auth/AuthContext.js"; -import { EventDetailContext } from "../../../../contexts/EventDetail/EventDetailContext.js"; -import Button from "../../../../components/ui/Button/Button"; -import { useState } from "react"; -import Modal from "../../../../components/ui/Modal/Modal"; -import styles from "../../EventDetailPage.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 <> - - - -
-

Etes-vous sur de vouloir supprimer la tâche {taskName} ?

- -
-
- -} \ No newline at end of file diff --git a/src/pages/EventDetail/components/DeleteTaskBtn/DeleteTaskBtn.tsx b/src/pages/EventDetail/components/DeleteTaskBtn/DeleteTaskBtn.tsx new file mode 100644 index 0000000..6c16221 --- /dev/null +++ b/src/pages/EventDetail/components/DeleteTaskBtn/DeleteTaskBtn.tsx @@ -0,0 +1,48 @@ +import { useContext, useState } from "react"; +import { AuthContext } from "../../../../contexts/Auth/AuthContext"; +import { EventDetailContext } from "../../../../contexts/EventDetail/EventDetailContext"; +import Button from "../../../../components/ui/Button/Button"; +import Modal from "../../../../components/ui/Modal/Modal"; +import styles from "../../EventDetailPage.module.css"; + +type DeleteTaskBtnProps = { + taskId: string | number; + eventId: string | number; + taskName: string; +}; + +export default function DeleteTaskBtn({ taskId, eventId, taskName }: DeleteTaskBtnProps) { + + const { user } = useContext(AuthContext) as any; + const { deleteTask } = useContext(EventDetailContext) as any; + + const [openModal, setOpenModal] = useState(false); + + if (!user?.isAdmin) return null; + + return ( + <> + + + setOpenModal(false)} title={"Suppression"}> +
+

+ Etes-vous sur de vouloir supprimer la tâche {taskName} ? +

+ + +
+
+ + ); +} \ No newline at end of file diff --git a/src/pages/EventDetail/components/EventTask/EventTask.jsx b/src/pages/EventDetail/components/EventTask/EventTask.jsx deleted file mode 100644 index 41e6429..0000000 --- a/src/pages/EventDetail/components/EventTask/EventTask.jsx +++ /dev/null @@ -1,98 +0,0 @@ -import styles from "./EventTask.module.css"; -import { formatDateLetter } from "../../../../utils/date/formatDateLetter.js"; -import Button from "../../../../components/ui/Button/Button"; -import assign from "../../../../utils/tasks/assign.js"; -import unAssign from "../../../../utils/tasks/unAssign.js"; -import { useContext, useEffect, useState } from "react"; -import isAssigned from "../../../../utils/tasks/isAssigned.js"; -import Modal from "../../../../components/ui/Modal/Modal"; -import { AuthContext } from "../../../../contexts/Auth/AuthContext.js"; -import DeleteTaskBtn from "../DeleteTaskBtn/DeleteTaskBtn.jsx"; - -export default function EventTask({ task, index, eventId }) { - - const { update } = useContext(AuthContext) - - const [assigned, setAssigned] = useState(false); - const [open, setOpen] = useState(false); - const [title, setTitle] = useState(""); - const [message, setMessage] = useState(""); - - async function checkAssign() { - const data = await isAssigned(task.id); - setAssigned(data?.data.assigned); - } - - useEffect(() => { - checkAssign(); - }, []) - - - const handleRegisterBtn = async () => { - const res = await assign(task.id); - - switch (res.status) { - case 200: - update() - setTitle("Inscription réussie") - setMessage(`Vous êtes maintenant inscrit à la tâche ${task.name}`); - setOpen(true); - setAssigned(true); - break; - - case 409: - setTitle("Erreur lors de l'inscription") - setMessage("Vous êtes déjà inscrit à cette tâche") - setOpen(true); - break; - - case 403: - setTitle("Erreur lors de l'inscription") - setMessage("Le nombre maximum d'inscription pour cette tâche à été atteint") - setOpen(true); - break; - } - }; - - const handleUnassign = async () => { - const res = await unAssign(task.id); - - switch (res.status) { - case 200: - update() - setTitle("Désinscription réussie") - setMessage(`Vous n'êtes plus inscrit à la tâche ${task.name}`); - setOpen(true); - setAssigned(false); - break; - - case 409: - setTitle("Erreur lors de la désinscription") - setMessage(`Vous n'êtes pas inscrit à cette tâche`); - setOpen(true); - break; - } - }; - - return
-
-
- {task.name} -

{formatDateLetter(task.start)} - {formatDateLetter(task.end)}

-

{task.description}

-
-
- {assigned ? - - : - - } - -
-
- - -

{message}

-
-
-} \ No newline at end of file diff --git a/src/pages/EventDetail/components/EventTask/EventTask.tsx b/src/pages/EventDetail/components/EventTask/EventTask.tsx new file mode 100644 index 0000000..bebc62d --- /dev/null +++ b/src/pages/EventDetail/components/EventTask/EventTask.tsx @@ -0,0 +1,119 @@ +import styles from "./EventTask.module.css"; +import { formatDateLetter } from "../../../../utils/date/formatDateLetter"; +import Button from "../../../../components/ui/Button/Button"; +import assign from "../../../../utils/tasks/assign"; +import unAssign from "../../../../utils/tasks/unAssign"; +import { useContext, useEffect, useState } from "react"; +import isAssigned from "../../../../utils/tasks/isAssigned"; +import Modal from "../../../../components/ui/Modal/Modal"; +import { AuthContext } from "../../../../contexts/Auth/AuthContext"; +import DeleteTaskBtn from "../DeleteTaskBtn/DeleteTaskBtn"; + +type EventTaskProps = { + task: any; + index: number; + eventId: string | number; +}; + +export default function EventTask({ task, index, eventId }: EventTaskProps) { + + const { update } = useContext(AuthContext) as any; + + const [assigned, setAssigned] = useState(false); + const [open, setOpen] = useState(false); + const [title, setTitle] = useState(""); + const [message, setMessage] = useState(""); + + async function checkAssign() { + const data = await isAssigned(task.id); + setAssigned(data?.data.assigned); + } + + useEffect(() => { + checkAssign(); + }, []); + + const handleRegisterBtn = async () => { + const res = await assign(task.id); + + switch (res.status) { + case 200: + update(); + setTitle("Inscription réussie"); + setMessage(`Vous êtes maintenant inscrit à la tâche ${task.name}`); + setOpen(true); + setAssigned(true); + break; + + case 409: + setTitle("Erreur lors de l'inscription"); + setMessage("Vous êtes déjà inscrit à cette tâche"); + setOpen(true); + break; + + case 403: + setTitle("Erreur lors de l'inscription"); + setMessage("Le nombre maximum d'inscription pour cette tâche à été atteint"); + setOpen(true); + break; + } + }; + + const handleUnassign = async () => { + const res = await unAssign(task.id); + + switch (res.status) { + case 200: + update(); + setTitle("Désinscription réussie"); + setMessage(`Vous n'êtes plus inscrit à la tâche ${task.name}`); + setOpen(true); + setAssigned(false); + break; + + case 409: + setTitle("Erreur lors de la désinscription"); + setMessage(`Vous n'êtes pas inscrit à cette tâche`); + setOpen(true); + break; + } + }; + + return ( +
+
+
+ + {task.name} + +

+ {formatDateLetter(task.start)} - {formatDateLetter(task.end)} +

+

{task.description}

+
+ +
+ {assigned ? ( + + ) : ( + + )} + + +
+
+ + setOpen(false)} title={title}> +

{message}

+
+
+ ); +} \ No newline at end of file diff --git a/src/router.js b/src/router.js index 75d0bd6..11c3bb8 100644 --- a/src/router.js +++ b/src/router.js @@ -9,7 +9,7 @@ import EventsPage from "./pages/Events/EventsPage.jsx"; import AdminPage from "./pages/Admin/AdminPage.jsx"; import WaitValidationPage from "./pages/WaitValidation/WaitValidationPage.jsx"; import PageNotFoundPage from "./pages/PageNotFound/PageNotFoundPage.jsx"; -import eventDetail from "./pages/EventDetail/EventDetailPage.jsx"; +import eventDetail from "./pages/EventDetail/EventDetailPage.tsx"; import legalNotices from "./pages/LegalNotices/LegalNoticesPage.jsx"; import RGPDPage from "./pages/RGPD/RGPDPage.jsx";