Spaces:
Running
Running
File size: 3,872 Bytes
606f214 5621ad9 606f214 5621ad9 606f214 5621ad9 606f214 5621ad9 606f214 5621ad9 606f214 5621ad9 606f214 5621ad9 606f214 5621ad9 606f214 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
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,
}) => {
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)
// 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
const showExpandButton = selectedCategories.size === 0;
// 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 (
<Box sx={{ mb: 6 }}>
<SectionHeader
title={title}
count={approvedLeaderboards.length}
isExpanded={isExpanded}
onToggleExpand={toggleExpanded}
showExpandButton={showExpandButton}
isExpandButtonEnabled={isExpandButtonEnabled}
/>
{showLanguageList && (
<LanguageList
languages={languages}
languageStats={languageStats}
selectedLanguage={selectedLanguage}
onLanguageSelect={setSelectedLanguage}
LANGUAGE_FAMILIES={LANGUAGE_FAMILIES}
findLanguageFamily={findLanguageFamily}
/>
)}
{approvedLeaderboards.length === 0 ? (
<EmptyState title={title} searchQuery={searchQuery} />
) : (
<LeaderboardGrid
displayedLeaderboards={displayedLeaderboards}
remainingLeaderboards={remainingLeaderboards}
isExpanded={isExpanded}
skeletonsNeeded={skeletonsNeeded}
id={id}
/>
)}
</Box>
);
};
export default LeaderboardSection;
|