import { Breadcrumb } from '@thedaviddias/design-system/breadcrumb' import { getBaseUrl } from '@thedaviddias/utils/get-base-url' import { Users } from 'lucide-react' import { Suspense } from 'react' import { Card } from '@/components/ui/card' import { getCachedMembers } from '@/lib/member-server-utils' import { generateBaseMetadata } from '@/lib/seo/seo-config' import { MembersList } from './members-list' import { MembersSearch } from './members-search' // Force dynamic rendering since we use searchParams export const dynamic = 'force-dynamic' /** * Generate metadata for the members page * * @returns Metadata object for Next.js */ export async function generateMetadata() { const allMembers = await getCachedMembers() const totalCount = allMembers.length return generateBaseMetadata({ title: `Members (${totalCount})`, description: `Browse ${totalCount} members of the llms.txt Hub community. Connect with developers, creators, and contributors building AI-ready documentation.`, path: '/members', keywords: [ 'llms.txt community', 'AI documentation contributors', 'developer community', 'llms.txt members' ] }) } /** * Empty state component for when no members are found */ function EmptyState({ searchQuery }: { searchQuery: string }) { return (

No members found

{searchQuery ? `No members found matching "${searchQuery}". Try a different search term.` : 'Be the first to join the community!'}

) } export default async function MembersPage({ searchParams }: { searchParams: Promise<{ search?: string; page?: string }> }) { // Await search params in Next.js 15 const params = await searchParams const searchQuery = params.search || '' const page = Number.parseInt(params.page || '1', 10) const limit = 24 // Get all members and filter/search them server-side const allMembers = await getCachedMembers() let filteredMembers = allMembers // Apply search filter if provided if (searchQuery.trim()) { const lowerCaseSearchQuery = searchQuery.toLowerCase().trim() filteredMembers = allMembers.filter(member => { const displayName = member.firstName && member.lastName ? `${member.firstName} ${member.lastName}`.toLowerCase() : (member.firstName || member.lastName || member.username || '').toLowerCase() const username = ( member.username || member.publicMetadata?.github_username || '' ).toLowerCase() return displayName.includes(lowerCaseSearchQuery) || username.includes(lowerCaseSearchQuery) }) } // Calculate pagination const totalCount = filteredMembers.length const startIndex = (page - 1) * limit const endIndex = startIndex + limit const initialMembers = filteredMembers.slice(startIndex, endIndex) return (
{/* Header */}

Community Members

{searchQuery ? `${initialMembers.length} of ${totalCount} members` : `${totalCount} members and growing`}

{/* Client-side search */} {/* Members list with pagination */} {initialMembers.length === 0 ? ( ) : (

{searchQuery ? `Search Results (${totalCount})` : `All Members (${totalCount})`}

} >
)}
) }