Source identity
| Field | Recorded value |
|---|---|
| Source type | GitHub source |
| Original record | Janady13/llms-txt-hub / apps/web/app/members/member-card.tsx |
| Date | Not specified in source |
| Repository | Janady13/llms-txt-hub |
| Revision | e0f4bf978d4df168369c7601d9c5f5ea89e84377 |
| Branch | main |
| Path or archive member | apps/web/app/members/member-card.tsx |
| Original SHA-256 | 85ae62241644c4a2cf455bc4cb9d60334200e897f7856a9be3779cc7d77fdf4d |
| Git blob SHA | d575fc2342c85e5352f08e1fc9f2628fb724e5b7 |
| Reading-copy SHA-256 | 85ae62241644c4a2cf455bc4cb9d60334200e897f7856a9be3779cc7d77fdf4d |
Recovered source transcript
Download complete source text ↓74 lines · 2.6 KB
import { Avatar, AvatarFallback, AvatarImage } from '@thedaviddias/design-system/avatar'
import { Badge } from '@thedaviddias/design-system/badge'
import { Calendar } from 'lucide-react'
import Link from 'next/link'
import { Card, CardContent } from '@/components/ui/card'
import { getMemberBadgeSync } from '@/lib/member-client-utils'
import type { Member } from '@/lib/member-server-utils'
interface MemberCardProps {
member: Member
userSlug: string
displayName: string
}
/**
* Individual member card component
* Displays member information in a card format
*/
export function MemberCard({ member, userSlug, displayName }: MemberCardProps) {
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 (
<Card className="transition-all hover:border-primary hover:bg-muted/50">
<CardContent className="p-2">
<Link href={`/u/${userSlug}`} className="block text-center space-y-1">
<Avatar className="w-14 h-14 sm:w-16 sm:h-16 mx-auto">
{member.imageUrl ? (
<AvatarImage
src={member.imageUrl}
alt={`${displayName}'s profile picture - llms.txt hub community member`}
/>
) : (
<AvatarFallback className="text-base sm:text-lg">
{displayName.charAt(0).toUpperCase()}
</AvatarFallback>
)}
</Avatar>
<div className="space-y-1">
<h3 className="font-semibold text-base truncate">{displayName}</h3>
{username && <p className="text-sm text-muted-foreground truncate">@{username}</p>}
<div className="flex items-center justify-center">
<Badge variant={badge.variant} className="text-xs px-1.5 py-0.5">
{badge.label}
</Badge>
</div>
</div>
<div className="flex items-center justify-center gap-1.5 text-sm text-muted-foreground">
<Calendar className="w-3.5 h-3.5" />
<span>{joinDate}</span>
</div>
</Link>
</CardContent>
</Card>
)
}