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 */}
-

+ {/* ✅ Ajout du carrousel au lieu d'une image unique */}
+ {images.length > 1 ? (
+
+ ) : (
+
![{images[0]?.alt]({images[0]?.url)
+ )}
+