import { Box, Container, Heading, HStack, Image, SimpleGrid, Spinner, Stack, Text, VStack, useColorModeValue, Badge, Input, Select, Checkbox, InputGroup, InputLeftElement } from '@chakra-ui/react'; import { useQuery } from '@tanstack/react-query'; import { getPlayers } from '../services/public'; import type { Player } from '../services/public'; import { assetUrl } from '../utils/url'; import { Link as RouterLink } from 'react-router-dom'; import MainLayout from '../components/layout/MainLayout'; import NewsletterCTA from '../components/common/NewsletterCTA'; // nationality display removed per requirements import { useMemo, useState } from 'react'; import { SearchIcon } from '@chakra-ui/icons'; const PlayersPage: React.FC = () => { const { data, isLoading, isError } = useQuery({ queryKey: ['players'], queryFn: () => getPlayers() }); const cardBg = useColorModeValue('white', 'gray.800'); const borderColor = useColorModeValue('gray.200', 'gray.700'); const textSecondary = useColorModeValue('gray.600', 'gray.400'); const [q, setQ] = useState(''); const [gender, setGender] = useState(''); const [position, setPosition] = useState(''); const [activeOnly, setActiveOnly] = useState(true); const positions = useMemo(() => { const all = (data || []).map(p => p.position).filter(Boolean) as string[]; return Array.from(new Set(all)); }, [data]); const filtered = useMemo(() => { let list = (data || []).slice(); if (activeOnly) list = list.filter(p => p.is_active !== false); if (gender) list = list.filter(p => (p.gender || '').toLowerCase() === gender); if (position) list = list.filter(p => (p.position || '') === position); if (q.trim()) { const needle = q.trim().toLowerCase(); list = list.filter(p => { const name = `${p.first_name} ${p.last_name}`.trim().toLowerCase(); const pos = (p.position || '').toLowerCase(); const jersey = typeof p.jersey_number === 'number' ? String(p.jersey_number) : ''; return name.includes(needle) || pos.includes(needle) || jersey.includes(needle); }); } return list; }, [data, q, gender, position, activeOnly]); if (isLoading) { return ( ); } if (isError) { return ( Chyba při načítání hráčů ); } return ( Hráči setQ(e.target.value)} placeholder="Hledat jméno, číslo, pozici" /> setActiveOnly(e.target.checked)}>Pouze aktivní {filtered.map((p) => ( {`${p.first_name} {typeof p.jersey_number === 'number' && ( #{p.jersey_number} )} {p.first_name} {p.last_name} {p.position} {/* Národnost skryta */} ))} {/* Newsletter CTA */} ); } export default PlayersPage;