From 6bce33e9deaf938a10c4d55e992d14d3fd257a0e Mon Sep 17 00:00:00 2001 From: Giovanni-Josserand Date: Wed, 1 Apr 2026 23:31:12 +0200 Subject: [PATCH] add eventPicture --- src/pages/EventDetail/EventDetailPage.tsx | 32 ++++++++++++++-- src/pages/Events/components/Event/Event.jsx | 16 +++++--- src/utils/events/uploadEventPhoto.ts | 41 +++++++++++++++++++++ 3 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 src/utils/events/uploadEventPhoto.ts diff --git a/src/pages/EventDetail/EventDetailPage.tsx b/src/pages/EventDetail/EventDetailPage.tsx index 7c3d37a..d227236 100644 --- a/src/pages/EventDetail/EventDetailPage.tsx +++ b/src/pages/EventDetail/EventDetailPage.tsx @@ -1,4 +1,4 @@ -import { useEffect, useContext } from "react"; +import {useEffect, useContext, useRef} from "react"; import styles from "./EventDetailPage.module.css"; import { useParams } from "react-router"; import { formatDateLetter } from "../../utils/date/formatDateLetter"; @@ -8,6 +8,7 @@ import { EventDetailContext } from "../../contexts/EventDetail/EventDetailContex import CreateTaskBtn from "./components/CreateTaskBtn/CreateTaskBtn"; import DeleteEventBtn from "./components/DeleteEventBtn/DeleteEventBtn"; import EditEventBtn from "./components/EditEventBtn/EditEventBtn"; +import uploadEventPhoto from "../../utils/events/uploadEventPhoto"; function EventDetailPage() { const params = useParams(); @@ -15,21 +16,46 @@ function EventDetailPage() { const { user } = useContext(AuthContext) as any; const { tasks, updateEventInfo, eventInfo } = useContext(EventDetailContext) as any; + const fileInputRef = useRef(null); + const imageUrl = eventInfo?.event_photo_path + ? `${import.meta.env.VITE_API_URL}/storage/${eventInfo.event_photo_path}` + : "/empty.png"; + console.log(eventInfo); useEffect(() => { if (id) { updateEventInfo(id); } }, []); + const handleImageClick = () => { + if (user?.isAdmin && fileInputRef.current) { + fileInputRef.current?.click(); + } + }; + const handleFileChange = async (e: any) => { + const file = e.target.files[0]; + if (!file) return; + + await uploadEventPhoto(Number(id), file); + updateEventInfo(id); + }; return (
Illustration événement +
diff --git a/src/pages/Events/components/Event/Event.jsx b/src/pages/Events/components/Event/Event.jsx index fe15c4e..94d70fc 100644 --- a/src/pages/Events/components/Event/Event.jsx +++ b/src/pages/Events/components/Event/Event.jsx @@ -8,16 +8,20 @@ function Event({event}){ const handleNavigate = () => navigate(`/events/` + event.id); + const imageUrl = event.event_photo_path + ? `${import.meta.env.VITE_API_URL}/storage/${event.event_photo_path}` + : "/empty.png"; + console.log(imageUrl); return (
-
- {event.image == null ? ( - Pas de photo de l'événement - ) : ( - Photo de l'événement - )} +
+ Photo de l'événement

{event.name}

diff --git a/src/utils/events/uploadEventPhoto.ts b/src/utils/events/uploadEventPhoto.ts new file mode 100644 index 0000000..0258668 --- /dev/null +++ b/src/utils/events/uploadEventPhoto.ts @@ -0,0 +1,41 @@ +import getXSRFToken from "../getXSRF"; + +export default async function uploadEventPhoto( + eventId: number, + file: File +): Promise<{ status: number; ok: boolean; data?: any; error?: string }> { + + const formData = new FormData(); + formData.append("photo", file); + try { + const csrfToken = await getXSRFToken(); + + const response = await fetch( + `${import.meta.env.VITE_API_URL}/api/events/${eventId}/photo/update`, + { + method: "POST", + headers: { + "X-XSRF-TOKEN": decodeURIComponent(csrfToken), + }, + credentials: "include", + body: formData, + } + ); + + const status = response.status; + let data = null; + + try { + data = await response.json(); + } catch (e) {} + + return { status, ok: response.ok, data }; + + } catch (err: any) { + return { + status: 0, + ok: false, + error: err?.message || "Network error" + }; + } +} \ No newline at end of file