import React from "react"; import { Box } from "@mui/material"; import { useLeaderboard } from "../../context/LeaderboardContext"; import SectionHeader from "./components/SectionHeader"; import LanguageList from "./components/LanguageList"; import LeaderboardGrid from "./components/LeaderboardGrid"; import EmptyState from "./components/EmptyState"; import { useLanguageStats } from "./hooks/useLanguageStats"; const ITEMS_PER_PAGE = 4; const LeaderboardSection = ({ title, leaderboards, filteredLeaderboards, id, showEmptyState = false, }) => { const { expandedSections, setExpandedSections, selectedLanguage, setSelectedLanguage, searchQuery, selectedCategories, } = useLeaderboard(); const isExpanded = expandedSections.has(id); const { languages, languageStats, LANGUAGE_FAMILIES, findLanguageFamily } = useLanguageStats(leaderboards, filteredLeaderboards); // Filtrer pour n'avoir que les leaderboards approuvés const approvedLeaderboards = filteredLeaderboards.filter( (leaderboard) => leaderboard.approval_status === "approved" ); // On ne retourne null que si on n'a pas de leaderboards bruts if (!leaderboards) return null; // Déterminer si on doit paginer ou montrer tous les leaderboards const shouldShowAll = (selectedCategories.size === 1 && selectedCategories.has(id)) || // Une seule catégorie sélectionnée ET c'est celle-ci (selectedCategories.size > 1 && id === "combined") || // Plusieurs catégories ET c'est la section combinée isExpanded || // Section dépliée (quelle que soit la sélection) id === "search-results"; // Toujours afficher tous les résultats pour la recherche textuelle // Si on doit tout montrer, on ne divise pas la liste const displayedLeaderboards = shouldShowAll ? approvedLeaderboards : approvedLeaderboards.slice(0, ITEMS_PER_PAGE); const remainingLeaderboards = shouldShowAll ? [] : approvedLeaderboards.slice(ITEMS_PER_PAGE); // Calculate how many skeletons we need (seulement si on ne montre pas tout) const skeletonsNeeded = shouldShowAll ? 0 : Math.max(0, 4 - approvedLeaderboards.length); // On affiche le bouton expand seulement quand on n'a pas de sélection et que ce n'est pas une recherche textuelle const showExpandButton = selectedCategories.size === 0 && id !== "search-results"; // Le bouton est actif seulement s'il y a plus de 4 leaderboards const isExpandButtonEnabled = approvedLeaderboards.length > ITEMS_PER_PAGE; const toggleExpanded = () => { setExpandedSections((prev) => { const newSet = new Set(prev); if (isExpanded) { newSet.delete(id); } else { newSet.add(id); } return newSet; }); }; // Déterminer si on doit afficher la liste des langues const showLanguageList = languages && selectedCategories.size > 0 && (id === "language" || (selectedCategories.size > 1 && selectedCategories.has("language"))); return ( {showLanguageList && ( )} {approvedLeaderboards.length === 0 ? ( // Afficher EmptyState uniquement si showEmptyState est true showEmptyState ? ( ) : null ) : ( )} ); }; export default LeaderboardSection;