Browse Source

added relay sets to discussions

imwald
Silberengel 5 months ago
parent
commit
16ed4cf74a
  1. 3
      src/pages/primary/DiscussionsPage/ThreadCard.tsx
  2. 77
      src/pages/primary/DiscussionsPage/index.tsx

3
src/pages/primary/DiscussionsPage/ThreadCard.tsx

@ -64,6 +64,9 @@ export default function ThreadCard({ thread, onThreadClick, className }: ThreadC
if (relaySource === 'multiple') { if (relaySource === 'multiple') {
return t('Multiple Relays') return t('Multiple Relays')
} }
if (relaySource === 'unknown') {
return t('Unknown Relay')
}
return relaySource.replace('wss://', '').replace('ws://', '') return relaySource.replace('wss://', '').replace('ws://', '')
} }

77
src/pages/primary/DiscussionsPage/index.tsx

@ -1,5 +1,6 @@
import { Button } from '@/components/ui/button' import { Button } from '@/components/ui/button'
import { Card, CardContent } from '@/components/ui/card' 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 { DEFAULT_FAVORITE_RELAYS, FAST_READ_RELAY_URLS } from '@/constants'
import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider'
import { useNostr } from '@/providers/NostrProvider' import { useNostr } from '@/providers/NostrProvider'
@ -21,7 +22,7 @@ import { kinds } from 'nostr-tools'
const DiscussionsPage = forwardRef((_, ref) => { const DiscussionsPage = forwardRef((_, ref) => {
const { t } = useTranslation() const { t } = useTranslation()
const { favoriteRelays } = useFavoriteRelays() const { favoriteRelays, relaySets } = useFavoriteRelays()
const { pubkey } = useNostr() const { pubkey } = useNostr()
const { push } = useSecondaryPage() const { push } = useSecondaryPage()
const [selectedTopic, setSelectedTopic] = useState('all') const [selectedTopic, setSelectedTopic] = useState('all')
@ -49,10 +50,18 @@ const DiscussionsPage = forwardRef((_, ref) => {
// Memoize relay URLs with deduplication // Memoize relay URLs with deduplication
const relayUrls = useMemo(() => { 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 // Deduplicate and combine relays
return Array.from(new Set([...availableRelays, ...FAST_READ_RELAY_URLS])) return Array.from(new Set([...availableRelays, ...FAST_READ_RELAY_URLS]))
}, [selectedRelay, availableRelays]) }, [selectedRelay, availableRelays, relaySets])
// Available topic IDs for matching // Available topic IDs for matching
const availableTopicIds = useMemo(() => const availableTopicIds = useMemo(() =>
@ -123,10 +132,16 @@ const DiscussionsPage = forwardRef((_, ref) => {
const titleTag = event.tags.find(tag => tag[0] === 'title' && tag[1]) const titleTag = event.tags.find(tag => tag[0] === 'title' && tag[1])
return titleTag && event.content.trim().length > 0 return titleTag && event.content.trim().length > 0
}) })
.map(event => ({ .map(event => {
...event, // Get the relay where this event was actually found
_relaySource: selectedRelay || 'multiple' const eventHints = client.getEventHints(event.id)
})) const relaySource = eventHints.length > 0 ? eventHints[0] : 'unknown'
return {
...event,
_relaySource: relaySource
}
})
setAllThreads(validThreads) setAllThreads(validThreads)
} catch (error) { } catch (error) {
@ -440,19 +455,41 @@ const DiscussionsPage = forwardRef((_, ref) => {
threads={viewMode === 'grouped' && selectedTopic === 'all' ? allThreads : threads} threads={viewMode === 'grouped' && selectedTopic === 'all' ? allThreads : threads}
replies={[]} replies={[]}
/> />
{availableRelays.length > 1 && ( {(availableRelays.length > 1 || relaySets.length > 0) && (
<select <DropdownMenu>
value={selectedRelay || ''} <DropdownMenuTrigger asChild>
onChange={(e) => setSelectedRelay(e.target.value || null)} <Button variant="outline" className="h-10 text-sm">
className="px-3 h-10 rounded border bg-background text-sm" {selectedRelay ? (
> relaySets.find(set => set.id === selectedRelay)?.name ||
<option value="">All Relays</option> selectedRelay.replace('wss://', '').replace('ws://', '')
{availableRelays.map(relay => ( ) : (
<option key={relay} value={relay}> 'All Relays'
{relay.replace('wss://', '').replace('ws://', '')} )}
</option> </Button>
))} </DropdownMenuTrigger>
</select> <DropdownMenuContent>
<DropdownMenuItem onClick={() => setSelectedRelay(null)}>
All Relays
</DropdownMenuItem>
<DropdownMenuSeparator />
{relaySets.map(relaySet => (
<DropdownMenuItem
key={relaySet.id}
onClick={() => setSelectedRelay(relaySet.id)}
>
{relaySet.name}
</DropdownMenuItem>
))}
{availableRelays.map(relay => (
<DropdownMenuItem
key={relay}
onClick={() => setSelectedRelay(relay)}
>
{relay.replace('wss://', '').replace('ws://', '')}
</DropdownMenuItem>
))}
</DropdownMenuContent>
</DropdownMenu>
)} )}
</div> </div>
<div className="flex gap-1 items-center"> <div className="flex gap-1 items-center">

Loading…
Cancel
Save