"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import Image from "next/image"; import { getApiUrl } from "../utils/getApiUrl"; import { pickStrapiImage } from "../utils/strapiImage"; import VignetteCarousel from "../components/VignetteCarousel"; import "../globals.css"; import "../assets/main.css"; /** * Liste des compétences — refonte "Digital Atelier" (étape 6). * * Même pattern de grille asymétrique 2/3 + 1/3 que `app/portfolio/page.jsx` pour * garder une cohérence visuelle entre les deux rubriques principales. Le * `CarouselCompetences` est retiré de la liste (arbitrage REFONTE-VISUELLE.md §2 : * carousel réservé aux galeries intra-fiche) : seule la première image est * affichée ici, ce qui allège le rendu et clarifie la lecture. */ const spanPattern = ["md:col-span-4", "md:col-span-2", "md:col-span-2", "md:col-span-4"]; export default function Page() { const [competences, setCompetences] = useState([]); const [isLoading, setIsLoading] = useState(true); const apiUrl = getApiUrl(); useEffect(() => { async function fetchCompetences() { try { const response = await fetch(`${apiUrl}/api/competences?populate=*`); if (!response.ok) { throw new Error(`Erreur de récupération des compétences : ${response.statusText}`); } const data = await response.json(); // Strapi v4 : `attributes.order` — Strapi v5 (souvent) : `order` à la racine. const getOrder = (item) => item?.order ?? item?.attributes?.order ?? 999; const sortedCompetences = (data.data ?? []).sort( (a, b) => getOrder(a) - getOrder(b) ); setCompetences(sortedCompetences); } catch (error) { console.error("❌ Erreur lors de la récupération des compétences :", error); } finally { setIsLoading(false); } } fetchCompetences(); }, [apiUrl]); return (
Chaque fiche détaille une compétence, son contexte d’apprentissage et des exemples concrets — ouvrez une carte pour voir les outils mobilisés et les projets associés.
Aucune compétence disponible pour le moment.
{competence.description}
)} Explorer