'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}
Showing {filteredMembers.length} of {totalCount} members {searchQuery && ` matching "${searchQuery}"`}
)} {/* Loading State */} {isLoading ? (No members found
{searchQuery ? `No members match "${searchQuery}"` : memberFilter !== 'all' ? 'No members in this category' : 'No members yet'}