import React from 'react'; import { useParams, Link as RouterLink } from 'react-router-dom'; import { useQuery } from '@tanstack/react-query'; import { getPlayer } from '../services/public'; import { assetUrl } from '../utils/url'; import { Box, Badge, Button, Container, Divider, Heading, HStack, Image, SimpleGrid, Skeleton, Stack, Text, VStack, useColorModeValue } from '@chakra-ui/react'; import MainLayout from '../components/layout/MainLayout'; import NewsletterCTA from '../components/common/NewsletterCTA'; import { translateNationality, getCountryFlag } from '../utils/nationality'; const PlayerDetailPage: React.FC = () => { const { id } = useParams<{ id: string }>(); const { data, isLoading, isError } = useQuery({ queryKey: ['player', id], queryFn: () => getPlayer(String(id)) }); const cardBg = useColorModeValue('white', 'gray.800'); const borderColor = useColorModeValue('gray.200', 'gray.700'); if (isLoading) { return ( ); } if (isError || !data) { return ( Hráče se nepodařilo načíst. ); } const fullName = [data.first_name, data.last_name].filter(Boolean).join(' '); return ( {fullName} {typeof data.jersey_number === 'number' && ( #{data.jersey_number} )} {data.position && ( {data.position} )} {!data.is_active && ( Neaktivní )} {fullName} Informace o hráči {data.position && ( Pozice: {data.position} )} {typeof data.jersey_number === 'number' && ( Číslo dresu: #{data.jersey_number} )} {data.nationality && ( Národnost: {getCountryFlag(data.nationality)} {translateNationality(data.nationality)} )} {data.date_of_birth && ( Datum narození: {new Date(data.date_of_birth).toLocaleDateString('cs-CZ')} — {(() => { const a = calculateAge(data.date_of_birth); return a != null ? `${a} ${czYears(a)}` : '' })()} )} {data.team?.name ? ( Tým: {data.team.name} ) : (typeof data.team_id === 'number' && data.team_id > 0) ? ( Tým ID: {data.team_id} ) : null} {(data.height || data.weight) && ( Výška/Váha: {data.height ? `${data.height} cm` : '-'} / {data.weight ? `${data.weight} kg` : '-'} )} {data.email && ( Email: {data.email} )} {data.phone && ( Telefon: {data.phone} )} ); }; function calculateAge(iso: string): number | null { try { const d = new Date(iso); if (isNaN(d.getTime())) return null; const today = new Date(); let age = today.getFullYear() - d.getFullYear(); const m = today.getMonth() - d.getMonth(); if (m < 0 || (m === 0 && today.getDate() < d.getDate())) age--; return age; } catch { return null; } } function czYears(n: number): string { if (n === 1) return 'rok'; if (n >= 2 && n <= 4) return 'roky'; return 'let'; } function normalizeTel(input: string): string { if (!input) return ''; let s = String(input).trim(); s = s.replace(/[\s\-()]/g, ''); if (s.startsWith('00')) s = '+' + s.slice(2); s = s.replace(/(?!^)[^\d]/g, ''); if (s[0] !== '+' && s.startsWith('+')) { // keep + if present } return s; } export default PlayerDetailPage;