You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.2 KiB
67 lines
2.2 KiB
import { FAST_READ_RELAY_URLS, FAST_WRITE_RELAY_URLS, SEARCHABLE_RELAY_URLS } from '@/constants' |
|
import { TSearchParams } from '@/types' |
|
import NormalFeed from '../NormalFeed' |
|
import Profile from '../Profile' |
|
import { ProfileListBySearch } from '../ProfileListBySearch' |
|
import Relay from '../Relay' |
|
import TrendingNotes from '../TrendingNotes' |
|
import { useNostr } from '@/providers/NostrProvider' |
|
import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' |
|
import { normalizeUrl } from '@/lib/url' |
|
import { useMemo } from 'react' |
|
|
|
export default function SearchResult({ searchParams }: { searchParams: TSearchParams | null }) { |
|
const { pubkey, relayList } = useNostr() |
|
const { favoriteRelays, blockedRelays } = useFavoriteRelays() |
|
|
|
// Build comprehensive relay list for search (all available relays) |
|
const searchRelays = useMemo(() => { |
|
let relays: string[] = [] |
|
|
|
// User's relays |
|
if (relayList) { |
|
relays.push(...(relayList.read || []), ...(relayList.write || [])) |
|
} |
|
|
|
// User's favorite relays |
|
relays.push(...(favoriteRelays || [])) |
|
|
|
// All default relays |
|
relays.push(...FAST_READ_RELAY_URLS, ...FAST_WRITE_RELAY_URLS, ...SEARCHABLE_RELAY_URLS) |
|
|
|
// Normalize and deduplicate |
|
const normalized = Array.from(new Set( |
|
relays.map(url => normalizeUrl(url) || url).filter((url): url is string => !!url) |
|
)) |
|
|
|
// Filter blocked |
|
return normalized.filter(relay => |
|
!blockedRelays.some(blocked => relay.includes(blocked)) |
|
) |
|
}, [pubkey, relayList, favoriteRelays, blockedRelays]) |
|
|
|
if (!searchParams) { |
|
return <TrendingNotes variant="searchAccordion" /> |
|
} |
|
if (searchParams.type === 'profile') { |
|
return <Profile id={searchParams.search} /> |
|
} |
|
if (searchParams.type === 'profiles') { |
|
return <ProfileListBySearch search={searchParams.search} /> |
|
} |
|
if (searchParams.type === 'notes') { |
|
return ( |
|
<NormalFeed |
|
subRequests={[{ urls: searchRelays, filter: { search: searchParams.search } }]} |
|
/> |
|
) |
|
} |
|
if (searchParams.type === 'hashtag') { |
|
return ( |
|
<NormalFeed |
|
subRequests={[{ urls: searchRelays, filter: { '#t': [searchParams.search] } }]} |
|
/> |
|
) |
|
} |
|
return <Relay url={searchParams.search} /> |
|
}
|
|
|