--- import { getCollection } from "astro:content"; import Layout from "../layouts/Layout.astro"; import Card from "../components/Card.astro"; const allHumans = await getCollection("humans"); // 1. Tri par date décroissante const sortedAll = allHumans.sort( (a, b) => new Date(b.data.date).getTime() - new Date(a.data.date).getTime(), ); // 2. Fonction de calcul de Streak (Série) corrigée const getStreak = (name, entries) => { // On extrait toutes les dates pour cet utilisateur au format YYYY-MM-DD const userDates = entries .filter((e) => e.data.name === name) .map((e) => new Date(e.data.date).toISOString().split("T")[0]); // On dédoublonne et on trie (plus récent au plus ancien) const uniqueDates = [...new Set(userDates)].sort().reverse(); let streak = 0; let today = new Date(); // On cale la date de vérification sur aujourd'hui à minuit let checkDate = new Date( today.getFullYear(), today.getMonth(), today.getDate(), ); for (let i = 0; i < 31; i++) { const dateStr = checkDate.toISOString().split("T")[0]; if (uniqueDates.includes(dateStr)) { streak++; checkDate.setDate(checkDate.getDate() - 1); } else { // Tolérance : si pas de note aujourd'hui, on vérifie si la série continue depuis hier if (i === 0) { checkDate.setDate(checkDate.getDate() - 1); const yesterdayStr = checkDate.toISOString().split("T")[0]; if (uniqueDates.includes(yesterdayStr)) continue; } break; } } return streak; }; // 3. Unicité par utilisateur pour l'affichage (dernière version de chaque profil) const latestPerUser = Array.from( sortedAll .reduce((map, obj) => { if (!map.has(obj.data.name)) { map.set(obj.data.name, obj); } return map; }, new Map()) .values(), ); ---
{ latestPerUser.map((entry) => { // On calcule la streak ICI pour l'envoyer à la carte const currentStreak = getStreak(entry.data.name, allHumans); return (
); }) }