From 555a63b61d7c1c92a4c515e013fc9f6f8ce3cfce Mon Sep 17 00:00:00 2001 From: sebvtl728 Date: Mon, 3 Feb 2025 02:02:18 +0100 Subject: [PATCH] maj template page --- frontend/package-lock.json | 32 +- frontend/package.json | 1 + frontend/src/components/Expertises.jsx | 3 - frontend/src/components/Header.jsx | 17 +- frontend/src/components/Pages/Contact.jsx | 3 +- frontend/src/components/Pages/PostList.jsx | 86 ++++- frontend/src/components/Pages/ServiceDeux.jsx | 72 ++-- .../src/components/Pages/ServiceTrois.jsx | 77 +++-- frontend/src/components/Pages/ServiceUn.jsx | 68 ++-- .../src/components/ServicePageTemplate.jsx | 325 ++++-------------- frontend/src/main.jsx | 2 +- frontend/src/wordpress.js | 6 + 12 files changed, 314 insertions(+), 378 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1c230f5..90cc219 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -19,6 +19,7 @@ "react-helmet-async": "^2.0.5", "react-router-dom": "^7.1.1", "react-simple-lightbox": "^1.0.26", + "react-toastify": "^11.0.3", "simple-react-lightbox": "^3.6.8", "svgo": "^3.3.2", "swiper": "^10.3.1" @@ -3392,6 +3393,15 @@ "node": ">=10" } }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -9986,6 +9996,19 @@ "react": "^16.8.3 || ^17 || ^18" } }, + "node_modules/react-toastify": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-11.0.3.tgz", + "integrity": "sha512-cbPtHJPfc0sGqVwozBwaTrTu1ogB9+BLLjd4dDXd863qYLj7DGrQ2sg5RAChjFUB4yc3w8iXOtWcJqPK/6xqRQ==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": "^18 || ^19", + "react-dom": "^18 || ^19" + } + }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -12865,15 +12888,6 @@ "node": ">=10" } }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 8292390..bcb6e5b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -21,6 +21,7 @@ "react-helmet-async": "^2.0.5", "react-router-dom": "^7.1.1", "react-simple-lightbox": "^1.0.26", + "react-toastify": "^11.0.3", "simple-react-lightbox": "^3.6.8", "svgo": "^3.3.2", "swiper": "^10.3.1" diff --git a/frontend/src/components/Expertises.jsx b/frontend/src/components/Expertises.jsx index 9337e69..d446f19 100644 --- a/frontend/src/components/Expertises.jsx +++ b/frontend/src/components/Expertises.jsx @@ -49,7 +49,6 @@ const Expertices = ({ { @@ -350,25 +350,26 @@ const Header = () => { + - + - + { Besoin d'une assistance immédiate ? diff --git a/frontend/src/components/Pages/PostList.jsx b/frontend/src/components/Pages/PostList.jsx index 40a86e9..65b1c25 100644 --- a/frontend/src/components/Pages/PostList.jsx +++ b/frontend/src/components/Pages/PostList.jsx @@ -1,27 +1,89 @@ import { useEffect, useState } from "react"; import { fetchPosts, deletePost } from "../../wordpress"; +import { Box, Typography, Button, CircularProgress, Paper, Grid } from "@mui/material"; +import DeleteIcon from "@mui/icons-material/Delete"; +import { toast } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; function PostList() { const [posts, setPosts] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); useEffect(() => { async function loadPosts() { - const data = await fetchPosts(); - setPosts(data); + try { + const data = await fetchPosts(); + setPosts(data); + } catch (err) { + setError("⚠️ Impossible de récupérer les articles."); + console.error("Erreur lors de la récupération des articles :", err); + } finally { + setLoading(false); + } } loadPosts(); }, []); + const handleDelete = async (postId) => { + if (window.confirm("❌ Es-tu sûr de vouloir supprimer cet article ?")) { + try { + await deletePost(postId); + setPosts(posts.filter((post) => post.id !== postId)); + toast.success("✅ Article supprimé avec succès !"); + } catch (err) { + console.error("Erreur suppression :", err); + toast.error("⚠️ Erreur lors de la suppression."); + } + } + }; + return ( -
-

Liste des Articles

- {posts.map((post) => ( -
-

{post.title.rendered}

- -
- ))} -
+ + + 📋 Liste des Articles + + + {loading && ( + + + + )} + + {error && ( + + {error} + + )} + + {!loading && posts.length === 0 && ( + + Aucun article trouvé. + + )} + + + {posts.map((post) => ( + + + + {post.title.rendered} + + + + + ))} + + ); } -export default PostList; + +export default PostList; \ No newline at end of file diff --git a/frontend/src/components/Pages/ServiceDeux.jsx b/frontend/src/components/Pages/ServiceDeux.jsx index 8d9b87c..427a274 100644 --- a/frontend/src/components/Pages/ServiceDeux.jsx +++ b/frontend/src/components/Pages/ServiceDeux.jsx @@ -1,50 +1,62 @@ -import React from 'react'; -import ServicePageTemplate from '../ServicePageTemplate'; +import React from "react"; +import ServicePageTemplate from "../ServicePageTemplate"; const ServiceDeux = () => { const serviceDetails = { - title: 'Structure béton charpente métallique & bois', - subtitle: 'Dominez l’intelligence artificielle.', - description: - 'Plongez dans le futur ! Notre formation IA vous prépare aux outils modernes d’intelligence artificielle comme Python, TensorFlow et OpenAI API. Apprenez à créer des modèles IA performants.', + // Hero + title: "Structure béton charpente métallique & bois", + subtitle: "Dominez l’intelligence artificielle.", + + image: "https://picsum.photos/id/239/1920/1080.webp", + ctaText: "Découvrir la formation IA", + ctaLink: "/contact", + + // section 1 + interestTitle: "Béton ou Charpente : Quel Matériau Choisir pour une Construction Durable ?", // ✅ Modifiable individuellement + description: "Le béton est le matériau de construction le plus répandu dans le monde. Il est présent dans tous les secteurs de la construction.\n Longtemps associé à l’image négative des grands ensembles, gris et vieillissants, le béton a réalisé des progrès spectaculaires ces dernières années, tant au niveau de ses performances techniques que des aspects esthétiques. Il commence même à entrer dans les foyers comme produit de décoration !
Une charpente est un assemblage de pièces de bois et/ou de métal, servant à soutenir ou couvrir des constructions et faisant partie de la toiture.", + + // section 2 + desirTitle: "Ce que nous offrons",// ✅ Modifiable individuellement + features: [ { - title: 'Fondamentaux de l’IA', - description: 'Concepts, algorithmes et applications.', - modalText: 'Découvrez les bases de l’IA, des algorithmes aux applications concrètes dans divers domaines.', - modalImage: 'https://picsum.photos/id/200/800/400.webp', + title: "Fondamentaux de l’IA", + description: "Concepts, algorithmes et applications.", + modalText: + "Découvrez les bases de l’IA, des algorithmes aux applications concrètes dans divers domaines.", + modalImage: "https://picsum.photos/id/200/800/400.webp", }, { - title: 'Python pour l’IA', - description: 'Bibliothèques populaires : TensorFlow, PyTorch.', - modalText: 'Apprenez à utiliser Python et ses bibliothèques pour concevoir des modèles d’IA puissants.', - modalImage: 'https://picsum.photos/id/201/800/400.webp', + title: "Python pour l’IA", + description: "Bibliothèques populaires : TensorFlow, PyTorch.", + modalText: + "Apprenez à utiliser Python et ses bibliothèques pour concevoir des modèles d’IA puissants.", + modalImage: "https://picsum.photos/id/201/800/400.webp", }, { - title: 'Projets Pratiques', - description: 'Créez vos propres modèles IA.', - modalText: 'Mettez vos compétences en pratique en développant des projets IA réels.', - modalImage: 'https://picsum.photos/id/202/800/400.webp', + title: "Projets Pratiques", + description: "Créez vos propres modèles IA.", + modalText: + "Mettez vos compétences en pratique en développant des projets IA réels.", + modalImage: "https://picsum.photos/id/202/800/400.webp", }, ], - image: 'https://picsum.photos/id/239/1920/1080.webp', - ctaText: 'Découvrir la formation IA', - ctaLink: '/contact', + carouselItems: [ { - title: 'Site E-commerce', - description: 'Un projet e-commerce performant et moderne.', - image: 'https://picsum.photos/id/453/800/400.webp', + title: "Site E-commerce", + description: "Un projet e-commerce performant et moderne.", + image: "https://picsum.photos/id/453/800/400.webp", }, { - title: 'Portfolio Personnel', - description: 'Montrez vos compétences avec un portfolio sur mesure.', - image: 'https://picsum.photos/id/454/800/400.webp', + title: "Portfolio Personnel", + description: "Montrez vos compétences avec un portfolio sur mesure.", + image: "https://picsum.photos/id/454/800/400.webp", }, { - title: 'Blog Dynamique', - description: 'Créez un blog interactif et optimisé pour le SEO.', - image: 'https://picsum.photos/id/455/800/400.webp', + title: "Blog Dynamique", + description: "Créez un blog interactif et optimisé pour le SEO.", + image: "https://picsum.photos/id/455/800/400.webp", }, ], }; diff --git a/frontend/src/components/Pages/ServiceTrois.jsx b/frontend/src/components/Pages/ServiceTrois.jsx index 43d67e8..717f53a 100644 --- a/frontend/src/components/Pages/ServiceTrois.jsx +++ b/frontend/src/components/Pages/ServiceTrois.jsx @@ -1,52 +1,69 @@ -import React from 'react'; -import ServicePageTemplate from '../ServicePageTemplate'; +import React from "react"; +import ServicePageTemplate from "../ServicePageTemplate"; const ServiceTrois = () => { const serviceDetails = { - title: 'Électricité', - subtitle: 'IN3 est un bureau d’études technique spécialisé dans l’ingénierie électrique du bâtiment.', - description: - 'Plongez dans le futur ! Notre formation IA vous prépare aux outils modernes d’intelligence artificielle comme Python, TensorFlow et OpenAI API. Apprenez à créer des modèles IA performants.', + // Hero + title: "Électricité", // ✅ Modifiable individuellement + subtitle: "IN3 est un bureau d’études technique spécialisé dans l’ingénierie électrique du bâtiment.", + + image: "https://picsum.photos/id/1018/1920/1080.webp", + ctaText: "En savoir plus", + ctaLink: "/contact", + + // Section 1 + interestTitle: "Comment réussir vos installations électriques \navec une assistance experte en maîtrise d’ouvrage ?", + description: "Notre activité est l’assistance aux maîtres d’ouvrage à la réalisation des installations électriques courants forts et courants faibles.\n Définition des besoins / Audit si installations existantes Estimation du coût des ouvrages.\n \n Plans d’implantation du matériel et des canalisations schémas électriques unifilaires.\n Analyse des offres et assistance technique au choix de l’entreprise d’électricité.", + + // Section 2 + desirTitle: "Réalisation et assistance électrique", + features: [ { - title: 'Chantier électricité industriel', - description: 'Réalisation d’installations électriques.', - modalText: 'Réalisation d’installations électriques pour des sites industriels, incluant le câblage, la pose d’équipements, et la mise en conformité selon les normes en vigueur..', - modalImage: 'https://picsum.photos/id/200/800/400.webp', + title: "Chantier électricité industriel", + description: "Réalisation d’installations électriques.", + modalText: "Réalisation d’installations électriques pour des sites industriels, incluant le câblage, la pose d’équipements, et la mise en conformité selon les normes en vigueur.", + modalImage: "https://picsum.photos/id/200/800/400.webp", }, { - title: 'Python pour l’IA', - description: 'Bibliothèques populaires : TensorFlow, PyTorch.', - modalText: 'Apprenez à utiliser Python et ses bibliothèques pour concevoir des modèles d’IA puissants.', - modalImage: 'https://picsum.photos/id/201/800/400.webp', + title: "Dossier de Consultation", + description: "Réalisation du Dossier de Consultation des entreprises (DCE)", + modalText: "Réalisation du Dossier de Consultation des entreprises (DCE) cahier des clauses techniques particulières (CCTP) bordereau de décomposition du prix global et forfaitaire (DPGF, servant de base à tous les devis).", + modalImage: "https://picsum.photos/id/201/800/400.webp", }, { - title: 'Projets Pratiques', - description: 'Créez vos propres modèles IA.', - modalText: 'Mettez vos compétences en pratique en développant des projets IA réels.', - modalImage: 'https://picsum.photos/id/202/800/400.webp', + title: "L'électricité & Suivi de chantier", + description: "Assistance à l’entreprise et vérification des documents", + modalText: "Assistance à l’entreprise et vérification des documents d’exécution. Réception des ouvrages exécutés. Nous pouvons également assister l’entreprise titulaire du marché à la réalisation des documents d’exécution (plans d’implantation, schématique électrique, notes de calculs réglementaires, …)", + modalImage: "https://picsum.photos/id/202/800/400.webp", }, ], - image: 'https://picsum.photos/id/239/1920/1080.webp', - ctaText: 'En savoir plus !', - ctaLink: '/contact', + carouselItems: [ { - title: 'Site E-commerce', - description: 'Un projet e-commerce performant et moderne.', - image: 'https://picsum.photos/id/453/800/400.webp', + title: "Site E-commerce", + description: "Un projet e-commerce performant et moderne.", + image: "https://picsum.photos/id/453/800/400.webp", }, { - title: 'Portfolio Personnel', - description: 'Montrez vos compétences avec un portfolio sur mesure.', - image: 'https://picsum.photos/id/454/800/400.webp', + title: "Portfolio Personnel", + description: "Montrez vos compétences avec un portfolio sur mesure.", + image: "https://picsum.photos/id/454/800/400.webp", }, { - title: 'Blog Dynamique', - description: 'Créez un blog interactif et optimisé pour le SEO.', - image: 'https://picsum.photos/id/455/800/400.webp', + title: "Blog Dynamique", + description: "Créez un blog interactif et optimisé pour le SEO.", + image: "https://picsum.photos/id/455/800/400.webp", }, ], + + // ✅ Métadonnées SEO + seo: { + metaTitle: "Formation Électricité | Expertise en ingénierie électrique", + metaDescription: "Découvrez notre expertise en ingénierie électrique et maîtrisez l'installation et la gestion des systèmes électriques.", + keywords: "électricité, ingénierie électrique, installation électrique, suivi de chantier", + ogImage: "https://picsum.photos/1200/630", + }, }; return ; diff --git a/frontend/src/components/Pages/ServiceUn.jsx b/frontend/src/components/Pages/ServiceUn.jsx index 67de73a..3eb9bb1 100644 --- a/frontend/src/components/Pages/ServiceUn.jsx +++ b/frontend/src/components/Pages/ServiceUn.jsx @@ -1,45 +1,57 @@ -import React from 'react'; -import ServicePageTemplate from '../ServicePageTemplate'; +import React from "react"; +import ServicePageTemplate from "../ServicePageTemplate"; const ServiceUn = () => { const serviceDetails = { - title: 'Prestation-maitrise-oeuvre', - subtitle: 'Apprenez à maîtriser les technologies du web.', - description: - 'Notre formation web vous permet de développer vos compétences en développement frontend, backend et design. Rejoignez notre programme pour apprendre HTML, CSS, JavaScript et bien plus.', + // Hero + title: 'Titre héros', // ✅ Modifiable individuellement + subtitle: 'Description, héros', // ✅ Modifiable individuellement + + image: "https://picsum.photos/id/1018/1920/1080.webp", + ctaText: "En savoir plus", + ctaLink: "/contact", + + // section 1 + interestTitle: 'Titre interet', // ✅ Modifiable individuellement + description: 'Description interet', // ✅ Modifiable individuellement + + // section 2 + desirTitle: 'Titre Désir', // ✅ Modifiable individuellement + features: [ { - title: 'Frontend Development', - description: 'HTML, CSS, JavaScript, React et plus encore.', - modalText: 'Apprenez à construire des interfaces utilisateurs modernes avec les technologies frontend.', - modalImage: 'https://picsum.photos/id/300/800/400.webp', + title: "Frontend Development", + description: "HTML, CSS, JavaScript, React et plus encore.", + modalText: + "Apprenez à construire des interfaces utilisateurs modernes avec les technologies frontend.", + modalImage: "https://picsum.photos/id/300/800/400.webp", }, { - title: 'Backend Development', - description: 'Node.js, Express, MongoDB et bases de données.', - modalText: 'Développez des applications robustes avec des technologies backend performantes.', - modalImage: 'https://picsum.photos/id/301/800/400.webp', + title: "Backend Development", + description: "Node.js, Express, MongoDB et bases de données.", + modalText: + "Développez des applications robustes avec des technologies backend performantes.", + modalImage: "https://picsum.photos/id/301/800/400.webp", }, { - title: 'Responsive Design', - description: 'Apprenez à créer des designs modernes et adaptatifs.', - modalText: 'Maîtrisez les principes du responsive design pour des expériences utilisateur optimales.', - modalImage: 'https://picsum.photos/id/302/800/400.webp', + title: "Responsive Design", + description: "Apprenez à créer des designs modernes et adaptatifs.", + modalText: + "Maîtrisez les principes du responsive design pour des expériences utilisateur optimales.", + modalImage: "https://picsum.photos/id/302/800/400.webp", }, ], - image: 'https://picsum.photos/id/1018/1920/1080.webp', - ctaText: 'En savoir plus', - ctaLink: '/contact', + carouselItems: [ { - title: 'Portfolio Modern', - description: 'Montrez vos compétences avec un portfolio unique.', - image: 'https://picsum.photos/id/305/800/400.webp', + title: "Portfolio Modern", + description: "Montrez vos compétences avec un portfolio unique.", + image: "https://picsum.photos/id/305/800/400.webp", }, { - title: 'Blog SEO', - description: 'Optimisez vos articles pour le référencement.', - image: 'https://picsum.photos/id/306/800/400.webp', + title: "Blog SEO", + description: "Optimisez vos articles pour le référencement.", + image: "https://picsum.photos/id/306/800/400.webp", }, ], }; @@ -47,4 +59,4 @@ const ServiceUn = () => { return ; }; -export default ServiceUn; \ No newline at end of file +export default ServiceUn; diff --git a/frontend/src/components/ServicePageTemplate.jsx b/frontend/src/components/ServicePageTemplate.jsx index 2cfba84..748c65d 100644 --- a/frontend/src/components/ServicePageTemplate.jsx +++ b/frontend/src/components/ServicePageTemplate.jsx @@ -1,40 +1,37 @@ -import React, { useState } from "react"; -import { - Box, - Typography, - Button, - Grid, - Card, - CardContent, - Modal, - Fade, - Backdrop, -} from "@mui/material"; +import { useState } from "react"; +import { Box, Typography, Button, Grid, Card, CardContent, Modal, Fade, Backdrop, CircularProgress } from "@mui/material"; import { Swiper, SwiperSlide } from "swiper/react"; import { Navigation, Pagination, Autoplay } from "swiper/modules"; import "swiper/css"; import "swiper/css/navigation"; import "swiper/css/pagination"; +import PropTypes from "prop-types"; +import { Helmet } from "react-helmet-async"; const ServicePageTemplate = ({ title, subtitle, + interestTitle, description, + desirTitle, features, image, ctaText, ctaLink, carouselItems, + seo, // ✅ Ajout de l'objet SEO }) => { const [openModal, setOpenModal] = useState(false); const [modalContent, setModalContent] = useState({}); + const [loadingImage, setLoadingImage] = useState(true); const handleCardClick = (feature) => { setModalContent({ title: feature.title, text: feature.modalText || "Texte non disponible.", - image: feature.modalImage || "https://picsum.photos/id/43/800/400.webp", // Image par défaut + image: feature.modalImage || "https://picsum.photos/id/43/800/400.webp", }); + setLoadingImage(true); setOpenModal(true); }; @@ -43,14 +40,23 @@ const ServicePageTemplate = ({ }; return ( - - {/* Section Attention */} + + {/* ✅ SEO META TAGS */} + + {seo?.metaTitle || title} + + + + + + + + + + + + + {/* Section Hero */} - + {title} - - + {subtitle} - - {/* Section Interest */} + {/* Section numero 1 */} - - Pourquoi choisir notre formation ? + + {interestTitle} - - + {description} - {/* Section Desire */} + {/* Section numero 2 */} - - Ce que nous offrons + + {desirTitle} {features.map((feature, index) => ( handleCardClick(feature)} sx={{ - boxShadow: 2, - borderRadius: 2, + cursor: "pointer", textAlign: "center", padding: "20px", backgroundColor: "#f9f9f9", - cursor: "pointer", - transition: "transform 0.3s ease, box-shadow 0.3s ease", - "&:hover": { - transform: { - xs: "none", // Pas d'hover sur mobile - md: "scale(1.05)", // Hover sur desktop uniquement - }, - boxShadow: { - xs: 2, // Pas d'effet de hover sur mobile - md: 5, // Augmentation de l'ombre sur desktop - }, - }, - "&:active": { - transform: "scale(0.98)", // Effet de clic pour le tactile - boxShadow: 3, - }, + transition: "0.3s", + "&:hover": { transform: "scale(1.05)", boxShadow: 5 }, }} - onClick={() => handleCardClick(feature)} > - + {feature.title} @@ -189,177 +135,46 @@ const ServicePageTemplate = ({ {/* Modal */} - + - - {modalContent.title} + + {loadingImage && } + {modalContent.title} setLoadingImage(false)} /> {modalContent.title} {modalContent.text} - - - {/* Carousel Section */} - {carouselItems && carouselItems.length > 0 && ( - - - Découvrez nos réalisations - - - - {carouselItems.map((item, index) => ( - - - {item.title} - - - {item.title} - - {item.description} - - - - ))} - - - )} - - {/* Section Action */} - - - Prêt à démarrer ? - - - - Rejoignez-nous dès aujourd’hui et profitez de nos services pour - booster votre activité. - - - ); }; -export default ServicePageTemplate; +// ✅ Définition des types des props avec PropTypes +ServicePageTemplate.propTypes = { + title: PropTypes.string.isRequired, + subtitle: PropTypes.string.isRequired, + interestTitle: PropTypes.string.isRequired, + description: PropTypes.string.isRequired, + desirTitle: PropTypes.string.isRequired, + features: PropTypes.arrayOf(PropTypes.shape({ title: PropTypes.string.isRequired, description: PropTypes.string.isRequired, modalText: PropTypes.string, modalImage: PropTypes.string })).isRequired, + image: PropTypes.string.isRequired, + ctaText: PropTypes.string.isRequired, + ctaLink: PropTypes.string.isRequired, + carouselItems: PropTypes.arrayOf(PropTypes.shape({ title: PropTypes.string.isRequired, description: PropTypes.string.isRequired, image: PropTypes.string.isRequired })), + seo: PropTypes.object, // ✅ Ajout du SEO en option +}; + +// ✅ Valeurs par défaut +ServicePageTemplate.defaultProps = { + carouselItems: [], + seo: {}, // ✅ SEO par défaut vide +}; + +export default ServicePageTemplate; \ No newline at end of file diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index f02ae50..b0e06d2 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -49,7 +49,7 @@ function YourApp() { {/* Routes pour les services */} } /> } /> - } /> + } /> } /> } /> } /> diff --git a/frontend/src/wordpress.js b/frontend/src/wordpress.js index 76e101b..a781981 100644 --- a/frontend/src/wordpress.js +++ b/frontend/src/wordpress.js @@ -38,6 +38,12 @@ export async function uploadImage(file) { } } +export async function fetchPosts() { + const response = await fetch("https://preprod.octopusdesign.fr/api-octopus/server/wp-json/wp/v2/posts"); + if (!response.ok) throw new Error("Erreur lors de la récupération des articles"); + return await response.json(); +} + /** * 🔹 Crée un post WordPress avec une image mise en avant * @param {string} title - Le titre du post