diff --git a/src/pages/primary/DiscussionsPage/ThreadCard.tsx b/src/pages/primary/DiscussionsPage/ThreadCard.tsx index 66ea58b..db56b59 100644 --- a/src/pages/primary/DiscussionsPage/ThreadCard.tsx +++ b/src/pages/primary/DiscussionsPage/ThreadCard.tsx @@ -64,6 +64,9 @@ export default function ThreadCard({ thread, onThreadClick, className }: ThreadC if (relaySource === 'multiple') { return t('Multiple Relays') } + if (relaySource === 'unknown') { + return t('Unknown Relay') + } return relaySource.replace('wss://', '').replace('ws://', '') } diff --git a/src/pages/primary/DiscussionsPage/index.tsx b/src/pages/primary/DiscussionsPage/index.tsx index 6f7068c..9fe2724 100644 --- a/src/pages/primary/DiscussionsPage/index.tsx +++ b/src/pages/primary/DiscussionsPage/index.tsx @@ -1,5 +1,6 @@ import { Button } from '@/components/ui/button' import { Card, CardContent } from '@/components/ui/card' +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' import { DEFAULT_FAVORITE_RELAYS, FAST_READ_RELAY_URLS } from '@/constants' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { useNostr } from '@/providers/NostrProvider' @@ -21,7 +22,7 @@ import { kinds } from 'nostr-tools' const DiscussionsPage = forwardRef((_, ref) => { const { t } = useTranslation() - const { favoriteRelays } = useFavoriteRelays() + const { favoriteRelays, relaySets } = useFavoriteRelays() const { pubkey } = useNostr() const { push } = useSecondaryPage() const [selectedTopic, setSelectedTopic] = useState('all') @@ -49,10 +50,18 @@ const DiscussionsPage = forwardRef((_, ref) => { // Memoize relay URLs with deduplication const relayUrls = useMemo(() => { - if (selectedRelay) return [selectedRelay] + if (selectedRelay) { + // Check if it's a relay set + const relaySet = relaySets.find(set => set.id === selectedRelay) + if (relaySet) { + return relaySet.relayUrls + } + // It's an individual relay + return [selectedRelay] + } // Deduplicate and combine relays return Array.from(new Set([...availableRelays, ...FAST_READ_RELAY_URLS])) - }, [selectedRelay, availableRelays]) + }, [selectedRelay, availableRelays, relaySets]) // Available topic IDs for matching const availableTopicIds = useMemo(() => @@ -123,10 +132,16 @@ const DiscussionsPage = forwardRef((_, ref) => { const titleTag = event.tags.find(tag => tag[0] === 'title' && tag[1]) return titleTag && event.content.trim().length > 0 }) - .map(event => ({ - ...event, - _relaySource: selectedRelay || 'multiple' - })) + .map(event => { + // Get the relay where this event was actually found + const eventHints = client.getEventHints(event.id) + const relaySource = eventHints.length > 0 ? eventHints[0] : 'unknown' + + return { + ...event, + _relaySource: relaySource + } + }) setAllThreads(validThreads) } catch (error) { @@ -440,19 +455,41 @@ const DiscussionsPage = forwardRef((_, ref) => { threads={viewMode === 'grouped' && selectedTopic === 'all' ? allThreads : threads} replies={[]} /> - {availableRelays.length > 1 && ( - + {(availableRelays.length > 1 || relaySets.length > 0) && ( + + + + + + setSelectedRelay(null)}> + All Relays + + + {relaySets.map(relaySet => ( + setSelectedRelay(relaySet.id)} + > + {relaySet.name} + + ))} + {availableRelays.map(relay => ( + setSelectedRelay(relay)} + > + {relay.replace('wss://', '').replace('ws://', '')} + + ))} + + )}