index.tsx raw
1 import { ExtendedKind } from '@/constants'
2 import { useStuff } from '@/hooks/useStuff'
3 import { getReplaceableCoordinateFromEvent, isReplaceableEvent } from '@/lib/event'
4 import client from '@/services/client.service'
5 import { TFeedSubRequest } from '@/types'
6 import { Event, Filter, kinds } from 'nostr-tools'
7 import { useEffect, useState } from 'react'
8 import NoteList from '../NoteList'
9
10 export default function QuoteList({ stuff }: { stuff: Event | string }) {
11 const { event, externalContent } = useStuff(stuff)
12 const [subRequests, setSubRequests] = useState<TFeedSubRequest[]>([])
13
14 useEffect(() => {
15 async function init() {
16 const relaySet = new Set(client.currentRelays)
17 const filters: Filter[] = []
18 if (event) {
19 const relayList = await client.fetchRelayList(event.pubkey)
20 relayList.read.slice(0, 5).forEach((url) => relaySet.add(url))
21 const seenOn = client.getSeenEventRelayUrls(event.id)
22 seenOn.forEach((url) => relaySet.add(url))
23
24 const isReplaceable = isReplaceableEvent(event.kind)
25 const key = isReplaceable ? getReplaceableCoordinateFromEvent(event) : event.id
26 filters.push({
27 '#q': [key],
28 kinds: [
29 kinds.ShortTextNote,
30 kinds.LongFormArticle,
31 ExtendedKind.COMMENT,
32 ExtendedKind.POLL
33 ]
34 })
35 if (isReplaceable) {
36 filters.push({
37 '#a': [key],
38 kinds: [kinds.Highlights]
39 })
40 } else {
41 filters.push({
42 '#e': [key],
43 kinds: [kinds.Highlights]
44 })
45 }
46 }
47 if (externalContent) {
48 filters.push({
49 '#r': [externalContent],
50 kinds: [kinds.Highlights]
51 })
52 }
53 const urls = Array.from(relaySet)
54 setSubRequests(filters.map((filter) => ({ urls, filter })))
55 }
56
57 init()
58 }, [event])
59
60 return <NoteList subRequests={subRequests} />
61 }
62