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;