'use client' import { Avatar, AvatarFallback, AvatarImage } from '@thedaviddias/design-system/avatar' import { Badge } from '@thedaviddias/design-system/badge' import { Calendar, Star } from 'lucide-react' import Link from 'next/link' import { Card, CardContent } from '@/components/ui/card' import { getMemberBadgeSync } from '@/lib/member-client-utils' interface Member { id: string firstName?: string | null lastName?: string | null username?: string | null imageUrl?: string | null createdAt: string publicMetadata?: { github_username?: string | null migrated_from?: string | null } hasContributions?: boolean } interface MemberCardItemProps { member: Member userSlug: string onClick?: () => void } /** * Individual member card component displaying user info and contribution badge * @param props - Component props * @param props.member - Member data to display * @param props.userSlug - URL slug for user profile link * @returns JSX component for single member card */ export function MemberCardItem({ member, userSlug, onClick }: MemberCardItemProps) { const displayName = member.firstName && member.lastName ? `${member.firstName} ${member.lastName}` : member.firstName || member.lastName || member.username || `User ${member.id.slice(-6).toUpperCase()}` const username = member.username || member.publicMetadata?.github_username const badge = getMemberBadgeSync(member.hasContributions) // Parse the date - it might be a timestamp number as string or ISO string let joinDate = 'Member' if (member.createdAt) { // Try parsing as number first (timestamp) const timestamp = Number(member.createdAt) const date = !Number.isNaN(timestamp) ? new Date(timestamp) : new Date(member.createdAt) if (!Number.isNaN(date.getTime())) { joinDate = date.toLocaleDateString('en-US', { month: 'short', year: 'numeric' }) } } return ( {member.imageUrl ? ( ) : ( {displayName.charAt(0).toUpperCase()} )}

{displayName}

{username &&

@{username}

} {/* Badge */}
{badge.label} {member.hasContributions && ( Contributor )}
{joinDate}
) }