diff --git a/src/contexts/eventDetail/eventDetail.js b/src/contexts/eventDetail/eventDetail.js new file mode 100644 index 0000000..e59c12b --- /dev/null +++ b/src/contexts/eventDetail/eventDetail.js @@ -0,0 +1,3 @@ +import { createContext } from "react"; + +export const EventDetailContext = createContext(null); \ No newline at end of file diff --git a/src/contexts/eventDetail/eventDetailProvider.jsx b/src/contexts/eventDetail/eventDetailProvider.jsx new file mode 100644 index 0000000..92117d3 --- /dev/null +++ b/src/contexts/eventDetail/eventDetailProvider.jsx @@ -0,0 +1,21 @@ +import {useState} from 'react'; +import { EventDetailContext } from "./eventDetail.js" +import getEventById from "../../utils/events/getEventById.js"; + +export function EventDetailProvider({ children }) { + + const [tasks, setTasks] = useState([]); + const [eventInfo, setEventInfo] = useState([]); + + const updateEventInfo = async (id) => { + const e = await getEventById(id); + setEventInfo(e); + setTasks(e.tasks) + } + + return ( + + {children} + + ); +} \ No newline at end of file diff --git a/src/main.jsx b/src/main.jsx index 2653f1c..bd63d05 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -1,18 +1,21 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' +import {StrictMode} from 'react' +import {createRoot} from 'react-dom/client' import './index.css' -import { RouterProvider } from "react-router"; +import {RouterProvider} from "react-router"; import router from './router'; -import { AuthProvider } from "./contexts/auth/authProvider.jsx"; +import {AuthProvider} from "./contexts/auth/authProvider.jsx"; import {EventProvider} from "./contexts/events/EventProvider.jsx"; +import {EventDetailProvider} from "./contexts/eventDetail/eventDetailProvider.jsx"; createRoot(document.getElementById('root')).render( - + - + + + - , + , ) diff --git a/src/pages/eventDetail/components/createTaskBtn/createTaskBtn.jsx b/src/pages/eventDetail/components/createTaskBtn/createTaskBtn.jsx new file mode 100644 index 0000000..fb6fac5 --- /dev/null +++ b/src/pages/eventDetail/components/createTaskBtn/createTaskBtn.jsx @@ -0,0 +1,116 @@ +import styles from "../../eventDetail.module.css"; +import Button from "../../../../components/ui/button/button.jsx"; +import {useContext, useState} from "react"; +import TextInput from "../../../../components/ui/input/input.jsx"; +import Modal from "../../../../components/ui/modal/modal.jsx"; +import createTaskApi from "../../../../utils/tasks/createTask.js"; +import {EventDetailContext} from "../../../../contexts/eventDetail/eventDetail.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 success = await createTaskApi({ + eventId: id, + name: taskName, + description: taskDescription, + start: startTime, + end: endTime, + location: taskLocation, + maxParticipants, + }); + + if (success) { + 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 new file mode 100644 index 0000000..813a995 --- /dev/null +++ b/src/pages/eventDetail/components/deleteEventBtn/deleteEventBtn.jsx @@ -0,0 +1,42 @@ +import styles from "../../eventDetail.module.css"; +import Button from "../../../../components/ui/button/button.jsx"; +import Modal from "../../../../components/ui/modal/modal.jsx"; +import { useContext, useState } from "react"; +import { EventDetailContext } from "../../../../contexts/eventDetail/eventDetail.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/eventDetail.jsx b/src/pages/eventDetail/eventDetail.jsx index 18dd310..69e1b59 100644 --- a/src/pages/eventDetail/eventDetail.jsx +++ b/src/pages/eventDetail/eventDetail.jsx @@ -1,82 +1,25 @@ -import { useState, useEffect, useContext } from "react"; +import {useEffect, useContext} from "react"; import styles from "./eventDetail.module.css"; -import { useParams } from "react-router"; -import getEventById from "../../utils/events/getEventById.js"; -import { formatDateLetter } from "../../utils/date/formatDateLetter.js"; +import {useParams} from "react-router"; +import {formatDateLetter} from "../../utils/date/formatDateLetter.js"; import EventTask from "./components/EventTask/EventTask.jsx"; -import Button from "../../components/ui/button/button.jsx"; -import Modal from "../../components/ui/modal/modal.jsx"; -import { AuthContext } from "../../contexts/auth/AuthContext.js"; -import { EventContext } from "../../contexts/events/EventContext.js"; -import { useNavigate } from "react-router"; -import TextInput from "../../components/ui/input/input.jsx"; -import createTaskApi from "../../utils/tasks/createTask.js"; +import {AuthContext} from "../../contexts/auth/AuthContext.js"; +import {EventDetailContext} from "../../contexts/eventDetail/eventDetail.js"; +import CreateTaskBtn from "./components/createTaskBtn/createTaskBtn.jsx"; +import DeleteEventBtn from "./components/deleteEventBtn/deleteEventBtn.jsx"; function EventDetail() { const params = useParams(); const id = params.id; - const { user } = useContext(AuthContext) - const { removeEvent } = useContext(EventContext) - const navigate = useNavigate(); - - const [open, setOpen] = useState(false); - const [event, setEvent] = useState(null); - - 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 {user} = useContext(AuthContext) + const {tasks, updateEventInfo, eventInfo} = useContext(EventDetailContext) useEffect(() => { - (async () => { - const e = await getEventById(id); - setEvent(e); - }) () + updateEventInfo(id); }, []) - const handleDelete = () => { - setOpen(true); - } - - const delEvent = async () => { - const result = await removeEvent(id); - - if (result.status === 200 || result.status === 204) { - setOpen(false); - navigate("/events"); - } - } - - const createTask = async () => { - const success = await createTaskApi({ - eventId: id, - name: taskName, - description: taskDescription, - start: startTime, - end: endTime, - location: taskLocation, - maxParticipants, - }); - - if (success) { - setOpenTaskModal(false); - setTaskName(""); - setTaskDescription(""); - setTaskLocation(""); - setMaxParticipants(""); - setStartTime(""); - setEndTime(""); - } else { - console.log("⚠️ Échec de la création de la task"); - } - }; - return (
@@ -84,15 +27,15 @@ function EventDetail() {
Illustration événement
-

{event?.name}

+

{eventInfo?.name}

-

{event && formatDateLetter(event.start)}

-

{event?.description}

+

{eventInfo && formatDateLetter(eventInfo.start)}

+

{eventInfo?.description}

{user?.isAdmin &&
- - + +
}
@@ -100,83 +43,11 @@ function EventDetail() {

Tâches

- {event?.tasks?.map((task, index) => ( - + {tasks?.map((task, index) => ( + ))}
- - setOpen(false)} title={"Suppression"}> -
-

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

- - -
-
- - 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)} - /> -
- - - -
-
-
); }