import { Divider, Group, List, ListItem, Skeleton, Stack, Text, } from "@mantine/core"; import Avatar from "@/components/avatar"; import { TeamInfo } from "@/features/teams/types"; import { useNavigate } from "@tanstack/react-router"; import { useCallback, useMemo } from "react"; import React from "react"; interface TeamListItemProps { team: TeamInfo; } const TeamListItem = React.memo(({ team }: TeamListItemProps) => { const playerNames = useMemo( () => team.players?.map((p) => `${p.first_name} ${p.last_name}`) || [], [team.players] ); const teamNameSize = useMemo(() => { const nameLength = team.name.length; if (nameLength > 20) return 'xs'; if (nameLength > 15) return 'sm'; return 'md'; }, [team.name]); return ( {`${team.name}`} {playerNames.map((name, idx) => ( {name} ))} ); }); interface TeamListProps { teams: TeamInfo[]; loading?: boolean; onTeamClick?: (teamId: string) => void; } const TeamList = ({ teams, loading = false, onTeamClick }: TeamListProps) => { const navigate = useNavigate(); const handleClick = useCallback( (teamId: string, priv: boolean) => { if (onTeamClick) { onTeamClick(teamId); } else if (!priv) { navigate({ to: `/teams/${teamId}` }); } }, [navigate, onTeamClick] ); if (loading) return ( {Array.from({ length: 10 }).map((_, i) => ( } > ))} ); return ( {teams?.map((team) => ( } style={{ cursor: "pointer" }} onClick={() => handleClick(team.id, team.private)} styles={{ itemWrapper: { width: "100%" }, itemLabel: { width: "100%" }, }} w="100%" > ))} ); }; export default TeamList;