diff --git a/app/Competences/[slug]/page.tsx b/app/Competences/[slug]/page.tsx index f3d2e0b..8c75be6 100644 --- a/app/Competences/[slug]/page.tsx +++ b/app/Competences/[slug]/page.tsx @@ -1,11 +1,22 @@ +"use client"; // ✅ Indique que ce composant fonctionne côté client + +import { useParams } from "next/navigation"; // ✅ Nouvelle méthode pour récupérer `params` +import { useEffect, useState } from "react"; import ContentSectionCompetencesContainer from "../../components/ContentSectionCompetencesContainer"; -export default function CompetencePage({ params }: { params: { slug?: string } }) { - // ✅ Vérification du slug avant d'afficher le composant - if (!params?.slug) { - console.error("❌ [CompetencePage] Erreur : Aucun slug fourni !"); - return
❌ Erreur : Compétence introuvable.
; +export default function CompetencePage() { + const params = useParams(); // ✅ Récupérer `params` correctement + const [slug, setSlug] = useState(null); + + useEffect(() => { + if (params?.slug) { + setSlug(params.slug as string); // ✅ Assurer que `slug` est bien une string + } + }, [params]); + + if (!slug) { + return
⏳ Chargement...
; } - return ; + return ; } diff --git a/app/portfolio/[slug]/page.tsx b/app/portfolio/[slug]/page.tsx index 8c75be6..1c19583 100644 --- a/app/portfolio/[slug]/page.tsx +++ b/app/portfolio/[slug]/page.tsx @@ -2,9 +2,9 @@ import { useParams } from "next/navigation"; // ✅ Nouvelle méthode pour récupérer `params` import { useEffect, useState } from "react"; -import ContentSectionCompetencesContainer from "../../components/ContentSectionCompetencesContainer"; +import ContentSection from "../../components/ContentSection"; -export default function CompetencePage() { +export default function Page() { const params = useParams(); // ✅ Récupérer `params` correctement const [slug, setSlug] = useState(null); @@ -18,5 +18,5 @@ export default function CompetencePage() { return
⏳ Chargement...
; } - return ; + return ; } diff --git a/app/portfolio/page.jsx b/app/portfolio/page.jsx index e7ae065..f555978 100644 --- a/app/portfolio/page.jsx +++ b/app/portfolio/page.jsx @@ -2,17 +2,18 @@ import { useEffect, useState } from "react"; import Link from "next/link"; -import { getApiUrl } from "../utils/getApiUrl"; // 🔥 Import de l'URL dynamique +import { getApiUrl } from "../utils/getApiUrl"; +import Carousel from "../components/Carousel"; // ✅ Import du carrousel export default function Page() { - const [projects, setProjects] = useState([]); // 🔥 Stocker les projets une seule fois - const apiUrl = getApiUrl(); // 🔥 Définition de l'URL API + const [projects, setProjects] = useState([]); // ✅ Stocker les projets + const apiUrl = getApiUrl(); useEffect(() => { async function fetchProjects() { console.log("🔍 API utilisée pour les projets :", apiUrl); try { - const response = await fetch(`${apiUrl}/api/projects?populate=*`); + const response = await fetch(`${apiUrl}/api/projects?populate=picture`); if (!response.ok) { throw new Error(`Erreur de récupération des projets : ${response.statusText}`); } @@ -23,34 +24,43 @@ export default function Page() { } } - fetchProjects(); // 🔥 Exécuter une seule fois au montage du composant - }, [apiUrl]); // ✅ Exécuter `useEffect()` uniquement si `apiUrl` change + fetchProjects(); + }, [apiUrl]); return (
{/* Titre de la page */}

Portfolio formation 42

- {/* Grille améliorée avec une meilleure largeur et des colonnes plus équilibrées */} + {/* Grille des projets */}
{projects.map((project) => { - const picture = project.picture?.[0]; - const imageUrl = picture?.url ? `${apiUrl}${picture.url}` : "/placeholder.jpg"; + const pictures = project.picture ?? []; + const images = pictures.map((img) => ({ + url: `${apiUrl}${img.url}`, + alt: img.name || "Project image", + })); return ( -
{/* Lien vers la page de détail du projet */}
- {picture?.name + {/* ✅ Ajout du carrousel au lieu d'une image unique */} + {images.length > 1 ? ( + + ) : ( + {images[0]?.alt + )}
+

{project.name}