"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"; import ChatBot from "./ChatBot"; 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 [isChatbotOpen, setIsChatbotOpen] = useState(false); const [loading, setLoading] = useState(competenceData === null); const apiUrl = getApiUrl(); useEffect(() => { if (competenceData) { setLoading(false); } }, [competenceData]); 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; const images = picture?.map((img) => ({ url: `${apiUrl}${img.formats?.large?.url || img.url}`, alt: img.name || "Image de compétence", })) || []; function transformMarkdownWithKeywords(text: string) { if (!glossaireData.length) return text; let modifiedText = text; modifiedText = modifiedText.replace( /\bIA locale\b/g, `IA locale` ); 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}`; }); }); return modifiedText; } const contentWithLinks = transformMarkdownWithKeywords(content); 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]); useEffect(() => { function handleChatbotClick(event: MouseEvent) { const target = event.target as HTMLElement; if (target.dataset.chatbot === "true") { setIsChatbotOpen(true); } } document.body.addEventListener("click", handleChatbotClick); return () => document.body.removeEventListener("click", handleChatbotClick); }, []); return (

{name}

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