import { useState, useEffect } from 'react'; import { IconTrophy, IconMapPin, IconCloud, IconHash, IconChartBar } from '@tabler/icons-react'; /** * Компонент для отображения Top-N статистики */ function TopNStats({ data, loading }) { const [topCountries, setTopCountries] = useState([]); const [topProviders, setTopProviders] = useState([]); const [_topCommunities, _setTopCommunities] = useState([]); useEffect(() => { if (!data || !Array.isArray(data.servers)) return; // Подсчет по странам const countriesMap = new Map(); data.servers.forEach(s => { const country = s.country || 'Unknown'; countriesMap.set(country, (countriesMap.get(country) || 0) + 1); }); const topC = Array.from(countriesMap.entries()) .map(([name, count]) => ({ name, count })) .sort((a, b) => b.count - a.count) .slice(0, 5); setTopCountries(topC); // Подсчет по провайдерам const providersMap = new Map(); data.servers.forEach(s => { const provider = s.provider || 'Unknown'; providersMap.set(provider, (providersMap.get(provider) || 0) + 1); }); const topP = Array.from(providersMap.entries()) .map(([name, count]) => ({ name, count })) .sort((a, b) => b.count - a.count) .slice(0, 5); setTopProviders(topP); }, [data]); if (loading) { return (
Загрузка статистики...
); } const getFlagEmoji = (countryCode) => { if (!countryCode) return '🌐'; const map = { SWE: 'SE', UK: 'GB', RU: 'RU', US: 'US', DE: 'DE', NL: 'NL', SG: 'SG' }; const cc = (map[countryCode.toUpperCase()] || countryCode).slice(0, 2); if (cc.length !== 2) return '🌐'; return cc.replace(/./g, (ch) => String.fromCodePoint(127397 + ch.charCodeAt())); }; return (
{/* Top Страны */}

Top-5 Стран

{topCountries.length === 0 ? (
Нет данных
) : (
{topCountries.map((item, idx) => { const maxCount = topCountries[0]?.count || 1; const percentage = ((item.count / maxCount) * 100).toFixed(0); return (
{idx === 0 ? '🏆' : getFlagEmoji(item.name)} {item.name}
{item.count}
); })}
)}
{/* Top Провайдеры */}

Top-5 Провайдеров

{topProviders.length === 0 ? (
Нет данных
) : (
{topProviders.map((item, idx) => { const maxCount = topProviders[0]?.count || 1; const percentage = ((item.count / maxCount) * 100).toFixed(0); return (
{idx === 0 ? '🏆' : '☁️'} {item.name}
{item.count}
); })}
)}
); } export default TopNStats;