RelayReviewCard.tsx raw
1 import { useSecondaryPage } from '@/PageManager'
2 import { getStarsFromRelayReviewEvent } from '@/lib/event-metadata'
3 import { toNote } from '@/lib/link'
4 import { cn } from '@/lib/utils'
5 import { NostrEvent } from 'nostr-tools'
6 import { useMemo } from 'react'
7 import ClientTag from '../ClientTag'
8 import ContentPreview from '../ContentPreview'
9 import { FormattedTimestamp } from '../FormattedTimestamp'
10 import Nip05 from '../Nip05'
11 import Stars from '../Stars'
12 import { SimpleUserAvatar } from '../UserAvatar'
13 import { SimpleUsername } from '../Username'
14
15 export default function RelayReviewCard({
16 event,
17 className
18 }: {
19 event: NostrEvent
20 className?: string
21 }) {
22 const { push } = useSecondaryPage()
23 const stars = useMemo(() => getStarsFromRelayReviewEvent(event), [event])
24
25 return (
26 <div
27 className={cn('clickable border rounded-lg bg-muted/20 p-3 h-full', className)}
28 onClick={() => push(toNote(event))}
29 >
30 <div className="flex justify-between items-start gap-2">
31 <div className="flex items-center space-x-2 flex-1">
32 <SimpleUserAvatar userId={event.pubkey} size="medium" />
33 <div className="flex-1 w-0">
34 <div className="flex gap-2 items-center">
35 <SimpleUsername
36 userId={event.pubkey}
37 className="font-semibold flex truncate text-sm"
38 skeletonClassName="h-3"
39 />
40 <ClientTag event={event} />
41 </div>
42 <div className="flex items-center gap-1 text-sm text-muted-foreground">
43 <Nip05 pubkey={event.pubkey} append="ยท" />
44 <FormattedTimestamp timestamp={event.created_at} className="shrink-0" short />
45 </div>
46 </div>
47 </div>
48 </div>
49 <Stars stars={stars} className="mt-2 gap-0.5 [&_svg]:size-3" />
50 <ContentPreview className="mt-2 line-clamp-4" event={event} />
51 </div>
52 )
53 }
54