diff --git a/frontend/src/components/Pages/GestionPageAccueil.jsx b/frontend/src/components/Pages/GestionPageAccueil.jsx index f1d011b..2e84d06 100644 --- a/frontend/src/components/Pages/GestionPageAccueil.jsx +++ b/frontend/src/components/Pages/GestionPageAccueil.jsx @@ -1,168 +1,224 @@ -import React, { useState, useEffect } from "react"; -import { updateHomePageACF, uploadImage } from "../../wordpress"; +import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; -import { Box, Button, TextField, Typography, Snackbar, Alert, Paper, Card, CardMedia } from "@mui/material"; -import api from "../../api"; - -const PAGE_ID = 13; // ID de la page d'accueil +import { updateHomePageACF, uploadImage } from "../../wordpress"; +import { getToken } from "../../auth"; +import { + Typography, + TextField, + Button, + Container, + Paper, + Box, + CircularProgress, +} from "@mui/material"; const GestionPageAccueil = () => { - const [heroTitle, setHeroTitle] = useState(""); - const [heroText, setHeroText] = useState(""); - const [heroImage, setHeroImage] = useState(null); - const [heroImageId, setHeroImageId] = useState(null); - const [message, setMessage] = useState({ type: "", text: "" }); - const navigate = useNavigate(); // 🔥 Gestion de la navigation + const navigate = useNavigate(); + const [heroTitle, setHeroTitle] = useState(""); + const [heroText, setHeroText] = useState(""); + const [heroImage, setHeroImage] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + const [successMessage, setSuccessMessage] = useState(""); - // ✅ Charger les données ACF existantes - useEffect(() => { - const fetchPageData = async () => { - try { - const response = await api.get(`wp/v2/pages/${PAGE_ID}?_fields=acf`); - const acfData = response.data.acf; - - if (acfData) { - setHeroTitle(acfData.hero_title || ""); - setHeroText(acfData.hero_text || ""); + // ✅ Vérification de l'authentification (Redirection si non connecté) + useEffect(() => { + if (!getToken()) { + navigate("/admin/login"); + } + }, [navigate]); - if (acfData.img_hero) { - setHeroImageId(acfData.img_hero); - const imageResponse = await api.get(`wp/v2/media/${acfData.img_hero}`); - setHeroImage(imageResponse.data.source_url); - } - } - } catch (error) { - console.error("❌ Erreur chargement ACF :", error); - setMessage({ type: "error", text: "Erreur lors du chargement des données." }); - } - }; - fetchPageData(); - }, []); + // ✅ Chargement des données ACF depuis WordPress + useEffect(() => { + const fetchPageData = async () => { + try { + const response = await fetch( + "https://preprod.octopusdesign.fr/api-octopus/server/wp-json/wp/v2/pages/13?_fields=acf", + { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + } + ); - // ✅ Sauvegarde des données ACF - const handleSave = async () => { - try { - const formData = { - acf: { - hero_title: heroTitle, - hero_text: heroText, - img_hero: heroImageId || null, // ✅ Mise à jour avec l'ID de l'image - } - }; - - console.log("📢 Envoi des nouvelles données ACF :", formData); - await updateHomePageACF(PAGE_ID, formData); - - setMessage({ type: "success", text: "✅ Mise à jour réussie !" }); - - // ✅ 🔥 Redirection vers le Dashboard après 1.5 sec - setTimeout(() => { - navigate("/admin/dashboard"); - }, 1500); - } catch (error) { - console.error("❌ Erreur mise à jour ACF :", error); - setMessage({ type: "error", text: "❌ Échec de la mise à jour. Vérifie les permissions WordPress." }); + if (!response.ok) { + throw new Error("Erreur de chargement des données"); } + + const data = await response.json(); + setHeroTitle(data.acf?.hero_title || ""); + setHeroText(data.acf?.hero_text || ""); + + // ✅ Récupération de l'image Hero + if (data.acf?.img_hero) { + const mediaResponse = await fetch( + `https://preprod.octopusdesign.fr/api-octopus/server/wp-json/wp/v2/media/${data.acf.img_hero}` + ); + const mediaData = await mediaResponse.json(); + setHeroImage(mediaData.source_url); + } + + setLoading(false); + } catch (error) { + console.error("❌ Erreur chargement ACF :", error); + setError("Impossible de charger les données."); + setLoading(false); + } }; - // ✅ Gestion de l'upload d'image - const handleImageUpload = async (event) => { - const file = event.target.files[0]; - if (!file) return; + fetchPageData(); + }, []); - try { - const imageId = await uploadImage(file); - setHeroImageId(imageId); + // ✅ Mise à jour des champs ACF + const handleSave = async () => { + try { + const newData = { + hero_title: heroTitle, + hero_text: heroText, + }; - const imageResponse = await api.get(`wp/v2/media/${imageId}`); - setHeroImage(imageResponse.data.source_url); + console.log("📢 Données envoyées pour mise à jour ACF :", newData); + await updateHomePageACF(13, newData); - setMessage({ type: "success", text: "✅ Image uploadée avec succès !" }); - } catch (error) { - console.error("❌ Erreur lors de l'upload de l'image :", error); - setMessage({ type: "error", text: "❌ Échec de l'upload de l'image." }); - } - }; + setSuccessMessage("✅ Modifications enregistrées avec succès !"); + setTimeout(() => setSuccessMessage(""), 3000); + } catch (error) { + console.error("❌ Erreur mise à jour :", error); + setError("⚠ Impossible de mettre à jour les champs ACF."); + } + }; - return ( - - - - 🏠 Gestion de la Page d'Accueil + // ✅ Gérer le téléversement d’une nouvelle image Hero + const handleImageUpload = async (event) => { + const file = event.target.files[0]; + if (file) { + try { + const imageId = await uploadImage(file); + setHeroImage(URL.createObjectURL(file)); // Affichage immédiat + await updateHomePageACF(13, { img_hero: imageId }); + setSuccessMessage("✅ Image mise à jour !"); + } catch (error) { + console.error("❌ Erreur lors de l'upload :", error); + setError("❌ Échec de l'upload de l'image."); + } + } + }; + + return ( + + + {/* ✅ En-tête */} + + 🏠 Gestion de la Page d'Accueil + + + {/* ✅ Affichage du statut de chargement */} + {loading ? ( + + + + ) : error ? ( + + {error} + + ) : ( + <> + {/* ✅ Message de succès */} + {successMessage && ( + + + {successMessage} + + )} - {message.text && ( - setMessage({ type: "", text: "" })}> - - {message.text} - - - )} - - {/* ✅ Aperçu de l'image actuelle */} - {heroImage && ( - - - - )} - - {/* ✅ Bouton pour modifier l'image */} - - - setHeroTitle(e.target.value)} - sx={{ "& .MuiInputBase-input": { fontSize: "1.2rem" } }} + {/* ✅ Affichage de l'image actuelle */} + {heroImage && ( + + Hero + + )} - setHeroText(e.target.value)} - multiline - rows={3} - sx={{ "& .MuiInputBase-input": { fontSize: "1rem" } }} - /> + {/* ✅ Bouton pour changer l'image */} + - + {/* ✅ Formulaire de modification */} + setHeroTitle(e.target.value)} + sx={{ mb: 2, backgroundColor: "#fff", borderRadius: "5px" }} + /> - {/* ✅ Bouton retour Dashboard */} - - - - ); + setHeroText(e.target.value)} + sx={{ mb: 2, backgroundColor: "#fff", borderRadius: "5px" }} + multiline + rows={3} + /> + + {/* ✅ Bouton d'enregistrement */} + + + {/* ✅ Bouton retour au Dashboard */} + + + )} + + + ); }; export default GestionPageAccueil; \ No newline at end of file