import { List, ListItem, Divider, Skeleton, Text, Group, Box, ThemeIcon, Stack } from "@mantine/core"; import { useNavigate } from "@tanstack/react-router"; import Avatar from "@/components/avatar"; import { TournamentInfo } from "../types"; import { useCallback } from "react"; import React from "react"; import { TrophyIcon, CalendarIcon, MapPinIcon } from "@phosphor-icons/react"; interface TournamentListProps { tournaments: TournamentInfo[]; loading?: boolean; } interface TournamentListItemProps { tournament: TournamentInfo; } const TournamentListItem = React.memo(({ tournament }: TournamentListItemProps) => { const startDate = tournament.start_time ? new Date(tournament.start_time) : null; return ( {tournament.name} {tournament.location && ( {tournament.location} )} {startDate && !isNaN(startDate.getTime()) && ( {startDate.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' })} )} ); }); const TournamentList = ({ tournaments, loading = false }: TournamentListProps) => { const navigate = useNavigate(); const handleClick = useCallback((tournamentId: string) => navigate({ to: `/tournaments/${tournamentId}` }), [navigate]); if (loading) { return ( {Array.from({ length: 5 }).map((_, i) => ( } > ))} ); } if (!tournaments?.length) { return ( No tournaments found ); } return ( {tournaments.map((tournament) => ( <> } style={{ cursor: "pointer" }} onClick={() => handleClick(tournament.id)} styles={{ itemWrapper: { width: "100%" }, itemLabel: { width: "100%" } }} w="100%" > ))} ); } export default TournamentList;