import { useContext, useMemo, useState } from 'react'; import { IEventSignup } from '../types'; import UIPressable from '../UI/UIPressable'; import { CarpoolContext } from './Carpool'; import useSignups from './useSignups'; function MemberRow({ signup }: { signup: IEventSignup }) { return (
{signup.user.name}
{signup.formattedAddress} {signup.canDrive && Can drive}
); } function formatOthers(hiddenMemberCount: number) { if (hiddenMemberCount === 0) { return ''; } if (hiddenMemberCount === 1) { return '1 other...'; } return `${hiddenMemberCount} others...`; } const shownMembersCount = 4; export default function MemberList() { const { carpool } = useContext(CarpoolContext); const [expanded, setExpanded] = useState(false); const memberIDs = useMemo( () => carpool.members.map((member) => member.id), [carpool] ); const members = useSignups(carpool.id, memberIDs); const membersToShow = useMemo( () => (expanded ? members : members.slice(0, shownMembersCount)), [members, expanded] ); const hiddenMemberCount = members.length - membersToShow.length; return (

Members

{members.length > 0 ? (
{membersToShow.map((member) => ( ))}
setExpanded((e) => !e)}> {expanded ? 'Hide' : formatOthers(hiddenMemberCount)}
) : ( 'This carpool has no members.' )}
); }