import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' import { Drawer, DrawerContent, DrawerDescription, DrawerHeader, DrawerTitle, DrawerTrigger } from '@/components/ui/drawer' import { BIG_RELAY_URLS } from '@/constants' import { getReplaceableEventIdentifier } from '@/lib/event' import { tagNameEquals } from '@/lib/tag' import { isWebsocketUrl, simplifyUrl } from '@/lib/url' import { useFavoriteRelays } from '@/providers/FavoriteRelaysProvider' import { useNostr } from '@/providers/NostrProvider' import { useScreenSize } from '@/providers/ScreenSizeProvider' import client from '@/services/client.service' import { TRelaySet } from '@/types' import { CloudDownload } from 'lucide-react' import { Event, kinds } from 'nostr-tools' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import RelaySetCard from '../RelaySetCard' export default function PullRelaySetsButton() { const { t } = useTranslation() const { pubkey } = useNostr() const { isSmallScreen } = useScreenSize() const [open, setOpen] = useState(false) const trigger = ( ) if (isSmallScreen) { return ( {trigger}
{t('Select the relay sets you want to pull')} setOpen(false)} />
) } return ( {trigger} {t('Select the relay sets you want to pull')} setOpen(false)} /> ) } function RemoteRelaySets({ close }: { close?: () => void }) { const { t } = useTranslation() const { pubkey, relayList } = useNostr() const { addRelaySets, relaySets: existingRelaySets } = useFavoriteRelays() const [initialed, setInitialed] = useState(false) const [relaySetEventMap, setRelaySetEventMap] = useState>(new Map()) const [relaySets, setRelaySets] = useState([]) const [selectedRelaySetIds, setSelectedRelaySetIds] = useState([]) useEffect(() => { if (!pubkey) return const init = async () => { setInitialed(false) const events = await client.fetchEvents( (relayList?.write ?? []).concat(BIG_RELAY_URLS).slice(0, 4), { kinds: [kinds.Relaysets], authors: [pubkey], limit: 50 } ) events.sort((a, b) => b.created_at - a.created_at) const relaySetIds = new Set(existingRelaySets.map((r) => r.id)) const relaySets: TRelaySet[] = [] const relaySetEventMap = new Map() events.forEach((evt) => { const id = getReplaceableEventIdentifier(evt) if (!id || relaySetIds.has(id)) return relaySetIds.add(id) const relayUrls = evt.tags .filter(tagNameEquals('relay')) .map((tag) => tag[1]) .filter((url) => url && isWebsocketUrl(url)) if (!relayUrls.length) return let title = evt.tags.find(tagNameEquals('title'))?.[1] if (!title) { title = relayUrls.length === 1 ? simplifyUrl(relayUrls[0]) : id } relaySets.push({ id, name: title, relayUrls }) relaySetEventMap.set(id, evt) }) setRelaySets(relaySets) setRelaySetEventMap(relaySetEventMap) setInitialed(true) } init() }, [pubkey]) if (!pubkey) return null if (!initialed) return
{t('loading...')}
if (!relaySets.length) { return
{t('No relay sets found')}
} return (
{relaySets.map((relaySet) => ( { if (select) { setSelectedRelaySetIds([...selectedRelaySetIds, relaySet.id]) } else { setSelectedRelaySetIds(selectedRelaySetIds.filter((id) => id !== relaySet.id)) } }} /> ))}
) }