'use client' import { Button } from '@thedaviddias/design-system/button' import { AlertCircle, Users } from 'lucide-react' import { Card, CardContent } from '@/components/ui/card' import { useMembersList } from '@/hooks/use-members-list' import { analytics } from '@/lib/analytics' import { MemberCardItem } from './member-card-item' import { MembersSearchControls } from './members-search-controls' 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 MembersWithLoadMoreProps { variant?: 'button' | 'auto' | 'scroll' } /** * Generates a URL slug from a user's username or ID * @param user - Member object to generate slug from * @returns URL-safe slug string for user profile */ function generateSlugFromUser(user: Member): string { if (!user) return '' const username = user.username || user.publicMetadata?.github_username // Use full user ID for email-only users if (!username) return user.id return username } /** * Interactive component displaying community members with pagination and search functionality * @param props - Component props * @param props.variant - Loading behavior: 'scroll' for infinite scroll, 'button' for manual load, 'auto' for automatic * @returns JSX component with member cards, search, and pagination */ export function MembersWithLoadMore({ variant = 'scroll' }: MembersWithLoadMoreProps) { const { searchQuery, memberFilter, filteredMembers, hasMore, isLoading, isLoadingMore, totalCount, error, handleSearchChange, handleFilterChange, handleLoadMore, loadMoreRef } = useMembersList({ variant }) // Show error state if (error) { return (

Error loading members: {error}

) } return (
{/* Member Count */} {totalCount > 0 && (

Showing {filteredMembers.length} of {totalCount} members {searchQuery && ` matching "${searchQuery}"`}

)} {/* Loading State */} {isLoading ? (
{[...Array(20)].map((_, i) => (
))}
) : ( <> {/* Members Grid */} {filteredMembers.length > 0 ? (
{filteredMembers.map(member => { const userSlug = generateSlugFromUser(member) const username = member.username || member.publicMetadata?.github_username /** * Handles member profile click analytics tracking */ const handleMemberClick = () => { const displayName = member.firstName && member.lastName ? `${member.firstName} ${member.lastName}` : member.firstName || member.lastName || username || 'Anonymous' analytics.memberClick(displayName, userSlug, 'members-list') } return ( ) })}
) : (

No members found

{searchQuery ? `No members match "${searchQuery}"` : memberFilter !== 'all' ? 'No members in this category' : 'No members yet'}

)} {/* Load More */} {hasMore && (
{variant === 'button' && ( )} {/* Infinite scroll trigger */}
{isLoadingMore && variant !== 'button' && (
Loading more members...
)}
)} )}
) }