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", }); setLoadingImage(true); setOpenModal(true); }; const handleCloseModal = () => { setOpenModal(false); }; return ( {/* ✅ SEO META TAGS */} {seo?.metaTitle || title} {/* Section Hero */} {title} {subtitle} {/* Section numero 1 */} {interestTitle} {description} {/* Section numero 2 */} {desirTitle} {features.map((feature, index) => ( handleCardClick(feature)} sx={{ cursor: "pointer", textAlign: "center", padding: "20px", backgroundColor: "#f9f9f9", transition: "0.3s", "&:hover": { transform: "scale(1.05)", boxShadow: 5 }, }} > {feature.title} {feature.description} ))} {/* Modal */} {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} ))} )} ); }; // ✅ 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;