"use client"; import { useState, useEffect } from "react"; import { getApiUrl } from "../utils/getApiUrl"; import CarouselCompetences from "./CarouselCompetences"; import ReactMarkdown from "react-markdown"; import rehypeRaw from "rehype-raw"; import ModalGlossaire from "./ModalGlossaire"; // ✅ Définition des types pour TypeScript interface ImageData { url: string; formats?: { large?: { url: string }; }; name?: string; } interface CompetenceData { name: string; content: string; picture?: ImageData[]; } interface GlossaireItem { mot_clef: string; slug: string; variantes: string[]; description: string; images?: ImageData[]; } interface ContentSectionProps { competenceData: CompetenceData | null; glossaireData: GlossaireItem[]; titleClass?: string; contentClass?: string; } export default function ContentSectionCompetences({ competenceData, glossaireData, titleClass, contentClass, }: ContentSectionProps) { console.log("🔍 [ContentSectionCompetences] Chargement du composant..."); const [selectedMot, setSelectedMot] = useState(null); const [loading, setLoading] = useState(competenceData === null); // ✅ Initialiser correctement loading const apiUrl = getApiUrl(); useEffect(() => { if (competenceData) { setLoading(false); // ✅ Mise à jour de loading une seule fois après chargement } }, [competenceData]); // ✅ Affichage d'un message de chargement if (loading) { return
⏳ Chargement des détails de la compétence...
; } if (!competenceData) { console.error("❌ [ContentSectionCompetences] Compétence introuvable !"); return
❌ Compétence introuvable.
; } const { name, content, picture } = competenceData; // ✅ Transformation des images de Strapi en format attendu par le carrousel const images = picture?.map((img) => ({ url: `${apiUrl}${img.formats?.large?.url || img.url}`, alt: img.name || "Image de compétence", })) || []; console.log("✅ [ContentSectionCompetences] Images préparées :", images); // ✅ Transformation des mots-clés du glossaire function transformMarkdownWithKeywords(text: string) { if (!glossaireData.length) return text; let modifiedText = text; glossaireData.forEach(({ mot_clef, variantes }) => { const regexVariants = variantes .map((v) => v.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")) .join("|"); const regex = new RegExp(`\\b(${mot_clef}|${regexVariants})\\b`, "gi"); modifiedText = modifiedText.replace(regex, (match) => { return `${match}`; }); }); console.log("🔄 [ContentSectionCompetences] Contenu transformé avec mots-clés :", modifiedText); return modifiedText; } const contentWithLinks = transformMarkdownWithKeywords(content); // ✅ Gestion des clics sur les mots-clés useEffect(() => { function handleKeywordClick(event: MouseEvent) { const target = event.target as HTMLElement; if (target.classList.contains("keyword")) { const mot = target.getAttribute("data-mot"); if (mot) { const glossaireMot = glossaireData.find((g) => g.mot_clef === mot); setSelectedMot(glossaireMot || null); } } } document.body.addEventListener("click", handleKeywordClick); return () => document.body.removeEventListener("click", handleKeywordClick); }, [glossaireData]); return (

{name}

{contentWithLinks}
{selectedMot && setSelectedMot(null)} />}
); }